潇湘夜雨移动版

主页 > 软件与服务 >

drbd脑裂问题

drbd1为主,drbd2为辅;我个人觉得这个DRBD脑裂的行为,也应该是前期人为或是故障切换造成的,
如HA。 如果对HA及DRBD架构不太熟,随便切换HA节点,操作不当的话容易出现问题。
下面模拟一下这个问题: 
 
1、断开primary 
down机或是断开网线 
2、查看secondary机器的状态 
[root@drbd2 ~]# drbdadm role fs 
Secondary/Unknown 
 
[root@drbd2 ~]# cat /proc/drbd  
version: 8.3.11 (api:88/proto:86-96) 
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by root@drbd2.localdomain, 2011-07-08 11:10:20 
#注意下drbd2的cs状态 
 1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r----- 
    ns:567256 nr:20435468 dw:21002724 dr:169 al:229 bm:1248 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 
 
将secondary配置成primary角色 
[root@drbd2 ~]# drbdadm primary fs 
[root@drbd2 ~]# drbdadm role fs 
Primary/Unknown 
[root@drbd2 ~]# cat /proc/drbd  
version: 8.3.11 (api:88/proto:86-96) 
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by root@drbd2.localdomain, 2011-07-08 11:10:20 
 
 1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----- 
    ns:567256 nr:20435468 dw:21002724 dr:169 al:229 bm:1248 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 
#挂载 
[root@drbd2 ~]# mount /dev/drbd1 /mnt/ 
[root@drbd2 ~]# cd /mnt/ 
[root@drbd2 mnt]# ll 
total 102524 
-rw-r--r-- 1 root root 104857600 Jul  8 12:35 100M 
drwx------ 2 root root     16384 Jul  8 12:33 lost+found 
 
#原来的primary机器好了,出现脑裂了。   
[root@drbd1 ~]# tail -f /var/log/messages  
Jul  8 13:14:01 localhost kernel: block drbd1: helper command: /sbin/drbdadm initial-split-brain minor-1 exit code 0 (0x0) 
Jul  8 13:14:01 localhost kernel: block drbd1: Split-Brain detected but unresolved, dropping connection! 
Jul  8 13:14:01 localhost kernel: block drbd1: helper command: /sbin/drbdadm split-brain minor-1 
Jul  8 13:14:01 localhost kernel: block drbd1: helper command: /sbin/drbdadm split-brain minor-1 exit code 0 (0x0) 
Jul  8 13:14:01 localhost kernel: block drbd1: conn( NetworkFailure -> Disconnecting )  
Jul  8 13:14:01 localhost kernel: block drbd1: error receiving ReportState, l: 4! 
Jul  8 13:14:01 localhost kernel: block drbd1: Connection closed 
Jul  8 13:14:01 localhost kernel: block drbd1: conn( Disconnecting -> StandAlone )  
Jul  8 13:14:01 localhost kernel: block drbd1: receiver terminated 
Jul  8 13:14:01 localhost kernel: block drbd1: Terminating receiver thread 
 
[root@drbd1 ~]# drbdadm role fs 
Primary/Unknown 
 
[root@drbd2 mnt]# drbdadm role fs 
Primary/Unknown 
 
#drbd1现在是standalone,这个时候,主跟辅是不会相互联系的。 
[root@drbd1 ~]# cat /proc/drbd  
version: 8.3.11 (api:88/proto:86-96) 
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by root@drbd1.localdomain, 2011-07-08 11:10:38 
 
 1: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown   r----- 
    ns:20405516 nr:567256 dw:567376 dr:20405706 al:2 bm:1246 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 
 
[root@drbd1 /]# service drbd status 
drbd driver loaded OK; device status: 
version: 8.3.11 (api:88/proto:86-96) 
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by root@drbd1.localdomain, 2011-07-08 11:10:38 
m:res  cs          ro               ds                 p       mounted  fstype 
1:fs   StandAlone  Primary/Unknown  UpToDate/DUnknown  r-----  ext3 
  
这个时候,如果用户有尝试把drbd2的drbd服务重启的话,你就会发现根本无法起来! 
[root@drbd2 /]# service drbd start 
Starting DRBD resources: [ ].......... 
*************************************************************** 
 DRBD's startup script waits for the peer node(s) to appear. 
 - In case this node was already a degraded cluster before the 
   reboot the timeout is 120 seconds. [degr-wfc-timeout] 
 - If the peer was available before the reboot the timeout will 
   expire after 0 seconds. [wfc-timeout] 
   (These values are for resource 'fs'; 0 sec -> wait forever) 
 To abort waiting enter 'yes' [ -- ]:[  13]:[  15]:[  16]:[  18]:[  19]:[  20]:[  22]: 
 
在drbd2处理方法: 
[root@drbd2 /]# drbdadm disconnect fs 
[root@drbd2 /]# drbdadm secondary fs 
[root@drbd2 /]# drbdadm -- --discard-my-data fs 
做完以上三步,你发现你仍然无法启动drbd2上的drbd服务;上次一客户我个人估计就是这个问题,把DRBD重启后,无法启动DRBD。 
把他们DBA急的要死。呵呵
 注意如果dubd做了HA,应该先停止HA,再处理脑裂问题。
 
