对于我目前的项目,我们正在考虑为地理上分离的设置设置双主复制拓扑;美国东海岸的一个数据库和日本的另一个数据库。 我很好奇是否有人试过这个以及有过经验的人。

另外,我很好奇我解决这个问题的其他选择是什么;我们正在考虑消息队列。

谢谢!

有帮助吗?

解决方案

请注意您的计划的技术方面:您必须知道MySQL 不正式支持多主复制(只有MySQL Cluster提供对同步复制的支持)。

但至少有一个“黑客”。即使使用正常的MySQL复制设置,也可以实现多主复制。有关可能的解决方案,请参阅Patrick Galbraith的“MySQL Multi-Master Replication”。我对此设置没有任何经验,所以我不敢判断这种方法的可行性。

其他提示

在地理位置复制数据库时,需要考虑几件事情。如果出于性能原因而这样做,请确保您的复制模型支持您的数据“最终一致”。因为复制电流在两个或多个位置都需要时间。如果位置之间的吞吐量或响应时间不佳,则主动复制可能不是最佳选择。

将mysql设置为双主机确实在正确完成的正确方案中正常工作。但我不确定它在你的场景中非常适合。

首先,mysql中的双主设置实际上是一个响铃设置。服务器A被定义为B的主服务器,而B同时被定义为A的主服务器,因此两个服务器都充当主服务器和从服务器。复制通过发送包含sql语句的二进制日志来工作,这些语句是从属服务器在其认为合适时插入的,通常是立即执行的。但是,如果你用局部插入来敲击它,那么需要一段时间才能赶上。顺便说一下,从属插入是顺序的,因此您不会从多个核心等获得任何好处。

双主mysql的主要用途是在服务器级别上具有自动故障转移的冗余(通常在linux上使用hearbeat)。排除mysql-cluster(由于各种原因),这是mysql唯一可用的自动故障转移。可以在 google 上轻松找到基本双主机的设置。心跳的东西是多一点工作。但这并不是你所要求的,因为它确实表现为单个数据库服务器。

如果你想要双主设置,因为你总是想写一个本地数据库(同时写入它们),你需要记住你的应用程序。您永远不能在数据库中具有自动递增值,并且当您具有唯一值时,必须确保这两个位置永远不会写入相同的值。例如,位置A可以写出奇数唯一数字,而位置B甚至可以写出唯一数字。原因是您无法保证服务器在任何给定时间都处于同步状态,因此如果您在A中插入了唯一的行,然后在第二台服务器赶上之前在B中插入了重叠的唯一行,那么您将会有一个破碎的系统。如果某些事情首先破裂,整个系统就会停止。

总结一下:这是可能的,但如果您正在构建商业软件,那么您需要非常仔细地小心翼翼。

由于MySQL复制的一对多体系结构,您必须拥有一个包含多个主服务器的复制环:也就是说,每个主服务器都在循环中从下一个复制环复制。对于两个人,他们互相复制。这一点早在v3.23就得到了支持。

在之前我工作过的地方,我们用v3.23与很多客户一起做了一个提供你所要求的方式。我们使用Internet上的SSH隧道进行复制。我们花了一些时间让它变得可靠,有几次我们不得不将一个数据库的二进制副本复制到另一个数据库(幸运的是,它们都没有超过2Gb,也不需要24小时访问)。此外,v3中的复制并不像v4中那样稳定,但即使在v5中,如果它检测到任何类型的错误,它也会停止。

为了适应不可避免的复制延迟,我们重新构建了应用程序,使其不依赖于 AUTOINCREMENT 字段(并从表中删除了该属性)。由于我们开发的数据访问层,这相当简单;而不是使用 mysql_insert_id()来代替新对象,它首先创建新ID并将其与行的其余部分一起插入。我们还实现了存储在ID上半部分的站点ID,因为它们是 BIGINT 。这也意味着当我们有一个客户想要在三个位置使用数据库时,我们不必更改应用程序。 : - )

它不是100%强大。尽管我们考虑过,InnoDB只是获得了一些可见性,因此我们无法轻松使用交易。因此,当尝试使用相同的ID创建两个对象时,偶尔会出现竞争条件。这意味着一个失败,我们试图在应用程序中报告。但它仍然是某人工作的一个重要部分,可以监视复制并在崩溃时解决问题。重要的是,要在我们太远不同步之前修复它,因为在少数情况下,数据库正在两个站点中使用,如果我们不得不重建一个,很快就会难以重新集成。

成为其中一员是一项很好的练习,但我不会再这样做了。不在MySQL中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top