以下是该方案。 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 |
|-----------|
答案 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_Running
和Slave_SQL_Running
都应该在每个框上都说“是”。
然后,当然,在表格中创建一些记录,确保一个框只插入奇数编号的主键,另一个框只增加偶数编号的主键。
然后进行所有测试,以确保您可以在每个盒子上执行所有标准应用程序,并将其复制到另一个盒子上。
一旦它开始就相对简单 但正如已经提到的,MySQL确实不鼓励它,并建议您在编写应用程序代码时确保注意到这一功能。
编辑:我认为如果确保偏移正确等,理论上可以添加更多母版。但是,你可能会更现实地添加一些额外的奴隶。
答案 1 :(得分:2)
MySQL不支持同步复制,但是,即使它确实如此,您可能也不想使用它(不能在每次事务提交时等待其他服务器同步的性能)。
您将不得不考虑更合适的架构解决方案 - 有第三方产品可以合并并以预定方式解决冲突 - 这是唯一的方法。
期望您的架构以这种方式运行是天真的 - 对于任何数据库都没有“简单修复”,而不仅仅是MySQL。
答案 2 :(得分:1)
UID是否相同是否重要?或者您是否想过将远程UID映射到本地UID的表或列,以及为希望复制的对象编写自定义同步代码,以及是否需要对外键列的UID进行映射等等?
答案 3 :(得分:0)
确保表同步的唯一方法是在数据库之间设置双向复制。
但是,MySQL只允许单向复制,因此您不能简单地在此配置中解决问题。
要明确,您可以“设置”双向复制,但MySQL AB discourages this。