需要在drbd1上重连接资源: 
[root@drbd1 ~]# drbdadm connect fs 
 
再次启动drbd2上的drbd服务,成了。 
[root@drbd2 /]# service drbd start 
Starting DRBD resources: [ ]. 
 
再看看资源同步: 
[root@drbd2 /]# cat /proc/drbd  
version: 8.3.11 (api:88/proto:86-96) 
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by root@drbd2.localdomain, 2011-07-08 11:10:20 
 
 1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r----- 
    ns:0 nr:185532 dw:185532 dr:0 al:0 bm:15 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:299000 
        [======>.............] sync'ed: 39.5% (299000/484532)K 
        finish: 0:00:28 speed: 10,304 (10,304) want: 10,240 K/sec 
 
补充:虽然是手工模拟但在故障切换时也会出一样的问题。
1、DRBD的资源只能在或主或辅的一台机器上挂载。
2、在做主辅的手工切换时的步骤:
a、先将原来挂载的东西进行卸载,这个时候你的应用会停,不建议手工切换主辅
b、将原来的主设置成辅 #drbdadm secondary resource_name
c、将原来的辅设置成主 #drbdadm primary resource_name
d、挂载资源  
自动恢复脑裂的策略配置:
通过/etc/drbd.conf配置中设置自动处理策略,在发生数据不一致时自动处理。自动处理策略定义如下:
1 after-sb-0pri.
当两个节点的状态都是secondary时,可以通过after-sb-0pri策略自动恢复。
1)disconnect
默认策略,没有自动恢复,简单的断开连接。
2)discard-younger-primary
在split brain发生前从主节点自动同步。
3)discard-older-primary
在split brain发生时从变成primary的节点同步数据。
4)discard-least-changes
在split brain发生时从块最多的节点同步数据。
5)discard-node-NODENAME
自动同步到名字节点
2 after-sb-1pri
当两个节点的状态只有一个是primary时,可以通过after-sb-1pri策略自动恢复。
1)disconnect
默认策略,没有自动恢复,简单的断开连接。
2)consensus
丢弃secondary或者简单的断开连接。
3)discard-secondary
丢弃secondary数据。
4)call-pri-lost-after-sb
按照after-sb-0pri的策略执行。
3 after-sb-2pri
当两个节点的状态都是primary时,可以通过after-sb-2pri策略自动恢复。
1)disconnect
默认策略,没有自动恢复,简单的断开连接。
2)violently-as0p
按照after-sb-0pri的策略执行。
3)call-pri-lost-after-sb
按照after-sb-0pri的策略执行,并丢弃其他节点。
配置自动恢复
编辑/etc/drbd.conf,找到resource r0部分添加到net选项里面,配置策略如下,所有节点完全一致。
#after-sb-0pri disconnect;
after-sb-0pri discard-younger-primary;
注:当两个节点的状态都是secondary时,可以通过after-sb-0pri策略自动恢复
在split brain发生前从主节点自动同步。
#after-sb-1pri disconnect;
after-sb-1pri discard-secondary;
注:当两个节点的状态只有一个是primary时,可以通过after-sb-1pri策略自动恢复。
丢弃secondary数据。
#after-sb-2pri disconnect;
after-sb-2pri call-pri-lost-after-sb;
注:当两个节点的状态都是primary时,可以通过after-sb-2pri策略自动恢复。
按照after-sb-0pri的策略执行,并丢弃其他节点
 
centos中提供的8.3.2有bug,有$DRBD_PEER变量没有设置的问题,可以查看相关change记录,折磨我两天在网上没有找到解决方法,最后好找了新版本打了rpm包
drbd和heartbeat安装都不是很难,网上文档很多我不在重述,最头疼的是裂脑问题(split-brain), 网上对这些设置最多也就是一笔带过下面是一段我的配置文件。
    handlers {
        pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
        pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
        local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
        split-brain "/usr/lib/drbd/notify-split-brain.sh root";
        ....
    }
        net {
                #after-sb-0pri discard-younger-primary;
                after-sb-0pri discard-older-primary;
                after-sb-1pri discard-secondary;
                after-sb-2pri call-pri-lost-after-sb;
        }
 
在net中after-sb-(0-2)pri是只当出现几个primary的时候进行的操作,相关的配置参数请查看官方文档,
我选择当两个都是secondary的时候我选择了discard-older-primary就是说丢弃两个服务器中比较早的
那个primary设置,选者最近的作为primary那个机器为primary(最新原则)
有一个是primary和一个secondary的时候我选择了discard-secondary那么就保持了primary不变(正常保持)
如果出现两个primary的时候(裂脑)这是我选择了call-pri-lost-after-sb,会根据after-sb-0pri设置来选择哪个为primary,
然后在为secondary的机器上执行handlers中pri-lost-after-sb配置中命令然后强行快速重启机器 (裂脑强行最新)
其它请自己看配置文档,参考这种思路来解决,当然出现脑裂这些方法还不能完全无误的解决问题,所以你可以根据自己写一些脚本来控制
官网中队自动脑裂的修复:http://www.drbd.org/en/doc/users-guide-83/s-configure-split-brain-behavior#s-split-brain-notification
 
 
(责任编辑:liangzh)