认识DRDB并应用-2:解决脑裂问题

DRBD脑裂(split brain)
脑裂实际上是指在某种情况下,造成DRBD的两个节点断开连接,都以primary的身份来运行。当DRBD某primary节点连接对方节点准备发送信息的时候,如果发现对方也是primary状态,那么会立刻自行断开连接,并认定当前已经发生split brain,这时候会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。

对于脑裂,DRBD有四中处理方式:

  • 新成为主节点的把数据丢弃,再同步老节点的数据
  • 把老的主节点的数据丢弃,再同步新节点的数据
  • 谁的数据修改的少,谁主动丢弃数据
  • 如果有个节点从没发生过数据修改,那就不用动

​ 自动裂脑自动修复能不能被接受取决于对数据丢失的容忍性。例如,财务的数据库对于任何修改的丢失都是不能容忍的,这 表示不管在什么情况下都需要手工修复裂脑问题。因此,是否启用裂脑自动修复需要考虑具体情况。

今天遇到了openfiler HA(双活)集群中的DRBD服务出现了脑裂。下面是手动解决过程:

资源定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@filer91 ~]# vi /etc/drbd.conf 
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example

include "drbd.d/global_common.conf";
#include "drbd.d/*.res";
resource meta {
on filer91 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.10.100.91:7788;
meta-disk internal;
}
on filer92 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.10.100.92:7788;
meta-disk internal;
}
}
resource data {
on filer91 {
device /dev/drbd1;
disk /dev/vg00/lv0;
address 10.10.100.91:7789;
meta-disk internal;
}
on filer92 {
device /dev/drbd1;
disk /dev/vg00/lv0;
address 10.10.100.92:7789;
meta-disk internal;
}
}
问题描述:

在其中一台机器重启后或心跳网络出现问题都有可能造成脑裂现象;(节点中出现Unknown)

1
2
3
4
5
6
7
[root@filer92 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.10 (api:88/proto:86-96)
GIT-hash: 5c0b0469666682443d4785d90a2c603378f9017b build by phil@fat-tyre, 2011-01-28 12:17:35
m:res cs ro ds p mounted fstype
0:meta WFConnection Secondary/Unknown UpToDate/DUnknown C
1:data StandAlone Secondary/Unknown UpToDate/DUnknown r-----
1
2
3
[root@filer91 ~]# drbd-overview                           
0:meta StandAlone Primary/Unknown UpToDate/DUnknown r----- /meta ext3 496M 17M 454M 4%
1:data StandAlone Primary/Unknown UpToDate/DUnknown r----- lvm-pv: data 0.29g 0.29g
处理方法:

选择次要节点(数据不准确的节点)

1
2
3
4
5
6
[root@filer92 ~]# drbdadm disconnect meta
[root@filer92 ~]# drbdadm disconnect data
[root@filer92 ~]# drbdadm secondary meta
[root@filer92 ~]# drbdadm secondary data
[root@filer92 ~]# drbdadm -- --discard-my-data connect meta
[root@filer92 ~]# drbdadm -- --discard-my-data connect data

以上命令先是断开filer92节点的drbd连接,在设置该节点为secondary,最后通知drbd服务废弃该节点数据。

选择主节点并重新连接所有资源。

1
[root@filer91 ~]# drbdadm connect all
1
2
3
[root@filer91 ~]# drbd-overview      
0:meta Connected Primary/Secondary UpToDate/UpToDate C r----- /meta ext3 496M 17M 454M 4%
1:data Connected Primary/Secondary UpToDate/UpToDate C r----- lvm-pv: data 0.29g 0.29g
1
2
3
4
5
6
7
[root@filer92 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.3.10 (api:88/proto:86-96)
GIT-hash: 5c0b0469666682443d4785d90a2c603378f9017b build by phil@fat-tyre, 2011-01-28 12:17:35
m:res cs ro ds p mounted fstype
0:meta Connected Secondary/Primary UpToDate/UpToDate C
1:data Connected Secondary/Primary UpToDate/UpToDate C

至此DRBD的脑裂问题已经解决。

还可以重新同步数据:

1
[root@filer91 ~]# drbdadm invalidate all

认识DRDB并应用-2:解决脑裂问题
http://anximin.github.io/2021/08/05/Linux_drbd_naolie/
作者
Sylar
发布于
2021年8月5日
许可协议