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
     logfacility local0
    保持活力1
    死亡时间30
     warntime 10
     initdead 120
    支持694
     bcast eth0,eth4  
     auto_failbackclosures
    节点db1
    节点db2
     respawn hacluster / usr / lib64 / heartbeat / ipfail
     apiauth ipfail gid = haclient uid = hacluster
    死5 

在testing机器间的故障转移时,我在db2上运行以下命令:

 服务心跳停止
    服务mysqld停止
     drbdadm下了mysql
    服务drbd停止 

/ proc / drbd上报db1

  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. 当DRBD被MySQL使用时,DRBD将磁盘与文件系统断开连接,因为干净的MySQL关机不会导致数据损坏
  2. 心跳控制DRBD,并停止心跳服务“DRBD拔出插头”
  3. 这可能会在实际故障切换的情况下再次发生(由于心跳ping超时)

我有一段时间没有再次访问此设置,并想重复testing。

configuration设置是否正确?

腐败是我手动testing的结果吗?

有没有更好的方法来testing故障转移,而不是停止心跳服务,让它运行haresources命令?

这可能不是一个很大的帮助,但最近在Pacemaker和Linux-HA邮件列表中已经广泛讨论了这个问题。

心跳不是很好,但是对于心脏起搏器,我会设置一个约束,导致群集资源pipe理器在尝试切换之前用磁盘锁写入磁盘(或暂时closuresmysql)刷新磁盘,然后释放一旦交换机完成就locking。

从我读过的所有东西,以及我心中有限的经验,所有你应该做的从一台服务器手动故障转移到另一台是问题

service heartbeat stop 

命令。 您的haresources文件中的所有内容都将由心跳控制。 举个例子,我有一个我正在build立的集群需要运行以下服务:

 snmpd mysql 

这里是haresourcesconfiguration

 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 

这里是我得到的结果(我的appologies,如果是一团糟,我不能在正确的位置获得换行符):

 [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 ~]# 

注意停止心跳停止了所有分配给心跳的服务(mysqld,snmpd); 还注意到drbd仍在运行,心跳不停止。 DRBD需要运行整个故障转移工作。

再次尝试你的故障转移,但不要运行drbd命令,我想你会避免你的数据损坏。

testing心跳的方法是,您将在一台机器上发出服务心跳停止,并将其切换到另一台机器,并自动启动另一台节点上的所有服务,同时您也不希望closuresdrbd服务。

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