我需要在两台服务器上实现 Linux-HA 配置。我决定在两台主机上都使用 DRBD 进行块级复制,主要用于 MySQL 数据复制。
据我了解,在 DRBD 配置中总是有一个主服务器,其他是从属服务器(可以有自己的从属服务器)。复制只从主服务器传递到从服务器,而不是相反。
那么,如果我有 MySQL 进程同时在两台服务器上执行写入,其中一个是主服务器,另一个是从服务器,会发生什么?
从机可以写入,但是没有数据写入?
假设此配置将与 Heartbeat 一起使用,Heartbeats 的工作就是确保 MySQL 仅在 master 上运行,但我们暂时假设 Heartbeat 由于某种原因失败。
据我所知,DRBD 进行分区级复制。从站不挂载分区,因此无法写入。当主服务器出现问题时,从服务器将挂载分区并开始工作。
因此,您不能让两台服务器都写入相同的数据。
常用的配置,也是我过去自己使用的配置,是有两个节点,它们之间有一些资源。这些资源是一个 DRBD 存储块设备、一个 MySQL 守护进程和 IP 地址。
资源只能在主节点上“启动”。Heartbeat 负责选择哪个节点是主节点并以正确的顺序启动资源 - 告诉 DRBD 成为主节点,挂载 BD,启动 MySQL 并启动 IP。它们按此顺序出现以确保数据一致性。您可以通过将主节点降级或提升辅助节点来手动选择在主节点和辅助节点之间进行故障转移。
当主服务器启动时,辅助服务器执行的唯一操作是复制 DRBD 数据并参与 Heartbeat 通信以表明它处于活动状态。在它作为辅助设备期间,MySQL 从未运行,您无法使用存储块设备。资源一次只能在一台机器上使用。
这种设置不同于 MySQL 的传统“延迟复制”,其中辅助机器运行 MySQL 并存储它自己的数据副本。两者都有其优点和缺点。根据我的经验,如果 HB 设置正确,并且您还有一个良好的备份策略,那么 LinuxHA 方法可以提供更好的高可用性。
MySQL HA 的更好解决方案是使用循环 MySQL 复制。本文进一步解释它,但基本前提是让每个服务器成为另一个服务器的从属。您将需要在前面设置某种负载均衡器。
需要担心的一件事是数据库连接可能是长期存在的,如果应用程序死亡,您将需要配置应用程序以重新连接。
“不可能发生”。DRBD 将确保一次只有一台服务器使块设备处于活动状态。如果你得到一个“裂脑”,两个 DRBD 主机都认为另一个已经死了(所以它们都处于活动状态),它们将不会重新连接,你需要手动解决不一致问题(通常丢弃一个主机上的更改或另一个)。
如果您需要 DRBD“主要”用于 MySQL 复制,那么使用 MySQL 中内置的复制功能可能更容易?