Mysql主主复制
主主复制有两种模式,主备复制模式和主主复制模式,建议使用主备复制模式,因为主主模式可能会产生数据冲突而造成复制链路中断。本篇主要讲主备复制模式。
注意:主备数据库需要采用相同的mysql版本,以免因版本差异出现问题
注意:某些参数配置后需要重启服务器才能生效,建议上线之前都把主从复制参数配置好
主备复制模式
主备复制模式中只有一台会对外提供服务,只有对外提供服务的机器不可用时,另一台才会对外提供服务。
- 注意事项
1.只有一台主服务能对外提供服务,另一台主服务处于只读状态并且只作为热备使用
2.在对外提供服务的主库出现故障或是计划性维护时才会进行切换
3.使用原来的备库作为主库,而原来的主库需设置成新的备库,同时需设置为只读或下线状态,待维护完成后再重新上线
4.两台服务器上的初始数据需相同
5.两台服务器都需要启动binlog,并配置不同的server_id
6.两台服务器上都要启用log_slave_updates参数
7.备库在初始化时需启用read_only
8.需修改两个库的自增参数
主主复制模式
主主复制模式中,两台都会对外提供服务,这种模式并不会分担主库的写负载, 因为无论写到哪一个主服务上,都会复制到另一个主服务上重新执行,所以这种模式并不能分担写负载。因为主主模式可能会产生数据冲突而造成复制链路中断,.不建议使用主主复制模式 。
如何避免数据冲突?
1.两个主服务中最好存放不同的表 ,这样一个表只在一个库中能很好的避免冲突
2.修改自增ID的生成方式,因为有两台主服务,所以自增量可以设置为2,一个起始点设为1,
另一个设为2,这样生成的id就不会冲突,对应的设置参数如下:
主服务1:会生成1,3,5,7,9…
auto_increment_increment = 2
auto_increment_offset =1
主服务2:会生成2,4,6,8,10…
auto_increment_increment = 2
auto_increment_offset =2
主备复制模式架构图
下面是主备复制的灵魂示意图,该架构下,同一时间只有一个主库可提供服务,另一台主库作为热备使用。
如下图,当主1不可用时,会切换到主2作为主库提供服务,主1作为备库,同时所有从库重新和主2建立主从复制关系。
主备复制模式流程
说明:本篇复制是基于二进制日志的
- 两个主库都需开启binlog日志,记录所有修改操作到binlog日志文件中
- 两个库的IO进程相互读取对方的binlog日志并存到该从库的中继日志Relay log中
- mysql会开启一个sql线程,定时读取Relay log日志,如果发现有更新会立即把更新的内容在本机的数据库上面执行一遍
配置主备复制模式步骤
一、配置主备复制参数
二、在主库上创建用于复制的账号
三、对主库上的数据进行全备
四、对备库上的数据进行初始化,使主备数据一致
五、启动备库对主库的复制链路
六、启动主库对备库的复制链路
一、配置主备复制参数
配置主库服务
编辑/etc/my.cnf文件,修改和添加配置,然后重启服务
注意:如果是mysql5.7及以上版本,还需查看auto.cnf下server-uuid的是否一样,如果一样主从复制会出现问题,需删除掉server-uuid,然后重启服务重新生成server-uuid,auto.cnf存储的路径可能不同,我的路径在/var/lib/mysql/
- 编辑/etc/my.cnf文件
vim /etc/my.cnf
- 修改和添加配置
#每台服务的server_id都不能一样,建议server_id设置成ip的最后一段
server_id = 118
#master意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突
#修改自增ID的生成方式,因为有两台主服务,所以自增量可以设置为2,一个起始点设为1,另一个设为2,这样生成的id就不会冲突
#会生成1,3,5,7,9..
auto_increment_increment