这是一个场景。位于两个独立位置的两个web服务器,具有两个具有相同表的mysql数据库。表中的数据也应实时相同。
这是问题所在。如果任一位置的用户同时将一条新记录输入到相同的表中,如下面的前两个表所示,其中每个表中的第三条记录是由不同的人同时输入的。表中的数据不再相同。如下面的第三个表所示,无论更新发生在何处,保持数据实时不变的最佳方法是什么?这样,在下面的插图中,新记录被双向复制并插入到两个表中,以再次创建2个相同的表,这次是4列,而不是每个表中有3行。
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 |
|-----------|发布于 2008-11-28 14:13:54
在两个主服务器上复制数据库不会获得太多性能。但是,如果您正确编写应用程序代码,则会有一些很好的故障转移。
Master-Master设置本质上与Slave-Master设置相同,但两个Slave都已启动,并且每个机器上的配置文件都有一个重要的更改。
Master MySQL 1:
auto_increment_increment = 2
auto_increment_offset = 1 Master 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插入前3条记录(1、3和5),则当服务器2插入第4条记录时,它将被赋予键6(而不是未使用的2)。
设置完成后,将它们都设置为从属。
然后,要检查两台机器都正常工作,请连接到两台机器并执行命令SHOW SLAVE STATUS,您应该注意到,Slave_IO_Running和Slave_SQL_Running都应该在每个框上都说“是”。
然后,当然,在一个表中创建一些记录,并确保一个框只插入奇数编号的主键,而另一个框只增加偶数编号的主键。
然后执行所有测试,以确保您可以在每个机器上执行所有标准应用程序,并将其复制到另一个机器上。
一旦开始,它就会变得相对简单。
但正如前面提到的,MySQL确实不鼓励这样做,并建议您确保在编写应用程序代码时注意此功能。
编辑:我想理论上可以添加更多的母版,如果你确保偏移量是正确的,等等。不过,您可能会更实际地添加一些额外的从属。
发布于 2008-11-28 13:57:32
MySQL不支持同步复制,然而,即使它支持同步复制,您也可能不想使用它(不能承受等待其他服务器在每次事务提交时同步的性能影响)。
你将不得不考虑更合适的架构解决方案--有第三方产品会以预定的方式进行合并和解决冲突--这是真正的唯一方法。
期望你的体系结构以这种方式工作是天真的--任何数据库都没有“简单的修复”,不仅仅是MySQL。
发布于 2008-11-28 13:49:41
UID相同很重要吗?或者,您是否会考虑使用表或列将远程UID映射到本地UID,并为希望复制的对象编写自定义同步代码,以便为外键列执行任何必要的UID映射,等等?
https://stackoverflow.com/questions/325791
复制相似问题