MySQL 主主(双主)复制

时间:2022-06-01 18:39:39

MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后*并等待主服务器通知下一次更新。



配置主主同步的操作步骤:
MySQL-A     10.17.1.11
MySQL-B     10.17.1.12
1.     分别在两台机器授权账户:grant replication slave, file, select on *.* to 'repl'@'10.17.%' identified by ‘xxxx’ 
备注:如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限。


2.     配置文件/etc/my.cnf,在使用主库配置文件的基础上,加入以下配置项
MySQL-A     MySQL-B

log-bin=mysql-bin log-bin=mysql-bin
server-id=1 server-id=2
binlog-do-db=TestXXX binlog-do-db=TestXXX
binlog-ignore-db=mysql binlog-ignore-db=mysql
replicate-do-db=TestXXX replicate-do-db=TestXXX
replicate-ignore-db=mysql replicate-ignore-db=mysql
log-slave-updates log-slave-updates
slave-skip-errors=all slave-skip-errors=all
auto_increment_increment=2 auto_increment_increment=2
auto_increment_offset=1 auto_increment_offset=2



备注:
log-slave-updates是为从库的写操作记录binlog
多主互备和主从复制有一些区别,因为多主中的各个库,都可以对服务器有写权限,所以设计到自增长重复问题


模拟出现的问题(多主自增长ID重复)
  • 假如我们在AB都建立一张test表,表中有一个auto increment的字段
  • 停掉A的同步,在B上对数据表test(存在自增长ID)执行插入操作,返回插入ID为1
  • 然后停掉B的同步,在A上对数据表test(存在自增长ID)执行插入操作,返回的插入ID也是1
  • 然后同时启动A,B,就会出现主键ID重复


解决方法:
我们只要保证两台服务器上插入的自增长数据不同就可以了
如:A插入奇数ID,B插入偶数ID,当然如果服务器多的话,你可以定义算法,只要不同就可以了


在这里我们在A,B上加入参数,以实现奇偶插入


A:my.cnf上加入参数
auto_increment_increment=2
auto_increment_offset=1




这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了


B:my.cnf上加入参数
auto_increment_increment=2
auto_increment_offset=2




这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了
可以看出,你的auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当然,你还可以使用3台,4台,或者N台服务器,只要保证auto_increment_increment = N 再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID重复。
         
3.     重启MySQL读取新的配置文件,进入MySQL后,用change master命令进行同步即可。