带有 MySQL 的 DRBD

tdi*_*mig 4 mysql drbd heartbeat

关于使用 DRBD 为 MySQL 提供 HA 的问题。

我需要确保我的备份 MySQL 实例在发生故障转移时始终处于功能状态。例如,如果主节点在提交事务时中途死亡,会发生什么?

我们是否会将数据复制到 mysql 无法处理的辅助数据?或者,如果网络在两者同步时消失,并且并非所有数据都能通过,该怎么办。

似乎有可能进入一种状态,即辅助数据上的不完整数据使 mysql 无法启动和读取数据库。

我错过了什么吗?

jgo*_*afe 11

这自然取决于故障转移的性质。听起来您已经知道问题的答案。

从根本上说,DRBD 是网络 RAID 镜像。阻止 -> 阻止。您可以同步或异步运行,具体取决于您的延迟要求。您选择其中的哪一个会极大地影响您的副本是否具有崩溃一致性。

降低到那个级别,您的问题变成:“当 MySQL 启动并读取数据文件时会发生什么?” 要么您的数据格式良好且静止不动,并且可以顺利启动,要么是崩溃一致的,并且您可能会遇到一致性问题。(当然,也有可能是磁盘损坏,这也可能是 DRBD 的问题,特别是如果您以某种方式最终出现裂脑情况。)通常,如果出现以下情况,它可以通过重播日志来恢复自身您使用的是事务引擎,但有时您会遇到更严重的问题。DRBD 和其他共享块存储都是如此,例如共享 SAN 卷或 NFS 上的(天堂禁止)数据库文件。

假设,一个符合 ACID 的数据库应该总是从不完整的事务中优雅地恢复。在实践中,尤其是对于某些 MySQL 版本,情况并非总是如此(主要是因为 MySQL 没有最大的 ACID 合规性,尽管近年来情况有所改善)。保持频繁备份始终是明智之举。

无法确保任何高可用性系统始终在故障转移时继续工作。您能做的最好的事情是在构建您的 HA 解决方案时做出正确的决定,并测试他们的废话以验证您对出现问题时它将如何表现的假设。

在您的情况下,您可能需要考虑备用从服务器,以防在主服务器的磁盘上遇到一致性问题。当然,推广它需要手动工作,但至少您不会恢复数小时或数天的数据。