1

对于一个新网站,我们必须连接到 MySQL master-master 设置。这是一个使用 NHibernate 的 .NET 网站,但同样适用于 Java 或任何其他语言。我们选择此设置是因为我们希望网站在数据库出现故障时继续工作。我们不喜欢停机时间。

也许我完全误解了主-主设置的工作原理(在 MySQL 中),但在我看来,你像往常一样连接到数据库,但在幕后,MySQL 在两者之间复制数据数据库。如果您进行写入,它可以转到 master 1 或 master 2,您通常不会知道(除了自动增量 id 会返回不同的值)。如果 master A 以某种方式失败,master B 仍然可以工作,因此不会停机,master A 将被忽略,直到它再次上升,数据被复制,如果一切正常,master A 将再次回到现场。

如果这是正确的,如果我上面的漫无边际是错误的,请纠正我,您是否需要做一些特别的事情以防万一大师倒下?如果我连接到 192.168.1.50(即 master A),如果 master A 宕机会怎样?MySQL 会以某种方式自动将我连接到 192.168.1.51(master B),以便我的站点继续工作吗?

如果我不正确,那么 MySQL 主主复制如何工作?我是否必须告诉每个查询应该在哪个主机上执行?这是没有意义的,对,因为如果主 A 出现故障,那么我对主 A 的所有查询仍然会失败,并且主-主设置对我没有任何帮助。

所以基本上,我认为我的问题实际上是:

我是否仍然连接到单个 MySQL 主机(我正在使用 NHibernate,但这并不重要),我是否指定单个连接字符串,MySQL 是否知道有两​​个主机,或者我的代码是否以这种方式更改我需要为两个主服务器指定连接字符串(如何?),做一些特殊的魔法来平衡两个服务器之间的查询,等等。

我还缺少什么吗?谢谢!

4

2 回答 2

2

也许我完全误解了主-主设置的工作原理(在 MySQL 中),但在我看来,您像往常一样连接到数据库,但在幕后,MySQL 在两者之间复制数据数据库。如果您进行写入,它可以转到 master 1 或 master 2,您通常不会知道(除了自动增量 id 会返回不同的值)

这是不正确的。

MySQL 复制的工作原理是将提交的数据(意味着更改的行或实际的 SQL 语句,取决于复制模式)写入复制日志,然后将该日志传送到从属服务器,在那里他们重播并进行相同的更改。

在多主复制中,每个节点既是主节点又是从节点,从循环中的前一台机器接收更新,并将它们转发到下一台机器。每台机器都有一个唯一的标识符,它在发送和接收复制日志时使用它,使其能够识别数据何时完成循环。

这种方法原始但有效。传统上,管理和维护后端也是一个真正的痛苦。如果可能的话,不要使用多主机来支持其他解决方案。我在生产中使用多主,可以从经验中说出来。

如果我连接到 192.168.1.50(即 master A),如果 master A 宕机会怎样?MySQL 会以某种方式自动将我连接到 192.168.1.51(master B),以便我的站点继续工作吗?

当您连接到多主循环中的一台机器时,您连接到那一台机器。如果您需要能够连接到多台机器,如果其中一台出现故障,那么您将需要通过修改代码或中间负载均衡器来手动处理这种情况。

更糟糕的是,当循环中的一台机器出现故障时,循环就会中断。假设您有三个 A、B 和 C。循环将是 A => B => C => A。如果 B 发生故障,A 将无法再向 C 传输更新,这意味着 C 将是唯一安全的机器连接,直到 B 恢复并恢复循环。

关于自动增量,请看auto_increment_incrementauto_increment_offset,这两个服务器变量使多主复制设置中的自动增量成为可能。在任何情况下,您都不应在未设置这两个变量的情况下在多主机中使用自动增量。

于 2011-10-24T15:18:03.310 回答
0
Server=serverAddress1, serverAddress2, serverAddress3;Database=myDataBase;Uid=myUsername;Pwd=myPassword;

您可以使用此连接字符串。但我没有尝试。

于 2013-03-24T21:46:02.483 回答