如何将来自两个MySQL源的实时数据合并到一个MySQL目标中?

我有两个不同的MySQL实例,我想从属于第三个实例。 (所以我可以轻松join三)

例如。

mysql1> show databases db1 db2 mysql2> show databases db3 db4 mysql3> show databases db1 db2 db3 db4 

我已经看过maatkit (percona toolkit) pt-table-sync,但是人们说它可能会破坏数据。 (它显然删除并重新添加数据来生成插入)

pt-archiver类似于“快照”,但是db1大约是6GB,复制整个事情的数据比真正需要的要多得多。 实时更新每天只有100MB左右。

对我来说,自然的概念是允许mysql3作为mysql1和mysql2的副本运行,但是在MySQL中这似乎不是一个选项

钨复制似乎允许这种types的数据同步,但configuration似乎有点笨拙,我担心可靠性。

有没有人有其他解决scheme,他们用这个问题?

按照devise,一个mysqld进程不能同时收听两个不同的Masters。

CHANGE MASTER TO命令仅允许您将一个主设备设置为读取源。

为了模拟这个,你将不得不以编程方式在两个主人之间交替。 你是怎样做的 ?

我在StackOverflow中描述了如何手动连接一个奴隶到不同的主人,其中每个主人是一台笔记本电脑,而奴隶是一台中央计算机。

这是基本的想法

  • 硕士M1
  • M2大师
  • 从机S1

将M1复制到S1,然后将M2复制到S1

  • 1)S1以M1为源运行CHANGE MASTER TO
  • 2)开始从属;
  • 3)运行一会儿复制
  • 4)停止从属;
  • 5)S1以M2作为源运行CHANGE MASTER TO
  • 6)START SLAVE;
  • 7)稍微运行复制
  • 8)停止从属;
  • 9)返回步骤1

每次从一台主机切换到另一台主机时,必须logging来自SHOW SLAVE STATUS\G两个值

  1. Relay_Master_Log_file
  2. Exec_Master_Log_Pos

这两个值表示来自主服务器的最后一条SQL语句,并且接下来将在从服务器上执行。

有一个主要的警告:只要M1和M2正在更新互斥的数据库,这个algorithm应该是很好的。

信不信由你, 在2011年5月,我在ServerFault中解决了这个问题。我实际上解释了如何使用基于“高性能MySQL”的BLACKHOLE存储引擎来模拟真正的多主/单从机。

没有一个好的阅读工具来做到这一点。 pt-table-sync不能像你所告诉的那样工作(我写的),但这不是正确的解决scheme。 我已经看到了它的双向同步function,用于在有意断开和更新后将服务器与中央资源进行协调,但这不是您需要的正确解决scheme。

我通常不会像这样的话题给销售人员打个招呼,但是说实话,我要让Percona为你开发一个新的工具。 有些人已经写出了适合他们个人情况的小脚本,但是一般用途的高质量解决scheme还不存在,并不是那么难。 主要的是你需要正式的testing,而Percona Toolkit的组件已经是你所需要的90%的方法 – 它们之间只需要一点点粘合剂。 当然,你可以自己做,但是为什么要制造一个方形的轮子,最终自己维护它,当你最不希望的时候发现它的所有错误呢?

这说(最后的销售摊位,对不起) – 我build议的解决scheme应避免黑洞表,并采取更简单,不太麻烦的技术。 (是的 – 我也写了高性能的MySQL,我知道,那时候我还没有像现在这样看到很多黑洞表的问题)。这应该大体上是Rolando所说的,但是也有一些微妙之处。 例如,它不应该让I / O线程从主服务器stream出一堆数据,远远超过SQL线程,然后当它绕到下一个服务器时丢弃它。 那真是浪费,对主人造成很大的影响。 有很多这样的小细节需要注意 – 另一个想到的是,当复制引起的临时表正在使用时,不会切换主设备。