一次Drbd同步故障定位过程
实验室有两台Dell R710做Redhat Cluster。一次电源改造升级,重启机器以后导致IP地址混乱(在启动脚本中重复添加了IP地址),使服务异常。在恢复服务的过程中先后启动了几次服务器,最后发现drbd不同步了,故事的悲剧开始上演了。好在最后发现是双网卡配置同网段的IP地址,且都连接到同一个交换机上,导致的drbd同步失败。
起初根据经验,如果Cluster出现故障,通常情况下重启一下机器就可以解决,但是反复倒腾了几个小时都没有搞定,包括直接强制重建md和重建逻辑卷。初始安装时,drbd安装成功,数据同步也成功. 重启其中一台机器后,发现drbd还是可以同步,但是被我倒腾了一番后就没有同步了,大体情况如下:
[root@AS-1 conf]# drbd-overview.pl
1:ompm WFBitMapS Secondary/Secondary UpToDate/Inconsistent C r—
2:omgm WFBitMapS Secondary/Secondary UpToDate/Inconsistent C r—
3:omem NetworkFailure Secondary/Unknown UpToDate/Inconsistent C r—
4:omrm WFBitMapS Secondary/Secondary UpToDate/Inconsistent C r—
5:ombm WFConnection Secondary/Unknown UpToDate/Outdated C r—
机器配置:
AS-1:
eth0: 192.168.1.100
eth1: 192.168.1.110
gw 192.168.1.1 eth0
AS-2:
eth0: 192.168.1.101
eth1: 192.168.1.111
gw 192.168.1.1 eth0
drbd.conf 配置情况(只是表面管理的逻辑卷):
drbd1:ompm /dev/VolGroup00/lvompm
drbd2:omgm /dev/VolGroup00/lvomgm
drbd3:omem /dev/VolGroup00/lvomem
drbd4:omrm /dev/VolGroup00/lvomrm
drbd5:ombm /dev/VolGroup00/lvombm
心跳线使用的是 eth1
将drbd 所有的resource都重新创建一遍,问题依旧。不过有的时候个别resource在同步,且同步非常慢,个别resource又StandAlone,总之状态多种多样,就是没有全部SyncSource的。正常情况下,启动drbd后,应该是所有resource都在进行SyncSource才对。看到居然出现“NetworkFailure”,其他办法都解决不了,那么就只好把问题锁定在它上面了。可能是eth0和eth1都处于同一个网段,切心跳线在eth1上,而不在eth0上,导致数据路由出现故障。
于是将心跳IP地址设置为eth0的地址,重新做一遍,问题依然没有解决。只要把eth1给停止掉了。
[root@AS-1 conf]# ifdown eth1
开始重建resource.
1. 备份Primary主机上的磁盘数据,或者你知道的最新的数据所在主机上执行备份
[root@AS-1 conf]# drbdadm primary ompm
[root@AS-1 conf]# drbdadm primary omgm
[root@AS-1 conf]# drbdadm primary omem
[root@AS-1 conf]# drbdadm primary omrm
[root@AS-1 conf]# drbdadm primary ombm
[root@AS-1 conf]# mount /dev/drbd1 /var/pm
[root@AS-1 conf]# mount /dev/drbd2 /var/gm
[root@AS-1 conf]# mount /dev/drbd3 /var/em
[root@AS-1 conf]# mount /dev/drbd4 /var/rm
[root@AS-1 conf]# mount /dev/drbd5 /var/bm
[root@AS-1 conf]# cp -r /var/pm /var/gm /var/em /var/rm /var/bm /root/temp
[root@AS-1 conf]# umount /var/pm
[root@AS-1 conf]# umount /var/gm
[root@AS-1 conf]# umount /var/em
[root@AS-1 conf]# umount /var/rm
[root@AS-1 conf]# umount /var/bm
[root@AS-1 conf]#
2. 在所有主机上执行
[root@AS-1 conf]# service drbd stop
[root@AS-1 conf]# lvremove -f /dev/VolGroup00/lvompm
[root@AS-1 conf]# lvremove -f /dev/VolGroup00/lvomgm
[root@AS-1 conf]# lvremove -f /dev/VolGroup00/lvomem
[root@AS-1 conf]# lvremove -f /dev/VolGroup00/lvomrm
[root@AS-1 conf]# lvremove -f /dev/VolGroup00/lvombm
[root@AS-1 conf]# lvcreate -L 512M -n lvompm VolGroup00
[root@AS-1 conf]# lvcreate -L 2G -n lvomgm VolGroup00
[root@AS-1 conf]# lvcreate -L 2G -n lvomem VolGroup00
[root@AS-1 conf]# lvcreate -L 2G -n lvomrm VolGroup00
[root@AS-1 conf]# lvcreate -L 2G -n lvombm VolGroup00
[root@AS-1 conf]# drbdadm — –force create-md ompm
[root@AS-1 conf]# drbdadm — –force create-md omgm
[root@AS-1 conf]# drbdadm — –force create-md omem
[root@AS-1 conf]# drbdadm — –force create-md omrm
[root@AS-1 conf]# drbdadm — –force create-md ombm
[root@AS-1 conf]# service drbd start
3. 在Primary主机上执行
[root@AS-1 conf]# drbdsetup /dev/drbd1 primary -o
[root@AS-1 conf]# drbdsetup /dev/drbd2 primary -o
[root@AS-1 conf]# drbdsetup /dev/drbd3 primary -o
[root@AS-1 conf]# drbdsetup /dev/drbd4 primary -o
[root@AS-1 conf]# drbdsetup /dev/drbd5 primary -o
[root@AS-1 conf]# drbd-overview.pl
1:ompm SyncSource Primary/Secondary UpToDate/Inconsistent C r—
2:omgm SyncSource Primary/Secondary UpToDate/Inconsistent C r—
3:omem SyncSource Primary/Secondary UpToDate/Inconsistent C r—
4:omrm SyncSource Primary/Secondary UpToDate/Inconsistent C r—
5:ombm SyncSource Primary/Secondary UpToDate/Inconsistent C r—
看到所有resource都处于SyncSource状态,问题终于解决了。
4. 等到所有状态都显示Connected 以后,就可以格式磁盘,恢复数据了。
[root@AS-1 conf]# mkfs.ext3 -j /dev/drbd1
[root@AS-1 conf]# mkfs.ext3 -j /dev/drbd2
[root@AS-1 conf]# mkfs.ext3 -j /dev/drbd3
[root@AS-1 conf]# mkfs.ext3 -j /dev/drbd4
[root@AS-1 conf]# mkfs.ext3 -j /dev/drbd5
[root@AS-1 conf]# cp -r /root/temp/* /var
如果文件归属的用户不是root,还需要修改文件属主
[root@AS-1 conf]# chown ldap:ldap /var/pm
至此,数据得以恢复同步和还原了。
这里主要是因为网络配置的问题,导致的drbd无法同步。当然,如果只是遇到脑裂(split brain),可以不这么费事,可以参考如下方式解决。(参考:http://www.chineselinuxuniversity.net/articles/18270.shtml)
首先确定哪一边应该作为解决问题后的primary,通常选用数据最新的一方:
1. 在将作为secondary的节点上执行:
[root@AS-1 conf]# drbdadm secondary Resource_name
[root@AS-1 conf]# drbdadm — –discard-my-data connect Resource_name
2. 在将作为primary的节点上执行(如果这个节点当前的连接状态为WFConnection的话,则不用执行)
[root@AS-1 conf]# drbdadm connect Resource_name
通常情况下这样的操作完成以后,drbd会自动开始同步。查看方法:
[root@AS-1 conf]# cat /pro/drbd
[root@AS-1 conf]# cat /pro/drbd