我有一个中央数据库,其中包含 MySQL 5.1-lastest-stable 中的所有数据。我想以主-主关系连接多个客户端。
问题
如何设置星型拓扑,中间有 1 个中央服务器,有多个客户端数据库,以便一个客户端的更改能够传播第一的到中央服务器,然后从那里到所有其他客户端数据库?
数据库信息
我对所有表都使用 inno-db,并且启用了二进制日志。
除此之外,我还学会了如何在两个数据库之间进行主主对主。
所有表都有主键主整数自动增量。当自动增量偏移量和起始值调整到不同的客户端数据库时,永远不会发生主键冲突。
我为什么想要这个
我有客户端软件(不是网站或 php),它连接到笔记本电脑上的本地 MySQL 数据库,这需要同步到中央数据库,以便所有在笔记本电脑上使用该程序的人都可以看到其他人所做的所有其他更改。
我不想直接连接到中央数据库,因为如果笔记本电脑和中央数据库之间的互联网连接断开,我的应用程序就会死机。
在这种设置下,应用程序将继续运行,笔记本电脑只是不会从其他人那里获得更新,直到重新建立与中央数据库的连接。
答案1
有一个特定的原因导致您提出的内容无法通过 MyISAM 和 InnoDB 实现。
星型拓扑结构保证主服务器是宇宙的中心,而不是从服务器。MySQL 复制并非设计为让从服务器同时从多个主服务器读取数据。它一次只能从一个主服务器读取数据。更改主控命令将一台从机连接到一个(且只能连接到一个)主机。
根据书上的说法了解 MySQL 内部原理,第 219 页第 2 段“多主”内容如下:
MySQL Replication 最初编写时并未考虑多主服务器支持。从服务器本身只能复制一个主服务器。可以创建一个相当简单的补丁,以允许一个从服务器收集来自多个主服务器的更新而无需解决冲突。这曾经做过,但由于多种原因,它没有进入源代码树的主分支。曾经计划过一个更复杂的补丁来允许解决一些冲突,但由于多种原因,它没有进入开发阶段。它仍然可能在未来实现。
这本书高性能 MySQL:优化、备份、复制等在第 364 页(第 8 章:复制拓扑)的顶部有一个框,其标题为“MySQL 不支持多主复制”.盒子有以下几段:
我们使用术语多主复制非常具体地描述具有多个主服务器的从服务器。不管您被告知什么,MySQL(与某些其他数据库服务器不同)目前不支持图 8-6 中所示的配置。但是,我们将在本章后面向您展示一些模拟多主复制的方法。
不幸的是,许多人随意使用这个术语来描述整个拓扑中有多个主服务器的任何设置,比如我们在本章后面展示的“树”拓扑。其他人用它来描述我们所说的主-主复制,其中服务器互为主又互为从。
这些术语问题引起了很多混乱甚至争论,因此我们认为最好谨慎使用名称。想象一下,如果 MySQL 增加了对具有两个主服务器的从服务器的支持,沟通将有多困难!如果您没有为此目的保留“多主服务器复制”,您将使用什么术语来描述它?
虽然第 373-375 页“模拟多主复制”子标题下列出的模拟技术在理论上是可行的(使用 BLACKHOLE 存储引擎),并且已被其他人成功实施以模拟仅两个主服务器,但它仍然无法支持您特定提出的拓扑。
我曾说过这个问题之前。事实上,我给出的答案一直都是成功实现的。这就是为什么保险推销员可以把笔记本电脑带到某人的家中,收集申请人的保险数据。推销员最终会连接到中央计算机,下载新客户的申请。反过来,中央计算机可以下载最新的保险精算师信息,以便按比例计算保单对申请人的费用。它以相同的前提将笔记本电脑连接到中央计算机,一次连接一台笔记本电脑。
答案2
这是不可能的,Mysql只支持多主-主循环复制。
本文很好地描述了这种复制。
答案3
重要更新我承认错误。虽然从理论上讲,我在这里所说的一切都是合理有效的,但 MySQL 实际上并不支持多主复制,原因我不知道。但是,其他数据库服务器确实支持这种拓扑,因此,如果需要真正的主-主星型拓扑,同样需要更改为不同的服务器。
我不同意@lg,我认为这是可能的。(提前抱歉,这个“答案”缺乏具体内容,我面前没有 MySQL 数据库,以前也从未这样做过,但这里的内容比评论中的内容还要多。)
在 MySQL 主-主复制中,两个服务器都承担主服务器和从服务器的角色;同样,在主-主-等循环重复中,所有服务器再次既是主服务器又是从服务器。
从另一个角度来看,MySQL 完全有能力让一台主服务器复制到多台从属服务器——我们在之前的工作中设置了这种情况(主服务器到 3 个从属服务器)。
因为我们知道主服务器也可以是从服务器,并且我们知道主服务器可以有多个从服务器,并且我们知道(从循环复制的工作方式)复制的语句可以放入 binlog 中(以供下一个从服务器接收)和服务器可以在其自己的主服务器中的 binlog 中识别其自己的语句(这使得循环复制场景中的“第一个”服务器不会再次复制其自己的语句并保持它们陷入无限循环),您可以设置一个服务于多个从服务器的主服务器,这似乎很合理,而该主服务器本身又是多个主服务器的从服务器(再次强调,我知道这是可能的,因为 MySQL 支持多主复制,以便为多个服务器提供单一实时备份)。
现在,我承认我无法提供有关如何进行设置的具体信息,并且我很容易承认您不太可能获得太多(如果有的话)对这种非常非正统的设置的支持,但这里有一些提示可以帮助您入门:
- 应设置所有服务器来记录复制的语句(按照通常的循环复制,如@lg 链接的文章)。
- 应将“辐条” (由于缺乏更好的术语) 服务器与中央“集线器”服务器设置为主-主关系。
这应该很容易测试——你说你已经在主-主关系中设置了 2 个,所以现在在主-主关系中设置第三个,无论你想要哪一个作为中央“集线器”,然后看看复制是否按你想要的方式工作(虽然记住步骤 1——我相信典型的主-主不会将复制的语句放入 binlog 中)。