文章目录
一、全库同步
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.
出错原因是日志文件出错
,可以通过以下办法解决:
- 找到出现错误的主库或从库 Files—> /etc/my.cnf
- 先注释掉主从集群相关的配置,使得Docker下的 项目能正常启动
- 找到 Files—> /var/lib/mysql
- 根据MySQL关闭的时间查看最新的数据文件是哪个,然后将它删除即可,如若无法直接删除,可直接删掉 master-bin.index 中最新的记录即可
- 解开上述,注释掉的主从集群配置
总结
以上是基于Docker 实现 MySQL 主从复制架构的各种情况,希望对你们有所帮助。