MySQL 复制:关于回退系统的问题

MySQL Replication: Question about a fallback-system

我想设置一个完整的服务器(apache,mysql 5.7)作为生产服务器的后备。 使用 rsync 和 cronjob 的文件级同步已经完成。

mysql-复制是当前的问题。更准确地说:选择正确的复制方法。

多主组复制似乎是目前为止最合适的方法。 如果生产停机时间较长,可以通过 DNS 更改快速切换到备用服务器。 无需调整即可立即对数据库进行写访问。

到目前为止一切顺利:但是,如果后备服务器发生故障,它处于无法访问的状态并且生产服务器切换为只读,因为它的组不再有配额。这当然是不行的。 我认为使用不同的副本变量可能是可能的:如果回退服务器在一段时间内(~5 分钟)处于无法访问状态,生产服务器应该停止 group_replication 并启动一个新的 group_replication.这必须自动发生以保持只读时间相对较低。当 fallback-server 重新上线时,应该手动将其添加到新启动的组中。但是,如果我正确阅读了各种论坛帖子和文档,那是不可能的。而且 运行 只有两个节点的 Group_Replication 无论如何都是错误的决定。

https://forums.mysql.com/read.php?177,657333,657343#msg-657343

这种后备系统是否只能考虑主从复制? https://dev.mysql.com/doc/refman/5.7/en/replication-solutions-switch.html

或者 Group_Replication 是否提供了可能性,如果您能对配额问题做出适当的反应?到目前为止我忽略的可能性。

非常感谢和最诚挚的问候

简答:您必须[至少] 3 个节点。

长答案:

脑裂只有两个节点:

  • 仅写入幸存节点,但前提是您可以断定它是唯一幸存的节点,否则...
  • 网络中断,两个主节点都在接受写入。这让他们彼此不同意。你可能没有干净的方法来修复这个烂摊子。
  • 进入存活节点的只读模式。 (唯一安全和理智的方法。)

问题是自动化系统无法区分失效的主节点和失效的网络。

所以...你必须3个节点才能安全地避开“split-brain”并且很有可能自动故障转移。这也意味着任何两个节点都不应处于相同的龙卷风路径、洪水范围、火山路径、地震断层等。

您选择了组复制(InnoDB 集群)。这是 MySQL 提供的出色产品。带有 MariaDB 的 Galera 是一个同样好的产品——在细节上有很多差异,但归结为需要 3 个,最好是分散的节点。

由于 TTL,DNS 更改需要一些时间。代理服务器可能会有所帮助。

Galera 可以 运行 在“主 + 副本”模式下,但它也允许您 运行 所有节点都是 read-write。这导致客户端停止写入一个节点并开始写入另一个节点所需的一组略有不同的步骤。有“代理”可以帮助解决这些问题。

故障回复

您是否尝试始终使用某个主节点,除非它出现故障?或者您可以接受让任何节点成为 'current' 主节点吗?

我认为“回退”只是一种返回到原始主节点的“故障转移”。这意味着第二次中断(可能更短)。但是,我了解地理因素。您可能希望您的主要主要客户是 'near' 大多数客户。

我建议使用带有 HAProxy 的 Galera MySQL 集群作为负载平衡器和自动故障转移解决方案。我们已经在生产中使用它很长时间了,从来没有遇到过严重的问题。要考虑的最重要的事情是监视节点之间的复制同步状态。另外,请确保您的存储引擎是 InnoDB,因为 Galera 不能与 MyISAM 一起使用。

检查此 link 以了解如何设置: https://medium.com/platformer-blog/highly-available-mysql-with-galera-and-haproxy-e9b55b839fe0

但在这种情况下,主要问题不是故障转移机制,因为有许多现成的解决方案,而是您必须检查 read/write 比率和事务服务并确保复制延误不会影响他们。有时具有 master-slave 复制的垂直可扩展解决方案更适合 transaction-sensitive 金融系统,这实际上取决于您提供的服务。