MySQL DRBD Heartbeat 故障转移脚本导致数据丢失

MySQL DRBD Heartbeat 故障转移脚本导致数据丢失

使用 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 和偶尔的备份),但问题是怎么发生的呢?

我推测:

  1. 当 MySQL 使用磁盘时,DRBD 会断开磁盘与文件系统的连接,因为干净的 MySQL 关闭不会导致数据损坏
  2. 心跳控制 DRBD,停止心跳服务会“切断”DRBD 的电源
  3. 在实际故障转移的情况下可能会再次发生这种情况(由于心跳 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 服务。

另一种测试方法是在一台机器上进行硬重启。

相关内容