当前位置: 首页 > news >正文

不停服务快速创建一个MySQL从库

记录一下,方便后面查看使用

目录

  • 一、环境说明
  • 二、准备工作
  • 三、创建从库
  • 四、开始复制
    • 1. 从库安装克隆插件
    • 2. 主库创建必要账户
    • 3. 从库克隆当前主库数据
    • 4. 从库上配置主从关系
    • 5. 设置从库为只读
  • 后记

一、环境说明

  1. Linux,Docker环境
  2. MySQL版本为 8.0.22
  3. 已经有一个主节点且处于生产环境

现在需要快速创建一个从库节点,服务环境规划如下:

服务地址端口说明
192.168.30.2103309主库
192.168.30.2113309准备要创建的从库

二、准备工作

  1. 确保主库已经开启binlog功能
  2. 确保主库已经开启 gtid_mode
  3. 确保主库从库配置文件中的 service_id不一样
[mysqld]server-id = 112
log-bin=mysql-binbinlog_format = ROW
binlog_row_image = FULL
binlog_expire_logs_seconds = 1209600
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_slave_updates
relay_log_recovery = 1
slave_skip_errors = ddl_exist_errors
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1gtid_mode = on
  1. 确认从库服务上端口 3309 33060没有被占用(33060是 mysqlx_port )
    33060端口不会影响MySQL服务启动,但是后台会有错误日志提示
    可以修改my.cnf 替换该端口
[mysqld]
# X Plugin 监听端口(默认 33060)
mysqlx_port=33060

三、创建从库

这里因为是docker环境,因此使用镜像快速创建:

docker run -u root \--cap-add=SYS_NICE \--network=host \--restart=always \--name mysql8 \-v /data/apps/mysql/conf/my.cnf:/etc/mysql/my.cnf \-v /data/apps/mysql/files:/var/lib/mysql-files \-v /data/apps/mysql/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=YourPassword123456 \-d mysql:8.0.22

这里做了磁盘文件目录映射,

  1. /data/apps/mysql/conf/my.cnf 配置文件映射
  2. /data/apps/mysql/files 一些扩展文件目录
  3. /data/apps/mysql/data 主数据目录

启动完毕后,从库目前为一个空的干净的数据库,无需做其他工作,下面准备开始复制工作。

四、开始复制

1. 从库安装克隆插件

连接上从库,或者直接客户端打开一个查询界面即可,执行如下SQL:

INSTALL PLUGIN clone SONAME 'mysql_clone.so';

查看已经安装的MySQL插件

SHOW PLUGINS;

建议:主库也一并安装该插件,考虑后面可以配置双主

2. 主库创建必要账户


CREATE USER 'clone_user'@'%' IDENTIFIED WITH mysql_native_password BY 'YourPassword123456';GRANT BACKUP_ADMIN, CLONE_ADMIN ON *.* TO 'clone_user'@'%';CREATE USER 'rep_user'@'%' IDENTIFIED WITH mysql_native_password BY 'YourPassword123456';GRANT REPLICATION SLAVE ON *.* TO 'rep_user'@'%';FLUSH PRIVILEGES;
  1. clone_user用于从库克隆主库data目录的文件连接使用
  2. rep_user用户从库配置主从关系使用

3. 从库克隆当前主库数据

设置克隆白名单:

SET GLOBAL clone_valid_donor_list = '192.168.30.210:3309,192.168.30.211:3309';

这是在 MySQL 中为 Clone 插件设置允许的 donor(捐赠者)列表。只有列在该白名单中的主机:端口才被允许作为克隆数据源(donor)向当前实例提供克隆服务。

开始克隆

CLONE INSTANCE FROM 'clone_user'@'192.168.30.210':3309 IDENTIFIED BY 'YourPassword123456';

… 需要等待一会,速度类似于SCP远程拷贝

4. 复制完成后,MySQL实例自动关机重启

…稍等一会,如果没有错误可以直接使用主库上的账户密码登录从库

4. 从库上配置主从关系

CHANGE MASTER TOMASTER_HOST='192.168.30.210',MASTER_USER='rep_user',MASTER_PORT=3359,MASTER_PASSWORD='YourPassword123456',MASTER_AUTO_POSITION=1;START SLAVE;

查看复制状态

SHOW SLAVE STATUS;

如果是8.0.23以及以上版本可以使用如下命令:

