从代码连接到MySQL主 - 主设置

时间:2011-10-24 14:22:09

标签: mysql database-connection replication multi-master-replication

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

也许我对master-master设置如何工作(在MySQL中)有一个完全的误解,但是我看到它的方式,你正常地连接到你的数据库,但在幕后,MySQL复制了数据两个数据库之间。如果你进行写操作,它可以转到master 1或master 2,你通常不会知道(除了auto-increment id会返回不同的值)。如果主A会以某种方式失败,主B将仍然工作,因此没有停机时间,主A将被忽略,直到它再次上升,数据被复制,如果一切正常,主A将再次回到现场。 / p>

如果这是正确的,请纠正我,如果我上面的疏忽是错误的,你是否需要做一些特殊的事情以防一个主人失败?如果我连接到192.168.1.50(即主A),如果主A关闭会发生什么? MySQL会以某种方式自动将我连接到192.168.1.51(主B),以便我的网站继续工作吗?

如果我不对,那么MySQL master-master复制如何工作呢?我是否必须告诉每个查询应该执行哪个主服务器?这没有任何意义,对,因为如果主A关闭,那么我对主A的所有查询仍然会失败,主 - 主设置对我没有帮助。

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

  

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

我错过了什么吗?谢谢!

2 个答案:

答案 0 :(得分:2)

  

也许我对master-master设置如何工作(在MySQL中)有一个完全的误解,但是我看到它的方式,你正常地连接到你的数据库,但在幕后,MySQL复制了数据两个数据库之间。如果你进行写操作,它可以转到master 1或master 2,你通常不会知道(除了auto-increment id会返回不同的值)

这是不正确的。

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

在多主复制中,每个节点都是主节点和从节点,从循环中的前一台机器接收更新,并将它们传送到下一台机器。每台计算机都有一个唯一的标识符,它在发送和接收复制日志时使用,允许它识别数据何时完整循环。

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

  

如果我连接到192.168.1.50(主设备A),如果主设备A发生故障会怎样? MySQL会以某种方式自动将我连接到192.168.1.51(主B),以便我的网站继续工作吗?

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

更糟糕的是,当循环中的一台机器发生故障时,循环就会中断。假设您有三个,A,B和C.循环将是A => B => C => A.如果B发生故障,A不能再向C发送更新,这意味着C将是唯一连接到的安全机器,直到B重新启动并恢复循环。

关于自动增量,请查看auto_increment_increment and auto_increment_offset,这两个服务器变量可以在多主复制设置中实现自动增量。在任何情况下,您都不应该在多主机中使用自动增量而不必设置这两个变量。

答案 1 :(得分:0)

Server=serverAddress1, serverAddress2, serverAddress3;Database=myDataBase;Uid=myUsername;Pwd=myPassword;

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