gpt4 book ai didi

mysql - 从代码连接到 MySQL master-master 设置

转载 作者:行者123 更新时间:2023-11-29 07:04:59 26 4
gpt4 key购买 nike

对于一个新网站,我们必须连接到 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 主-主复制是如何工作的呢?我是否必须告诉每个查询应该在哪个主服务器上执行?那是没有意义的,对吧,因为如果 master A 宕机,那么我对 master A 的所有查询仍然会失败,master-master 设置对我一点帮助也没有。

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

do I still connect to a single MySQL host (I'm using NHibernate but that doesn't really matter), do I specify a single connectionstring, and will MySQL know that there are two masters, or does my code change in such a way that I need to specify connectionstrings for both masters (how?), do some special magic to balance the queries between the two servers, etcetera.

我还遗漏了什么吗?谢谢!

最佳答案

Maybe I have a complete misunderstanding of how a master-master setup works (in MySQL), but the way I see it, you connect to your database as you'd normally do, but behind the scenes, MySQL replicates the data between the two databases. If you do a write, it can go to either master 1 or master 2, you normally wouldn't know (except that the auto-increment id would return a different value)

这是不正确的。

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

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

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

If I connect to 192.168.1.50 (which is master A), what happens if master A goes down? Will MySQL somehow automagically connect me to 192.168.1.51 (master B) so my site will continue to work?

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

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

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

关于mysql - 从代码连接到 MySQL master-master 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7877111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com