我们有两个不同的网站,一个托管在亚洲数据中心,名为 asiadata.com,另一个托管在欧洲数据中心,名为 europedata.com。目前,我们只有一个主数据库服务器,托管在欧洲数据中心,它负责两个网站的所有写入,并在欧洲和亚洲数据中心的底层从属服务器上进行复制。此外,两个应用程序都在公共数据库上写入。
我们从 asiadata.com 用户那里收到投诉,称网站浏览和发布速度很慢,而且 asiadata.com 上的内容无法立即显示。经过深入研究,我们发现数据库是罪魁祸首,因为它需要先在欧洲数据中心主服务器上写入,然后需要返回亚洲数据中心数据库服务器从服务器以同步数据,并且还需要在欧洲数据中心从服务器上同步数据。由于亚洲和欧洲之间的地理距离以及网络延迟,所有这些过程都需要时间。
现在我们决定通过在亚洲和欧洲数据中心各设置多个写入服务器(主服务器)来解决这个问题,这样每个站点都将在本地写入数据,并且两个主服务器也将是彼此的从服务器。并且每个主服务器负责仅在底层从服务器上复制其自己数据中心上的数据。对于冲突解决,我们将在代码级别进行控制。例如,避免相同的用户名和其他唯一约束。希望这将解决裂脑情况,并确保两个主服务器都不会崩溃。
有人能告诉我我是否遗漏了有关多个写入主机的任何信息或数据库级别的任何中断复制的场景吗?我认为这将是提高我的应用程序性能的最佳方式,但与此同时,我害怕构建此解决方案,因为 MySQL 社区不鼓励多个写入主机。此外,90% 的数据库表是 MyISAM,复制是单线程的。我担心两个主机可能不会产生最佳性能,因为表级别锁定,因为两个主机也将同时是从属。
另外,是否有任何自动化工具可用于解决冲突并解决两个主服务器之间的复制问题?
总的来说,请评论多主机是否是最佳解决方案或者是否有更好的替代方案。
答案1
mysql 复制节点既可以是主节点,也可以是从节点——不能同时是两者。但没有什么可以阻止你只将写入发送到一些节点(但要设置自动增量,以便任何节点都可以处理插入/更新)。
MySQL 社区不鼓励多个写入主
IME,主主复制,同时更新两者,工作正常。您只需要注意,地理上分开的数据库操作不一定以相同的顺序发生(即,永远不要删除数据,避免在可行的情况下更改主键/外键)。但对于公告板/博客类型的系统来说,这应该不会造成问题。
为了解决冲突,我们将在代码级别进行控制。例如,避免相同的用户名和其他唯一约束
这些情况应该非常罕见且可预测 - 使用跨度互斥锁来锁定所有节点对于该数据值。