概述
mysql双主配置很简单,似乎大家都只关心他的安装和部署,大家可以用他来做双活的方案,并没有深刻的思考过生产环境后续管理的风险和如何规避这些问题。
配置重点
1. 配置文件
log-slave-updates = true
auto_increment_offset = 1 #另外一个主B是2,其他一样。
auto_increment_increment = 2
replicate-ignore-db = mysql
replicate-ignore-db = sys
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = undolog
replicate_wild_ignore_table = mysql.%
replicate_wild_ignore_table = sys.%
replicate_wild_ignore_table = information_schema.%
replicate_wild_ignore_table = performance_schema.%
replicate_wild_ignore_table = undolog.%
2. 其他配置,如果是生产环境改造的话,需要特别注意
- service_id当然不能一样。
- masterB是用masterA的xtrabackup备份恢复生成。 mysqldump默认参数其实很不到位的,当然大部分情况mysqldump没啥问题。但是如果有下面的问题的话,mysqldump要慎用:
(1) .你刚好有存储过程,mysqldump需要加另外的参数。
(2) .你刚好不是utf8mb4,原库要支持表情,然后mysqldump刚好默认是utf8的话,就没有了。
(3). 你在调试的是生产环境,加--master-data=2来记录binlog点,锁表业务就会找上门来。 - binlog这些当然是两边都要开
管理上需要注意的问题
1. 不要发放DDL账号,避免开发人员自行变更数据库表结构,导致1167错误
双主如果一边更新表结构,一边在写入,即使你认为你的的sql没有问题。但是mysqlbinlog的写入日志不是这样的,比如row格式,需要回放的日志如下下面,你修改表结构之前是可以插入的,中间查多一列的话,你的列对不上了,导致1167错误。目前有两种办法可以规避这个问题:
- 这种表结构更新可以锁表,不让另外一边写入再执行。
- 还有一种办法是列只可以在最后加列,要有默认值。这样即使表结构发生了变更,中继日志还是可以回放的。不至于双主同步报错。
2. 双主有忽略库
如果忽略了一些库,比如mysql的库,创建账号的时候,就需要两边创建。