使用 DRBD 版本:8.2.6 (api:88/proto:86-88)
这是 /etc/ha.d/haresources 的内容
db1 192.168.100.200/24/eth0 drbddisk::mysql 文件系统::/dev/drbd0::/drbd::ext3::defaults mysql
和 /etc/ha.d/ha.cf
日志文件 /var/log/ha-log 本地日志设施0 保活 1 死区时间 30 警告时间 10 初始化死机 120 端口 694 bcast eth0, eth4 auto_failback 关闭 节点 db1 节点 db2 重生 hacluster /usr/lib64/heartbeat/ipfail apiauth ipfail gid=haclient uid=hacluster 死神 5
在测试机器之间的故障转移时,我在 db2 上运行了以下命令:
服务心跳停止 服务 mysqld 停止 drbdadm 关闭 mysql 服务 drbd 停止
db1 上的 /proc/drbd 报告
0: cs:Connected st:Primary/Unknown ds:UpToDate/DUnknown C r---
接下来发生了什么,之后:
- 使服务在 db2 上重新联机
- 使用 hb_primary 脚本将主数据库传输到 db2
- 如上所述取下db1
- 使服务在 db1 上重新联机
- 使用 hb_primary 脚本将主节点转移回 db1
是 db1 重新挂载了 DRBD 磁盘,假设了正确的 IP 并启动了 MySQL。有大量的 MySQL 表损坏;这一切都可以修复(使用 InnoDB 恢复模式 6、mysqlcheck 和偶尔的备份),但它是如何发生的呢?
我推测:
- DRBD 在 MySQL 使用磁盘时断开了磁盘与文件系统的连接,因为干净的 MySQL 关闭不会导致数据损坏
- 心跳控制DRBD,停止心跳服务“拔掉”DRBD
- 在实际故障转移的情况下,这可能会再次发生(由于心跳 ping 超时)
我有一段时间无法再次访问此设置,并想重复测试。
配置设置是否正确?
损坏是我手动测试的结果吗?
有没有比停止心跳服务并让它运行 haresources 命令更好的方法来测试故障转移?
这可能没有太大帮助,但是最近在Pacemaker和Linux-HA邮件列表中已经对此进行了广泛的讨论。
我对心跳不是很好,但是对于起搏器,我会设置一个约束,导致集群资源管理器在尝试切换之前用磁盘写锁刷新磁盘(或暂时关闭 mysql),然后释放切换完成后锁定。
从我读过的所有内容以及我对心跳的有限经验来看,从一台服务器手动故障转移到另一台服务器所要做的就是发出
命令。haresources 文件中的所有内容都将由 heartbeat 控制。例如,我正在设置一个需要运行以下服务的集群:
这是haresources配置
这是我得到的结果(如果它是一团糟,我很抱歉,我无法在正确的位置换行):
注意停止心跳停止了所有分配给心跳的服务(mysqld,snmpd);还要注意 drbd 仍在运行,并且 heartbeat 并没有停止它。DRBD 需要一直运行才能使故障转移工作。
再次尝试故障转移,但不要运行 drbd 命令,我认为您将避免数据损坏。
测试心跳的方法是您将在一台机器上发出 service heartbeat stop 并故障转移到另一台机器并自动启动另一个节点上的所有服务,您也不想关闭 drbd 服务。
另一种测试方法是在一台机器上进行硬重启。