主 - 主复制重复条目错误

gij*_*007 3 mysql replication mysql-5.6 master-master-replication

我有一个 Master - Master 复制设置,它可以正常工作几天,但我不断收到:几天后出现重复输入错误。

我的设置如下:荷兰的一台服务器和华盛顿特区的一台服务器都运行 Windows Server 2012 R2 和 MySQL 5.6.15 X64。

我遵循了本教程

我的my.ini文件包含以下内容:

荷兰服务器

server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
log_bin=mysql-bin
log_error=mysql-bin.err
binlog_do_db=joomlatest
binlog_do_db=sapp
binlog_do_db=tcadmin
binlog_do_db=whmcs
Run Code Online (Sandbox Code Playgroud)

华盛顿特区服务器

server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
log_bin=mysql-bin
log_error=mysql-bin.err
binlog_do_db=joomlatest
binlog_do_db=sapp
binlog_do_db=tcadmin
binlog_do_db=whmcs
Run Code Online (Sandbox Code Playgroud)

两台服务器都不断停止从站,并且都报告相同的内容:重复输入错误。例如:

查询中的键“PRIMARY”的错误“重复条目“4353”。

我怎样才能防止这种情况发生?

Shl*_*ach 8

您链接的教程恐怕非常乐观。它忘记注意,它仅涵盖自动生成的AUTO_INCREMENT PRIMARY KEY.

它建议的方法不涵盖 a 的一般情况UNIQUE KEY,当然包括一般PRIMARY KEY

文章确实提到“复制最常见的问题是主键冲突”。然后它完全没有提到所有其他问题......

因此,无论如何,任何UNIQUE KEY冲突都会使您的复制中断,可能是双向的。

哪个表使您的复制失败?那是一个带有AUTO_INCREMENT PRIMARY KEY或“常规”的表PRIMARY KEY(即在非AUTO_ICNREMENT列上)?

要解决唯一键的一般情况,您的应用程序必须非常了解其位置(荷兰或华盛顿特区),并且必须避免写入可能导致冲突的数据。或者,它可能想使用一些同步/锁定机制;这当然会导致延迟,因为数据必须跨越大西洋。

可能我还建议使用binlog_do_db也是幼稚和危险的。您确定不想复制mysql架构吗?添加新模式时会发生什么?一般正确的解决方案是在没有过滤的情况下进行完整复制,或者有一个很好的解释为什么不这样做。

最后,我强烈反对使用主动-主动主-主复制。我过去有客户使用它。由于这种设置,他们遇到了很多麻烦,尽管我提出了反对意见,但导致许多周末和假期都毁了。

你可能想看看Galera replication。这是一个同步主复制解决方案,我听说它可以通过 WAN 工作。这将使您的应用程序保持无知。注意网络故障,因为您的集群的一部分将变得不可变。