基于Docker 实现 MySQL 主从复制架构详解


一、全库同步

1.创建容器

// 主库
docker run -d --name mysql-master -p 3339:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

// 从库
docker run -d --name mysql-slave -p 3340:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

2.在Docker Desktop 中添加以下设置

  • 主库文件配置 Files—> /etc/my.cnf
[mysqld]
server-id=47
#开启binlog
log_bin=master-bin
log_bin-index=master-bin.index
# 设置连接端口
# port=3339
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
# mysql_native_password
default_authentication_plugin=mysql_native_password
  • 配置添加完成后重启查看 Files—> /var/lib/mysql 下是否生成以下类型文件

在这里插入图片描述

  • 从库文件配置 Files—> /etc/my.cnf
[mysqld]
#主库和从库需要不一致
server-id=49
#打开MySQL中继日志
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#设置只读权限
#read-only=1
#打开从服务二进制日志
#log-bin=mysql-bin
log-bin=mysql-relay
#使得更新的数据写进二进制日志中
log-slave-updates=1
# 设置3306端口
#port=3340
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8  
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password

3. 配置主从

  • 步骤一,查看主库状态

在这里插入图片描述

  • 步骤二,按照图片流程,在从库中配置主库信息
#设置同步主节点:
CHANGE MASTER TO
MASTER_HOST='172.16.10.132',
MASTER_PORT=3339,
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='master-bin.000004',
MASTER_LOG_POS=156,
GET_MASTER_PUBLIC_KEY=1;
#开启slave
start slave;
#查看主从同步状态
show slave status;

图示:

在这里插入图片描述

二、部分同步

1.修改Master端

  • 在my.cnf中,可以通过以下这些属性可指定需要针对哪些库或者哪些表记录binlog
#需要同步的二进制数据库名
binlog-do-db=masterdemo
#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
#不需要同步的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=performation_schema
binlog-ignore-db=sys

2.修改Slave端

  • 在my.cnf中,需要配置备份库与主服务的库的对应关系
#如果salve库名称与master库名相同,使用本配置
replicate-do-db = masterdemo
#如果master库名[mastdemo]与salve库名[mastdemo01]不同,使用以下配置[需要做映射]
replicate-rewrite-db = masterdemo -> masterdemo01
#如果不是要全部同步[默认全部同步],则指定需要同步的表
replicate-wild-do-table=masterdemo01.t_dict
replicate-wild-do-table=masterdemo01.t_num

三、互主架构

上述的操作,反向配置一次即可,主库配置一遍从库属性,从库配置一边主库的属性


四、半同步复制集群

MySQL的主从集群,互主集群,存在一个隐患,就是有可能会丢数据。

MySQL主从集群默认采用的是一种异步复制的机制。主服务在执行用户提交的事务后,写入binlog日志,然后就给客户端返回一个成功的响应了。而binlog会由一个dump线程异步发送给Slave从服务。由于这个发送binlog的过程是异步的。主服务在向客户端反馈执行结果时,是不知道binlog是否同步成功了的。这时候如果主服务宕机了,而从服务还没有备份到新执行的binlog,那就有可能会丢数据。

所以此时就需要使用 半同步复制集群,搭建流程如下:

1.通过Navicat ,在主服务,安装semisync_master模块

#登陆主服务,安装semisync_master模块
install plugin rpl_semi_sync_master soname 'semisync_master.so';
#查看是否安装成功
show global variables like 'rpl_semi%';
#开启半同步
set global rpl_semi_sync_master_enabled=ON;

在这里插入图片描述

2.通过Navicat ,在从服务,安装smeisync_slave模块

#登陆从服务,安装smeisync_slave模块
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
#查看是否安装成功
show global variables like 'rpl_semi%';
#开启半同步
set global rpl_semi_sync_slave_enabled = ON;
#重启从服务
stop slave;
start slave;

五、可能出现的错误

当docker突然崩溃,或者停电等某些不可抗力因素出现时,可能会导致,主库或从库重启失败报一下错误

Binlog has bad magic number; It’s not a binary log file that can be used by this version of MySQL.Can’t init tc log.

出错原因是日志文件出错,可以通过以下办法解决:

  1. 找到出现错误的主库或从库 Files—> /etc/my.cnf
  2. 先注释掉主从集群相关的配置,使得Docker下的 项目能正常启动
  3. 找到 Files—> /var/lib/mysql
  4. 根据MySQL关闭的时间查看最新的数据文件是哪个,然后将它删除即可,如若无法直接删除,可直接删掉 master-bin.index 中最新的记录即可
  5. 解开上述,注释掉的主从集群配置

总结

以上是基于Docker 实现 MySQL 主从复制架构的各种情况,希望对你们有所帮助。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
基于DockerMySQL主从数据库配置需要完成以下步骤: 1. 启动Master(主)容器:使用命令`docker run -p 3306:3306 --name main_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7`启动一个MySQL容器,并设置容器名称为main_mysql,密码为123456。 2. 连接到Master(主)容器:使用命令`docker exec -it main_mysql bash`进入Master(主)容器的命令行界面。 3. 配置Master(主):在Master(主)容器内部,编辑MySQL配置文件`my.cnf`,将`bind-address`设置为Master(主)容器的IP地址。 4. 重启Master(主)容器:使用命令`docker restart main_mysql`重启Master(主)容器使配置生效。 5. 启动Slave(从)容器:使用命令`docker run -p 3340:3306 --name slave_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7`启动一个MySQL容器,并设置容器名称为slave_mysql,密码为123456。 6. 连接到Slave(从)容器:使用命令`docker exec -it slave_mysql bash`进入Slave(从)容器的命令行界面。 7. 配置Slave(从):在Slave(从)容器内部,编辑MySQL配置文件`my.cnf`,将`bind-address`设置为Slave(从)容器的IP地址,并添加以下配置: ``` server-id = 2 relay-log = /var/lib/mysql/mysql-relay-bin relay-log-index = /var/lib/mysql/mysql-relay-bin.index log_slave_updates = 1 ``` 8. 重启Slave(从)容器:使用命令`docker restart slave_mysql`重启Slave(从)容器使配置生效。 9. 在Slave(从)容器内部执行以下命令连接到Master(主)容器并设置复制: ``` CHANGE MASTER TO MASTER_HOST='<Master(主)容器的IP地址>', MASTER_USER='root', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0; ``` 10. 启动复制:在Slave(从)容器内部执行命令`START SLAVE;`启动主从复制。 11. 检查主从复制状态:在Slave(从)容器内部执行命令`SHOW SLAVE STATUS\G;`,确保"Slave_IO_Running"和"Slave_SQL_Running"都为"YES",表示主从复制已成功配置。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值