我在两个 master 上运行 Percona MySQL 5.5.39,keepalived 监控一个 VIP,如果主 master 变暗,它将故障转移到备用 master。在实验室中测试我的设置的容错性时,我注意到我在两个主机上都得到了重复的密钥条目。
基本上我运行 siege 来模拟用户负载,持续 5 分钟,在这段时间内我关闭了主主机,在大约 10 秒后让 keepalived 检测到中断,VIP 切换到备用主机,此时一切正在按预期工作。然后大约一分钟后,当 siege 仍在运行时,我打开主 master 电源,当它在线时,它假定为 VIP。
我认为在交换 VIP 期间会出现重复条目问题。我按照这篇文章解释了如何实现“崩溃恢复”复制,但是在实现了建议的 my.cnf 更改并重新运行用户模拟之后,我最终得到了同样的损坏复制。
备用主机还可以将其索引增加 2 而不是 1,以避免与主主机发生冲突,但我觉得这更像是一种破解而不是解决方案。
有没有更好的方法来避免 HA 环境中的主键冲突?
这不是黑客攻击。这是他们的意图:使用
auto_increment_increment
和auto_increment_offset
http://dev.mysql.com/doc/refman/5.6/en/replication-options-master.html#sysvar_auto_increment_increment
您的架构不适合异步复制。我强烈建议不要在全自动系统中运行 Master-Master 标准复制,因为您将遇到您所描述的问题。
虽然您可能不会同时写入两台服务器,但您以非同步方式复制的事实意味着您必须考虑诸如发送到从属服务器的待处理写入或应用到它的待处理写入等问题本地。在这种情况下,自动故障转移并不容易或微不足道,更不用说切换回了。
有些事情可以帮助您做到这一点:
这
auto_increment_increment
可以解决节点之间的插入冲突,但不能解决不同节点之间的更新或由于二进制日志不匹配而在同一节点中两次插入相同查询。没有正确的答案,但错误的答案很多。我赞扬您的方法(即使最终产品不正确):测试,测试和测试,如果您想要符合您要求的东西。
如果您觉得这是一个 hack,请尝试 PXC(Percona XtraDB Cluster)。
PXC 使用 Galera Cluster(由 Codership 提供),它是与 InnoDB 的同步复制。