11

这是场景。两个不同位置的 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

4 回答 4

11

在两个主服务器上复制数据库不会获得太多性能。但是,如果您对应用程序进行正确编码,则会有一些非常好的故障转移。

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

掌握 MySQL 1:

auto_increment_increment = 2
auto_increment_offset = 1 

掌握 MySQL 2:

auto_increment_increment = 2
auto_increment_offset = 2

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

设置完成后,将它们都作为奴隶启动。
然后检查两者是否正常工作,连接到两台机器并执行命令SHOW SLAVE STATUS,你应该注意两者Slave_IO_Running并且Slave_SQL_Running都应该在每个框上都说“是”。

然后,当然,在表中创建几条记录,并确保一个框只插入奇数主键,另一个只增加偶数主键。

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

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

编辑:我想如果你确保偏移量是正确的等等,理论上可以添加更多的主人。不过,您可能会更现实地添加一些额外的奴隶。

于 2008-11-28T14:13:53.997 回答
2

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

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

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

于 2008-11-28T13:57:32.203 回答
1

UID 相同是否重要?或者您是否会考虑将远程 UID 映射到本地 UID 的表或列,并为您希望复制的对象编写自定义同步代码,从而对外键列的 UID 进行任何必要的映射等?

于 2008-11-28T13:49:40.677 回答
0

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

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

需要明确的是,您可以“设置”双向复制,但 MySQL AB不鼓励这样做

于 2008-11-28T13:45:45.707 回答