![服务器停止轮换时 Percona XtraDB Cluster 出现重复键](https://linux22.com/image/638476/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%81%9C%E6%AD%A2%E8%BD%AE%E6%8D%A2%E6%97%B6%20Percona%20XtraDB%20Cluster%20%E5%87%BA%E7%8E%B0%E9%87%8D%E5%A4%8D%E9%94%AE.png)
我有一个三节点 Percona XtraDB Cluster (5.5) 设置。
每天晚上,我们都会关闭一个随机选择的节点上的 MySQL,以便备份数据目录。
当我们的流量相当繁忙时,这会导致几个(2-4)错误警报,类似于SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '140577' for key 'PRIMARY'
。显然,主键冲突,除非我们auto_increment
在这些表上使用列作为主键。由于每个节点都有由集群引擎分配的偏移量,因此不应该发生这种情况。
我怀疑将节点移出集群会导致其他两个节点更改其自动增量偏移量,从而导致它们在更改时可能发生冲突。我不知道为什么这不是一个原子操作,也不知道如何修复它。
有人遇到过这种情况吗?有没有办法暂时冻结集群中的自动增量设置,以便它们在备份过程中不会乱序,或者还有其他我没有想到的解决方案?
答案1
我首先想到的是将从属节点添加到组合中,并在无需从集群中删除节点的情况下在从属节点上完成备份。
发生的情况是,当您将节点放回时,它不知道在设法获得新的写入之前主键在活动节点上的数量如何增加,因为它在赶上其他两个副本之前不会冷却下来。因此,它会写入新记录并为其提供一个主键 ID,该 ID 已存在于两个未出局的副本上。本质上,节点在同步之前不应接收写入。
答案2
我知道这是一篇旧帖子,你可能已经这样做了,但对于使用 PXC (Percona XtraDB Cluster) 看到这种行为的人来说,似乎你遇到了错误https://bugs.launchpad.net/percona-xtradb-cluster/+bug/1366997
将 PXC 更新至您当前使用的最新版本。例如,如果您使用的是 5.5.19,则更新至最新的 5.5 更新。如果您使用的是 5.6.x,则升级至最新更新。
在生产中遇到了这个问题。