我有一个 3 服务器 mySQL/PHP/Apache 集群(每个服务器位于不同的大陆,以实现最大弹性)。我读过很多建议,都说 - 不要这样做!
本质上我想要这样做的原因是:
- 弹性 - 3 个服务器中有 2 个可能出现故障,用户仍然可以登录并查看其数据/完成工作
- 备份 - 类似上述
- 负载共享 - 我可以将前端负载和后端服务器进程分配到不同的设备中
我研究过不同的选项,包括 percona galera,但似乎都有缺点。主要缺点是透明度 - 某个时候,链接或服务器会关闭,然后您会收到模糊的 BINLOG 错误,然后这都是一个大问题……
因此,我自己实现了这个功能 - 我有一组脚本,在每个表上构建 INSERT/UPDATE/DELETE 触发器 - 任何更改都记录在复制表中。每分钟都会有一个进程将这些更改推送到其他 2 个服务器。我还有一些进程可以检查 CHECKSUM 并对任何差异发出警报。
效果很好。我承认这并不容易!有很多繁琐的事情,包括:
- 不使用浮点列类型(0.3434 不等于 0.3434...)
- 避免自动增加键(如果数据同时插入到两个不同的服务器上,它们都可能取下一个值,那么相互插入就会失败)。
- 如果更改表结构,请记住重新运行创建触发器脚本
所以,我的问题是... 可能出什么问题? 哪里/为什么会失败? 我不知道什么?
答案1
与上述相反,我认为这是一个很好的问题。他们不是要求分析他们所做的事情,只是要求了解未知的未知数的一般“第四个窗口”。
数据密集型应用程序是好书 他们称之为多主复制,而不是主-主复制,并很好地讨论了为什么这样做存在缺陷。正如您所见,Galera 和 Percona 的服务没有这样做——所以一定有充分的理由(我还没有玩过 Blackhole)。
我认为关键信息是您需要确保表结构可以应对多线索复制 - 因此如果在不同的服务器上添加了2个新条目,您就不会(如您所说)想要有一个自动增加的关键字段 - 您需要设计表和应用程序来使用用户ID和时间戳等......(所以这是一个手动工作的痛苦)。
您可能还需要合适的工具来快速比较数据库间的表格并发现不一致之处。