使用 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 日志设施 local0 保持活动 1 死区时间 30 警告时间 10 初始化死亡 120 端口 694 bcast eth0, eth4 自动故障恢复关闭 节点 db1 节点 db2 重生 hacluster /usr/lib64/heartbeat/ipfail apiauth ipfail gid=haclient uid=hacluster 死亡5
在测试机器之间的故障转移时,我在 db2 上运行了以下命令:
服务心跳停止 服务 mysqld 停止 drbdadm 关闭 mysql 服务 drbd 停止
db1 上的 /proc/drbd 报告
0:cs:已连接 st:主要/未知 ds:UpToDate/DUnknown C r---
接下来发生了什么:
- 使 db2 上的服务重新上线
- 使用 hb_primary 脚本将主服务器转移到 db2
- 按照上述方法关闭 db1
- 使 db1 上的服务重新上线
- 使用 hb_primary 脚本将主数据库转移回 db1
db1 重新挂载了 DRBD 磁盘,假定了正确的 IP 并启动了 MySQL。MySQL 表严重损坏;虽然都可以修复(使用 InnoDB 恢复模式 6、mysqlcheck 和偶尔的备份),但问题是怎么发生的呢?
我推测:
- 当 MySQL 使用磁盘时,DRBD 会断开磁盘与文件系统的连接,因为干净的 MySQL 关闭不会导致数据损坏
- 心跳控制 DRBD,停止心跳服务会“切断”DRBD 的电源
- 在实际故障转移的情况下可能会再次发生这种情况(由于心跳 ping 超时)
我有一段时间无法再次访问此设置,并且想重复该测试。
配置设置是否正确?
损坏是我手动测试的结果吗?
有没有比停止心跳服务并让其运行 haresources 命令更好的方法来测试故障转移?
答案1
这可能没什么帮助,但最近在起搏器和Linux 高可用性邮件列表。
我不太擅长使用心跳,但使用起搏器时,我会设置一个约束,使集群资源管理器在尝试切换之前使用对磁盘的写锁来刷新磁盘(或暂时关闭 mysql),然后在切换完成后释放锁。
答案2
从我读过的所有内容以及我对心跳的有限经验来看,要从一台服务器手动故障转移到另一台服务器,你所要做的就是发出
service heartbeat stop
命令。haresources 文件中的所有内容都将由 heartbeat 控制。例如,我正在设置一个集群,需要运行以下服务:
snmpd
mysql
这是 haresources 配置
localhost00 \
drbddisk::home \
Filesystem::/dev/drbd0::/opt/local::ext3::defaults \
drbddisk::perf \
Filesystem::/dev/drbd1::/opt/local/perf::ext3::noatime,data=writeback \
IPaddr::1.1.1.1/24 \
mysqld \
snmpd
这是我得到的结果(如果它很混乱,我很抱歉,我无法在正确的位置设置换行符):
[root@localhost00 ~]# service snmpd status
snmpd (pid 18558) is running...
[root@localhost00 ~]# service mysqld status
mysqld (pid 18509) is running...
[root@localhost00 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
m:res cs st ds p mounted fstype
0:home Connected Primary/Secondary UpToDate/UpToDate C /opt/local ext3
1:perf Connected Primary/Secondary UpToDate/UpToDate C /opt/local/perf ext3
[root@localhost00 ~]# service heartbeat stop
Stopping High-Availability services:
[ OK ]
[root@localhost00 ~]# service snmpd status
snmpd is stopped
[root@localhost00 ~]# service mysqld status
mysqld is stopped
[root@localhost00 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
m:res cs st ds p mounted fstype
0:home Connected Secondary/Secondary UpToDate/UpToDate C
1:perf Connected Secondary/Secondary UpToDate/UpToDate C
[root@localhost00 ~]#
[root@zenoss00 ~]# service heartbeat start
Starting High-Availability services:
[ OK ]
[root@zenoss00 ~]# service snmpd status
snmpd is stopped
[root@zenoss00 ~]# service mysqld status
mysqld is stopped
[root@zenoss00 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-bu
m:res cs st ds p mounted fstype
0:zenhome Connected Secondary/Secondary UpToDate/UpToDate C
1:zenperf Connected Secondary/Secondary UpToDate/UpToDate C
[root@zenoss00 ~]# service snmpd status
snmpd (pid 23055) is running...
[root@zenoss00 ~]# service mysqld status
mysqld (pid 23006) is running...
[root@zenoss00 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17
m:res cs st ds p mounted fstype
0:zenhome Connected Primary/Secondary UpToDate/UpToDate C /opt/zenoss ext3
1:zenperf Connected Primary/Secondary UpToDate/UpToDate C /opt/zenoss/perf ext3
[root@zenoss00 ~]#
请注意,停止 heartbeat 会停止所有分配给 heartbeat 的服务(mysqld、snmpd);还请注意 drbd 仍在运行,而 heartbeat 并未停止它。DRBD 需要一直运行才能使故障转移正常工作。
再次尝试故障转移,但不要运行 drbd 命令,我认为您可以避免数据损坏。
答案3
测试心跳的方式是在一台机器上发出服务心跳停止命令,它会故障转移到另一台机器并自动启动另一个节点上的所有服务,而且您不想关闭 drbd 服务。
另一种测试方法是在一台机器上进行硬重启。