一、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)