从代码连接到MySQL主设置

从代码连接到MySQL主设置,mysql,database-connection,replication,multi-master-replication,Mysql,Database Connection,Replication,Multi Master Replication,对于新网站,我们必须连接到MySQL主设置。这是一个使用NHibernate的.NET网站,但同样适用于Java或任何其他语言。我们之所以选择此设置,是因为如果数据库出现故障,我们希望站点继续工作。我们不喜欢停工 也许我完全误解了主设置(在MySQL中)的工作原理,但在我看来,您可以像平常一样连接到数据库,但在幕后,MySQL会在两个数据库之间复制数据。如果执行写入,它可以转到主控1或主控2,这通常是您不知道的(除了自动递增id将返回不同的值)。如果主设备A以某种方式出现故障,主设备B仍将工作,

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

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

如果这是正确的,请纠正我,如果我的上述漫谈是错误的,你需要做什么特别的情况下,一个主人下去?如果我连接到192.168.1.50(主机A),如果主机A宕机会发生什么?MySQL是否会自动将我连接到192.168.1.51(master B),这样我的站点将继续工作

如果我不正确,那么MySQL主复制是如何工作的呢?我必须告诉每个查询应该在哪个主机上执行吗?这是没有意义的,对吧,因为如果主控A发生故障,那么我对主控A的所有查询都会失败,主控设置对我没有任何帮助

所以基本上,我想我的问题是:

我是否仍然连接到单个MySQL主机(我使用的是NHibernate,但是 这并不重要),我是否指定一个connectionstring, MySQL会知道有两个主机吗,或者我的代码会改变吗 以这样一种方式,我需要为两者指定ConnectionString 大师们(怎么做?),用一些特殊的魔法来平衡两者之间的查询 服务器,等等

我还缺什么吗?谢谢

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

这是不正确的

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

在多主复制中,每个节点既是主节点又是从节点,从循环中的前一台机器接收更新,并将其转发到下一台机器。每台计算机都有一个唯一的标识符,在发送和接收复制日志时使用该标识符,从而允许它在数据到达完整周期时进行标识

这种方法简单但有效。传统上,这也是后端管理和维护的一大难题。如果可能的话,不要使用多主机来支持其他解决方案。我在生产中使用多大师,并且可以从经验中说这一点

如果我连接到192.168.1.50(主机A),如果主机A宕机会发生什么?MySQL是否会自动将我连接到192.168.1.51(master B),这样我的站点将继续工作

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

更糟糕的是,当回路中的一台机器确实倒下时,回路就断了。假设你有三个,A,B和C。循环将是A=>B=>C=>A。如果B宕机,A将无法再向C传输更新,这意味着C将是唯一可以连接的安全机器,直到B恢复并恢复循环

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

Server=serverAddress1, serverAddress2, serverAddress3;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
您可以使用此连接字符串。但我没有尝试