答案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 进行通信,并且性能良好。