这是使用mysql实时双向同步动态数据的最佳方法

时间:2008-11-28 13:37:41

标签: php mysql database synchronization data-synchronization

以下是该方案。 2个Web服务器位于两个独立的位置,两个mysql数据库具有相同的表。表中的数据预计也是实时相同的。

这是问题所在。如果任一位置的用户同时将新记录输入到相同的表中,如下面的两个第一个表所示,其中每个表中的第三个记录已由不同的人同时输入。表中的数据不再相同。哪种方法可以保持数据实时保持相同,如下表第三表所示,无论更新发生在何处?这样在下面的插图中,而不是在每个表中以3行结束,新记录被双向复制,并且它们被插入到两个表中以再次创建2个相同的表,每次有4列?

Server A in Location A
==============

Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
|-----------|
| 3 | John  |
|-----------|

Server B in Location B
==============
Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
|-----------|
| 3 | Peter |
|-----------|


Expected Scenario
===========
Table Names
| ID| NAME  |
|-----------|
| 1 | Tom   |
| 2 | Scott |
| 3 | Peter |
| 4 | John  |
|-----------|

4 个答案:

答案 0 :(得分:11)

在两个主服务器上复制数据库没有太多性能。但是,如果您的应用程序编码正确,则会有一点点故障转移。

Master-Master设置与Slave-Master设置基本相同,但启动了两个Slave并对每个盒子上的配置文件进行了重大更改。

掌握MySQL 1:

auto_increment_increment = 2
auto_increment_offset = 1 

掌握MySQL 2:

auto_increment_increment = 2
auto_increment_offset = 2

这两个参数可确保当两个服务器因某种原因争夺主键时,它们不会复制并终止复制。默认情况下,任何自动增量字段都将增加2而不是递增1,而是在一个框中,它将从1开始偏移并运行序列1 3 5 7 9 11 13等。在第二个框中,它将在2处开始偏移并且沿着2 4 6 8 10 12等运行。从当前测试开始,自动增量似乎采用下一个空闲数字,而不是之前剩下的数字。
例如。如果服务器1在服务器2插入第4个时插入前3条记录(1 3和5),则将给出密钥6(不是2,未使用)。

一旦你设置了它,就把它们作为奴隶开始 然后检查两者是否正常工作,连接到两台机器并执行命令SHOW SLAVE STATUS,您应该注意Slave_IO_RunningSlave_SQL_Running都应该在每个框上都说“是”。

然后,当然,在表格中创建一些记录,确保一个框只插入奇数编号的主键,另一个框只增加偶数编号的主键。

然后进行所有测试,以确保您可以在每个盒子上执行所有标准应用程序,并将其复制到另一个盒子上。

一旦它开始就相对简单 但正如已经提到的,MySQL确实不鼓励它,并建议您在编写应用程序代码时确保注意到这一功能。

编辑:我认为如果确保偏移正确等,理论上可以添加更多母版。但是,你可能会更现实地添加一些额外的奴隶。

答案 1 :(得分:2)

MySQL不支持同步复制,但是,即使它确实如此,您可能也不想使用它(不能在每次事务提交时等待其他服务器同步的性能)。

您将不得不考虑更合适的架构解决方案 - 有第三方产品可以合并并以预定方式解决冲突 - 这是唯一的方法。

期望您的架构以这种方式运行是天真的 - 对于任何数据库都没有“简单修复”,而不仅仅是MySQL。

答案 2 :(得分:1)

UID是否相同是否重要?或者您是否想过将远程UID映射到本地UID的表或列,以及为希望复制的对象编写自定义同步代码,以及是否需要对外键列的UID进行映射等等?

答案 3 :(得分:0)

确保表同步的唯一方法是在数据库之间设置双向复制。

但是,MySQL只允许单向复制,因此您不能简单地在此配置中解决问题。

要明确,您可以“设置”双向复制,但MySQL AB discourages this

相关问题