zoukankan      html  css  js  c++  java
  • drbd脑裂问题处理

    http://blog.csdn.net/heianemo/article/details/8439813

    split brain实际上是指在某种情况下,造成drbd的两个节点断开了连接,都以primary的身份来运行。当drbd某


    primary节点连接对方节点准备发送信息的时候如果发现对方也是primary状态,那么会会立刻自行断开连接,并认定


    当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping


    connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是


    StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。


     


    mfs-master�0�2为主,mfs-log为辅;我个人觉得这个DRBD脑裂的行为,也应该是前期人为或是故障切换造成的,


    如HA。今天在做HA+DRBD+MFS的时候,模拟mfs-master宕机看是否会自动切换的时候出现了drbd错误


    在mfs-master机上�0�2断开primary�0�2�0�2down机或是断开网线


    查看secondary机器的状态






    查看挂载




    [root@mfs-log mfs]# �0�2mount
    /dev/drbd1 on /usr/local/mfs type ext3 (rw)
    挂载也成功了,但是数据有问题,所以就先恢复mfs-master的drbd,我这里也就是启用网卡


    原来的primary机器好了,出现脑裂了drbd1现在是standalone,这个时候,主跟辅是不会相互联系的






    [root@mfs-master ~]# service drbd status
    drbd driver loaded OK; device status:
    version: 8.3.13 (api:88/proto:86-96)
    GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-
    05-07 11:56:36
    m:res cs ro ds p mounted fstype
    1:r0 StandAlone Primary/Unknown UpToDate/DUnknown r----- ext3
    这个时候,如果尝试把drbd2的drbd服务重启的话,你就会发现根本无法起来!


    [root@mfs-log mfs]# 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 0 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 'r0'; 0 sec -> wait forever)
    To abort waiting enter 'yes' [ 487]:
    原因分析


    由于节点重启导致数据不一致,而配置文件中没有配置自动修复错误的内容,因而导致握手失败,数据无法同步。


    split brain有两种解决办法:手动处理和自动处理。


    手动处理:


    两端节点上停止heartbeat


    Heartbeat会锁定资源,只有停止后才能释放


    [root@mfs-master ~]#�0�2/etc/init.d/heartbeat stop
    在作为mfs-log的节点上放弃该资源的数据


    [root@mfs-log ~]# drbdadm disconnect r0
    [root@mfs-log ~]# drbdadm secondary r0
    [root@mfs-log ~]# drbdadm -- --discard-my-data connect r0
    然后在mfs-master(drbd1)上重连接资源:


    [root@mfs-master ~]# drbdadm disconnect r0
    [root@mfs-master ~]# drbdadm connect r0
    把mfs-master设置为主节点


    [root@mfs-master ~]# drbdadm primary r0
    启动mfs-log(drbd2)上的drbd服务


    [root@mfs-log mfs]# service drbd start
    Starting DRBD resources: [ n(r0) ].
    (实际采用的恢复方法)


    先选择好一个备机,在备机上执行:


    drbdadm secondary r0
    drbdadm disconnect r0
    drbdadm -- --discard-my-data connect r0
    在主上执行:


    drbdadm connect r0
    查看主节点的状态�0�2显示为Primary,已经恢复了正常


    [root@mfs-master ~]# cat /proc/drbd
    version: 8.3.13 (api:88/proto:86-96)
    GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-
    05-07 11:56:36
    1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:28672 nr:0 dw:1 dr:28805 al:1 bm:4 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
    然后查看备份机的状态:显示Secondary,恢复正常


    [root@mfs-log ~]# cat /proc/drbd
    version: 8.3.13 (api:88/proto:86-96)
    GIT-hash: 83ca112086600faacab2f157bc5a9324f7bd7f77 build by mockbuild@builder10.centos.org, 2012-
    05-07 11:56:36
    1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:0 nr:28672 dw:28672 dr:0 al:0 bm:4 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
    自动处理


    通过/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的策略执行,并丢弃其他节点。

  • 相关阅读:
    自动化运维与Saltstack
    keepalived+nginx 高可用集群
    Nginx集群(负载均衡)
    Nginx优化
    Nginx管理(一)
    业务环境、测试、上线逻辑
    服务器部署逻辑
    python面试题——爬虫相关
    springmvc文件上传
    springmvc入门
  • 原文地址:https://www.cnblogs.com/linkenpark/p/7422963.html
Copyright © 2011-2022 走看看