CHANGE REPLICATION SOURCE TOSOURCE_HOST='192.168.30.210',SOURCE_USER='rep_user',SOURCE_PORT=3309,SOURCE_PASSWORD='YourPassword123456',SOURCE_AUTO_POSITION=1;START REPLICA;

查看复制状态

SHOW REPLICA STATUS;

一般查询状态的结果字段中的 Replica_SQL_Running_State 有如下信息:
Slave has read all relay log; waiting for more updates
基本上主从关系配置成功.

如果不成功,则先停止复制,处理结束后重新按照上面步骤再次配置主从复制。
关闭复制命令如下:

STOP  REPLICA;

或者

STOP SLAVE;

5. 设置从库为只读

如果你希望从库不要被人为污染,则可以开启严格的只读模式:


SET GLOBAL read_only = ON;SET GLOBAL super_read_only = ON;
  1. read_only=ON 会禁止普通用户写操作,但拥有 SUPER、REPLICATION SLAVE 或某些高权限的用户仍可写入.
  2. super_read_only 是在 MySQL 5.7.8 引入的,用以提供比 read_only 更严格的只读保护,即使是具备 SUPER 权限的用户也无法写入.
  3. 开启这两个参数,不会影响主从复制线程写入数据.

后记

到此为止,不停服务快速创建一个MySQL从库工作全部完成,如果你希望配置是双主复制,则在主库上做上面从库做的事情即可,然后还要配置 keepalived 是MySQL的双主高可用。

使用 keepalived 实现MySQL双主高可用,强烈建议使用双主单活模式(全部用户连接连接到某一台服务器上,另外一台作为备机)

例如keepalived 主节点上配置如下:192.168.30.200为虚拟IP

vrrp_script check_3309port {script "/usr/local/bin/check_3309port.sh"interval 2weight -3
}vrrp_instance VI_2 {state MASTERinterface em1virtual_router_id 55priority 101nopreemptadvert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.30.200}track_script {check_3309port}
}

keepalived 从节点上配置如下:

vrrp_script check_3309port {script "/usr/local/bin/check_3309port.sh"interval 2weight -3
}vrrp_instance VI_2 {state BACKUPinterface em1virtual_router_id 55priority 99advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.30.200}track_script {check_3309port}
}

注意:
主节点上有一个配置参数 nopreempt 这个参数作用如下:
当主节点宕机后,备节点接管MySQL服务,原节点再次上线后将不会抢占当前备节点的服务。

为什么要这么配置,因为你想,如果主节点宕机了好几天才发现,此时原主节点上线了,如果抢占了当前的MySQL服务,那现场生产环境可能直接不一致,直至崩溃!

http://www.dtcms.com/a/419543.html

相关文章:

  • C# 使用应用RSA和ECC进行数字签名和签名验证
  • 靖江做网站的网站建设可行性研究报告
  • 建设部网站怎么查询相关专业国家开发银行app下载
  • Java Web工程(不使用Spring框架)
  • Java:类和对象(二)
  • pytorch入门学习
  • AMD KFD的BO设计分析系列5-1:kgd_mem 实现详解
  • 大模型-Layer Normalization
  • 内存PE加载器:一种绕过EDR检测的无文件攻击技术
  • 做电商网站报价域名网站排名
  • 网站项目需要什么简洁大方网站建设
  • VideoMimic复现(1):环境搭建(real2sim+simulation)
  • 关于STM32单片机编程中大量使用全局变量而非使用函数调用的一些思考
  • pc端网站开发房地产网
  • nginx中root和alias
  • JMeter 执行流程
  • 网站开发设计与实现云南楚雄网
  • Go 语言中映射(Map)使用场景
  • Go 中实现“面向对象”
  • 富阳做网站广州专业做网站多少钱
  • 威海网站开发公司电话手机软件怎么做出来的
  • 企业系统有哪些南通网站流量优化
  • nginx 的root跟alias的区别
  • 到底什么是智能网联汽车??第三期——汽车总线及车载网络系统
  • 网站做跳转影响排名吗wordpress在线考试插件
  • 网站开发行业推广网站开发合同是否专属管辖
  • 网站建设招聘启事太原城市建设招标网站
  • 做淘宝客为什么要做网站wordpress中文清爽博客主题:jishuzh主题分享
  • Vue表格多选后,将勾选数据返现到弹框中列表,部分数据出现丢失情况
  • CKAD-CN 考试知识点分享(16) 修改 container 名称