要让mysql实现真正可用的多主复制,必须关闭read_only与super_read_only、设group_replication_consistency=after、启用write_set冲突检测,并确保≥3奇数节点;否则写入报错或静默回滚。

要让 MySQL 实现真正可用的多主复制,不能只装插件、开组复制就完事。核心在于三件事:解除只读限制、启用冲突检测机制、确保法定节点数。否则写入会直接报错或静默回滚,看似连上了,实际无法并发写。
必须关闭只读限制
所有节点默认继承 read_only=ON 和 super_read_only=ON,这是多主写入的第一道拦路虎。不关掉,INSERT/UPDATE 一律返回 ERROR 1290。
- 执行:
SET PERSIST read_only = OFF;和SET PERSIST super_read_only = OFF; - 验证:
SELECT @@read_only, @@super_read_only;结果必须是0, 0 - 注意:
SET GLOBAL不持久,重启即失效;PERSIST才写入mysqld-auto.cnf
启用 WRITE_SET 冲突检测
MGR 多主靠写集(write set)识别并发冲突,不是靠主键或唯一索引,而是靠事务修改的行哈希值。没配对,两个节点同时改同一行,谁先提交成功谁后失败,应用层完全感知不到。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 确认
binlog_format = ROW(必须,语句级复制无法生成写集) - 确认
transaction_write_set_extraction = XXHASH64(MySQL 8.0.2+ 默认,但建议显式写上) - 表必须有主键(无主键表无法生成准确写集,MGR 会拒绝加入组)
配置 group_replication_consistency=AFTER
这个参数决定“事务成功”到底意味着什么。设为 AFTER,才真正实现强一致性:本地 commit 前,必须确保多数节点已完成 apply(不只是收到 relay log)。否则可能出现刚写完就查不到,或主切后读到旧数据。
- 执行:
SET PERSIST group_replication_consistency = 'AFTER'; - 验证:
SELECT VARIABLE_VALUE FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'group_replication_consistency'; - 别用
BEFORE_AND_AFTER:多主下极易超时、死锁,金融和高并发场景禁用
法定节点与启动顺序
多主模式要求至少 3 个节点,且数量为奇数(3、5、7),才能通过 Paxos 投票达成多数派共识。少于 3 个节点无法容忍任何故障,等于 2 个节点存在脑裂风险。
- 所有节点
server_id、server_uuid必须唯一 - 首个节点启动时需临时启用
group_replication_bootstrap_group=ON,创建初始组,之后立即设为OFF -
loose-group_replication_group_seeds列出全部节点地址,新节点靠它发现集群 - 启动后检查:
SELECT * FROM performance_schema.replication_group_members;状态必须全为ONLINE










