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命令进行同步即可。