如何在多服务器 Docker 容器设置上对数据库执行数据复制?

如何在多服务器 Docker 容器设置上对数据库执行数据复制?

设置草图

要使用 docker 设置灾难恢复拓扑,是否可以在不使用任何业务流程层 (swarm/Kubernetes) 的情况下将数据从一台服务器复制到另一台服务器?有没有办法在 2 台服务器上设置 MySQL Master-Master 或 Master-Slave?

我不要的是:

  1. 使用共享磁盘空间进行数据复制
  2. 无需第三方工具/软件
  3. 没有 Swarm 或 Kubernetes

我理解,对于适当的灾难恢复系统,建议将备用系统放在完全不同的区域,并且数据复制的延迟是可以接受的。我想知道的是两个 docker 容器是否能够正常相互通信?有什么需要配置的吗?或者它们会像没有 docker 一样正常通信吗?

答案1

两个物理上彼此靠近的数据库服务器将实现目标。

  • 从主服务器到副本服务器仍然会有一些延迟,但可能小于 1 毫秒。
  • 副本服务器只有在主服务器上提交后才会开始执行复制查询。(这是另一个强制性滞后。)只要您的写入仅影响少数行,这也是亚毫秒或低毫秒级的。
  • 如果是主-主模式,则允许每个节点接收写入,并且每个节点既是“主”节点又是“从”。但是,我建议一次只写入一个节点;另一个节点只是热备用节点。
  • MM 是已在两个方向上设置的 MS,因此允许简化故障转移。
  • 每个数据库服务器是否实际上位于 Docker 容器内并不重要。
  • 但是拥有两台独立的机器可以提供 DR,而一台服务器中的两个 Docker 无法防止主板、磁盘等故障。
  • 故障转移的部分是 MySQL/MariaDB 标准问题的一部分,但执行故障转移仍然是手动的。
  • 如果两台机器中的一台出现故障,您需要花费一些不小的精力(和时间)来重建另一台机器。
  • 两台机器位于同一洪泛区、地震断层、龙卷风走廊等处——对于真正的灾难恢复,您需要地理分离。但这会导致服务器之间的延迟。不可能拥有一切!

另请参阅 Galera Cluster(随 MariaDB 提供;或可添加到 MySQL)。有了它,每台服务器一个 3 个“节点”,可实现自动故障转移和自动修复。

据我所知,Docker 不会引入任何额外的障碍。也许其他人会加入进来。如果多个 Docker 中有多个 MySQL 实例,那么就会存在获取单独端口号的问题。

PS. dba.stackoverflow.com 是查看 MySQL/MariaDB 问题的更好的网站。

答案2

高可用性服务是绝不仅使用两个节点即可构建。您需要至少三个,以缓解裂脑问题。在地理分布的情况下,这个问题甚至比物理上共置的服务更重要;如果您重视数据和正常运行时间,请不要试图忽略它。如果您负担不起三个节点,最好根本不做任何 HA,否则您试图获得更好的服务反而会让事情变得更糟。

确定了这一点后,我建议您使用 Galera。它是现代 MariaDB(同一作者的 MySQL 克隆版,一个简易替代品)中内置的多主复制。正如预期的那样,它需要三个节点,但其中只有两个必须是功能齐全的服务器,第三个可以是所谓的仲裁节点(旨在作为仲裁选择过程中的决胜节点)。

因此,您需要制作两个包含数据的容器,并将第三台机器用作仲裁器。您还可以将第三个节点设置为功能齐全的服务器,但仅使用它来备份数据库,这样主服务器在备份运行时就不会出现阻塞。然后,您最好将其设置为首选 SST 源,这样如果一台服务器重新启动并需要 SST,它就不会在 SST 过程中阻塞另一台服务器。重要的是将第三个节点放在第三位置,而不是与两台主服务器位于同一位置,这样它就可以成为真正的决胜局。

我运行这种地理分布的 Galera 设置,MariaDB 实例通过 VPN 进行通信,并且性能良好。

相关内容