ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage

04 Split Brain脑裂处理

脑裂的状态

split brain实际上是指在某种情况下,造成drbd的两个节点断开连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准备发送信息的时候,如果发现对方也是primary状态,那么会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:

"Split-Brain detected,dropping connection!"

当发生split brain之后,如果查看连接状态,其中至少会有一个是StandAlone状态,另外一个可能也是StandAlone(如果是同时发现split brain状态),也有可能是WFConnection的状态。

脑裂自动解决策略

如果在配置文件中配置了自动解决split brain(好像linbit不推荐这样做),drbd会自行解决split brain问题,可通过如下策略进行配置。

  1. Discarding modifications made on the “younger” primary。在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD会丢弃最后切换到主节点上的主机所修改的数据。
  2. Discarding modifications made on the “older” primary. 在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD丢弃首先切换到主节点上的主机后所修改的数据。
  3. Discarding modifications on the primary with fewer changes.在这种模式下,当网络重新建立连接并且发现了裂脑,DRBD会比较两台主机之间修改的数据量,并丢弃修改数据量较少的主机上的所有数据。
  4. Graceful recovery from split brain if one host has had no intermediate changes.在这种模式下,如果其中一个主机在脑裂期间并没有数据修改,DRBD会自动重新进行数据同步,并宣布脑裂问题已解决。(这种情况几乎不可能存在)

手动解决脑裂(建议)

自动裂脑自动修复能不能被接受取决于个人应用。考虑建立一个DRBD的例子库。在“丢弃修改比较少的主节点的修改”兴许对web应用好过数据库应用。与此相反,财务的数据库则是对于任何修改的丢失都是不能容忍的,这就需要不管在什么情况下都需要手工修复裂脑问题。

因此需要在启用裂脑自动修复前考虑你的应用情况。如果没有配置split brain自动解决方案,我们可以手动解决。首先我们必须要确定哪一边应该作为解决问题后的primary,一旦确定好这一点,那么我们同时也就确定接受丢失。

在split brain之后,另外一个节点上面所做的所有数据变更了。当这些确定下来后,就可以通过以下操作来恢复了:

1)首先在确定要作为secondary的节点上面切换成secondary,并放弃该资源的数据:

# 1. 断开连接

[root@master2 ~]# drbdadm disconnect data  # data为资源名称

# 2.设置为secondary状态

[root@master2 ~]# drbdadm secondary data

# 3. 告诉slave,secondary 上的数据不正确,以primary 上的数据为准

[root@master2 ~]# drbdadm -- --discard-my-data connect data  #注意中间的四个中间线

2)在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)

[root@master1 ~]# drbdadm connect data

当作完这些动作之后,从新的primary到secondary的re-synchnorisation会自动开始。