一、DRBD数据不⼀致时如何⼿⼯同步

⼿⼯同步的策略⼀般是选择丢弃其中⼀个节点上的数据,把另⼀个节点的数据同步过来。

由于两个节点都有新的数据,丢弃⼀个节点的数据意味着会有部分数据的丢失,这是DRBD脑裂恢复必须付出的代价。

1.1、确定保留哪个节点的数据

在⼿⼯同步前,需要先确定保留哪个节点的数据。⼀般情况下,保留当前正在提供服务的节点的数据。

因为被放弃的数据是找不回来的,所以放弃数据时需要慎重。最好先检查⼀下,服务的数据是否正常,如果使⽤数据库,还需要检查⼀下,数据库的⽇志是否有错误。确保保留数据的节点是可以正常⼯作的。

这⾥假定保留数据的节点为ha01,放弃数据的节点为ha02。

1.2、将DRBD上的服务切换到保留的节点

  • 如果服务已经在保留数据的节点(ha01)上运⾏,跳过这个步骤,进⼊下⼀个步骤。

  • 如果服务在放弃数据的节点(ha02)上运⾏,那么需要先将其切换到保留数据的节点(ha01)上。

在HA网页上切换服务到ha01节点,检查服务状态,等待服务在ha01上启动成功(变为started 状态)

1.3、设置全局禁⽤

在ha01服务器上执⾏:

# hasvcadm --global --disable

  • 注意:您也可以在HA网页上设置全局禁用;

1.4、确保drbdx的primary端正处于WFConnection状态

在两个节点执⾏如下命令:

# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 98b5d02dac32c415c6089b7e8f6e3b4b1d716bf4 build by support@skybilityha.com, 2018-05-14 17:19:11
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown A r-----
ns:0 nr:0 dw:48116 dr:122880 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0d

查看drbdx是否处于WFConnection状态,如果是,就直接进⼊下⼀个步骤。

如果不是,再在对应节点上执⾏如下命令,让drbdx资源变成WFConnection 状态,然后进⼊下⼀个步骤。

drbdadm disconnect drbd0 &>/dev/null
drbdadm connect drbd0

1.5、放弃secondary端的数据

在ha02节点上执⾏:

# hadmctl --forcesecondary drbd0

1.6、触发同步

在ha01节点上执⾏:

# drbdadm adjust drbd0

在ha01上检查drbd状态:

# cat /proc/drbd

这个时候,DRBD应该会触发同步,等待数据同步完成(UpToDate/UpToDate状态)。

如果DRBD⼀直⽆法连接上,还是DUnknown状态,则可能是两个节点上的数据经过多次变更, 已经⽆法同步了,参照如何处理Unrelated data,aborting错误处理

1.7、取消全局禁⽤

DRBD完成数据同步后,需要取消全局禁⽤,使服务再次接受HA的管理。

# hasvcadm --enable --global

  • 注意:您也可以在HA网页上设置全局禁用;

二、如何处理Unrelated data,aborting错误

本章节假定需要保留ha01节点上的数据,放弃ha02节点上的数据。

2.1、设置全局禁⽤

如果HA在运⾏,则需要设置全局禁⽤,避免drbd/dev⾃动启动,也防⽌在恢复的过程中,发⽣服务切换。 在ha01上执⾏:

# hasvcadm --global --disable

2.2、放弃备机DRBD数据

(1)在ha02上执⾏drbdadm down命令,将drbdX停⽌下来:

# drbdadm down drbd0

(2)在ha02上放弃原有的数据

# dd if=/dev/zero of=/dev/drbd/lower/disk bs=1M count=10

  • 备注: /dev/drbd/lower/disk为DRBD底层设备,通过drbdadm sh-ll-dev drbd0查询。

  • 注意:dd误操作会破坏设备上的数据,⼀定要查清楚drbd0对应的底层设备才操作,千万不要在预定保留数据的节点上执⾏,以防⽌破坏正确的数据。

(3)在ha02节点上重建DRBD:

# drbdadm create-md drbd0

2.3、触发DRBD同步

(1)在ha02节点上发起连接

# drbdadm adjust drbd0

(2)在ha01节点上发起连接,触发同步

# drbdadm adjust drbd0

(3)在ha02节点上查询drbd状态,看是否触发了数据同步(连接状态为Connected或SyncSource),如果触发了配置同步, 则说明操作成功,等待同步完成(变为Connected状态)

# cat /proc/drbd

2.4、取消全局禁⽤

待DRBD同步完成后,取消全局禁⽤

# hasvcadm --enable --global

三、DRBD常用命令

3.1、查看DRBD状态

执⾏cat /proc/drbd查看,该命令的输出如下

[root@ha01 ~]# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
GIT-hash: 0de839cee13a4160eed6037c4bddd066645e23c5 build by root@sles1, 2011-08-10 17:30:07
    0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate B r-----
        ns:0 nr:4 dw:4 dr:5903804 al:0 bm:361 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:385244
        [===============>....] sync'ed: 81.7% (385244/2096348)K
        finish: 0:00:36 speed: 10,608 (10,244) want: 10,240 K/sec

这⾥我们主要关注这⼀⾏(最前⾯的0表⽰drbd0设备):

0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate B r-----

(1)cs表⽰连接状态,常⻅的有:

  • 连接正常:Connected

  • 正在同步:SyncSource/SyncTarget这两个状态都表⽰正在同步, 同步完成后,会变成Connected 状态。

SyncSource,则说明本节点作为数据源,正在往对端同步;

SyncTarget,则说明从对端往本节点同步;

  • 断连状态:WFConnection/StandAlone,看到这种状态,说明DRBD没有连接,需要参照如何解决DRBD DUnknown的问题处理。

(2)ro表⽰DRBD在本节点的⻆⾊

  • Primary表⽰主⽤,应⽤可以在其上运⾏;

  • Secondary表⽰备⽤,只实现数据从主⽤端的同步,不能跑应⽤。

(3)ds表⽰数据的状态,前半部分为本节点的状态,后半部分为对端节点的状态。

  • UpToDate/UpToDate表⽰两个节点的数据是⼀致的

  • Inconsistent/UpToDate表⽰本端数据不可⽤(未同步完成),对端数据是可⽤的,反之亦然。

  • Diskless 如果出现这个状态,说明存储出现了问题,不能访问磁盘。

  • DUnknown 当DRBD不能和对端建⽴连接时,不知道对端处于什么状态,就会显⽰DUnknown,出现这个状态,如果不是⼿⼯执⾏断连命令, 那么可能是⽹络问题,也可能是出现了DRBD脑裂,需要参照如何解决DRBD DUnknown的问题处理。

3.2、发起DRBD连接命令

drbdadm disconnect drbd0
drbdadm connect drbd0

3.3、查询DRBD是否脑裂

判断是否出现脑裂,可以使⽤dmesg|grep drbd0 命令查询(只需要看最后⼀段drbdX的信息)。 如果出现split-brain 打印,则说明出现脑裂:

# dmesg|grep drbd1
[ 183.995307] block drbd1: helper command: /sbin/drbdadm initial-split-brain minor-1 exit code 0 (0x0)