DRBD
注:在本文档中的所有服务的配置都是清除防火墙规则和关闭SELinux后操作的。所用内核版本是2.6.32_279.el6 x86_64

一、 DRBD

1. DRBD概述与工作原理

概述:

DRBD,即Distributed Replicated Block Device分布式复制块设备。它是被设计成构建高可用集群(HA)的一个构建组件的块设备。它通过网络实现块设备数据实时镜像。DRBD可以被理解为一种基于网络的raid-1

从概述来看,DRBD有以下几个特点

l DRBD是一种块设备

可用于高可用集群中(HA

通过网络实现块设备数据实时镜像

类似于一个网络的raid-1

工作特点:

l DRBD工作在内核空间,它镜像复制的是二进制数据,这也是它速度快的根本原因

l DRBD至少需要两个节点来工作。

工作原理图:

DRBD_DRBD

如上图所示,左右两部分相当于两台服务器,黑色箭头代表了各个内核组件之间的数据流方向。橙色箭头代表了通过网络实现的从本地节点到远程节点的实时块设备数据流方向。

DRBD的三种复制模式:

协议A

异步复制协议。当本地磁盘写入完成,并且拷贝数据包进入本地TCP发送缓冲区里后,就认为在主节点的本地写操作完成。这种模式,在发生强制故障转移的时候可能发生数据丢失的现象。协议A常用在长距离复制环境中。当它和DRBD代理结合使用的时候,它成为一个有效的灾难恢复解决方案。

协议B

内存同步复制协议。当本地磁盘写入发生,并且拷贝数据包到达对等层节点时,就认为在主节点中的本地写操作完成。正常情况下,在故障转移事件中,写入的数据不会丢失。然而,如果节点同时停电,主节点的数据存储将发生不可逆的损坏,大部分最近在主节点中写入完成的数据可能会丢失。

协议C

同步复制协议。只有当本地磁盘和远程磁盘都确认写入完成时,就认为在主节点的本地写操作完成。结果,即使一个节点崩溃,也不会丢失任何数据。唯一丢失数据的可能是两个节点同时崩溃。

到目前为止,协议C是安装DRBD是最常使用的复制协议。在部署DRBD是可以根据安

2. DRBD安装与配置

# yuminstall gcc gcc-c++ make glibc flex kernel-devel kernel-headers

Wgethttp://oss.linbit.com/drbd/drbd-8.4.3.tar.gz

tar xvf drbd-8.4.3-C /usr/local/src

cd /usr/local/src/drbd-8.4.3

./configure--prefix=/usr --sysconfdir=/etc--localstatedir=/var --with-km

make

make install

 用modinfo drbd.ko查看drbd内核模块是否编译成功。如果没有成功,则做如下操作

depmod

modprobe drbd

至此DRBD安装完成,接下来是DRBD的配置

准备底层存储设备,在本例中是/dev/sdb1

准备网络配置,本例中,主节点的IP地址是192.168.1.103,备用节点的IP地址是192.168.1.105,并确定77887799的端口号没有被其他的服务所占用。(注:按照惯例DRBD是使用7788端口以上端口的)

配置资源。配置文件/etc/drbd.conf控制DRBD的所有方方面面。正常情况下此配置文件就是一个包含以下两行内容的构架:

include “/etc/drbd.d/global_common.conf”;

include “/etc/drbd.d/*.res”;

按照惯例,/etc/drbd.d/global_common.conf包括DRBD配置的globalcommon这个两部分。而每个.res文件都只包含一个resource部分。

当然也可以直接使用/etc/drbd.conf来配置所有的区段,但是这样会是配置文件看起来很杂乱而且难于管理。因此建议使用多文件分开配置的方法。

Ø global 部分

只有usage-count 与大多数用户相关。它统计用户更新drbd版本的次数。它有两个值 noyes。表示禁用统计yes表示开启。

Ø common 部分

在这个部分里设置的一些配置可以被配置的每个资源所继承。正常情况下这部分的选项设置是设置在/etc/drbd.d/global_common.conf文件中。也可以定义在每个资源中。

Ø resource 部分

资源的名字可以任意指定,但是不能包含US-ASCII字符和空格。每个资源配置必须有两个on <host>子部分。其他的所有的配置可以从common部分继承(如果存在的话)或者使用默认设置。

另外,在两个on<host>子部分相等的选项可以直接在resource部分指定。

以下是配置实例:

编辑/etc/drbd.d/global_common.conf

global {

usage-count yes;

}

common {

net {

protocol C;

}

}

编辑/etc/drbd.d/r0.res(此处将资源文件名命名为r0)

resource r0 {

device /dev/drbd0;

disk/dev/sdb1;

meta-disk internal;

onserver {#此处server是节点的主机名‘uname -n’

Address 192.168.1.103:7789;

}

On clone1 {

Address 192.168.1.105:7789;

}

}

启用资源

 创建设备元数据。这一步必须仅在创建初始化设备时完成。它初始化DRBD元数据。

drbdadm create-md r0

 启用资源

drbdadm up r0

 查看/proc/drbd

cat /proc/drbd

还剩下两步就完成DRBD的全部操作了。

 选择初始的同步源。如果磁盘是空的,无数据的,你可以任意选择同步源。如果一个节点的磁盘有要保存的数据,那就选择有数据的这个节点作为同步源。如果选择错了,则会造成数据丢失。

 启动初始完全同步。这一步必须仅在一个节点,仅在初始化资源配置,和仅在你所选择作为同步源的节点上执行。操作如下:

drbdadm primary --force r0

当执行完上面一条命令后初始完全同步就开始了,可以通过/proc/drbd来监控同步进程。

3. DRBD管理

检查DRBD的状态

drbd-overview#查看DRBD状态最方便的方法

cat /proc/drbd #可以查看DRBD的实时状态

$ cat /proc/drbd

version: 8.4.0(api:1/proto:86-100)

GIT-hash: 09b6d528b3b3de50462cd7831c0a3791abc665c3build by linbit@buildsystem.linbit, 2011-10-12 09:07:35

1: cs:Connected rorimary/Secondary ds:UpToDate/UpToDate C r---

ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0ep:1 wo:b oos:0

Version :表示当前使用的DRBD的版本号

1:指的是/dev/drbd1

cs :connection state,表连接状态

ro:即roles,本地节点和远程节点的角色

ds : disk states,本地和远程节点的硬盘状态

:表示所使用的协议是C

以下六个表示的是I/O状态标记

rs: 表示I/O操作正在进行;s表示I/O挂起,正常的是r

-a: a表示延迟后再同步,-表示正常同步

-p: p表示因为对等层启动同步挂起而引起的数据再同步的情况;-表示正常

-u: u表示因为本地启动同步挂起而引起的数据再同步的情况;-表示正常

-d,b,n,a : d表示因为DRBD内部原因引起的I/O阻塞,类似一种过渡磁盘状态;b表示备用设备I/O正在阻塞;n表示网络套接字的阻塞;a:表示同时发生I/O设备阻塞和网络阻塞

-s :s表示当挂起更新时的活动日志时的标记;正常是-

以下的标记表示的是性能指标

ns:即network send,表示通过网络发送到对等节点的数据量,单位是Kibyte

nr:即network receive,表示通过网络接收来自对等节点的数据量,单位是Kibyte

dw:即disk write,表示写到本地资产的网络数据,单位是Kibyte

dr:即disk read,表示从本地磁盘读出的网络数据,单位是Kibyte

al:即activity log,表示对元数据的活动日志区域的更新数

bm:即bit map,表示对元数据的位图区域的更新数

lo :即local count,表示被DRBD所打开的本地I/O子系统的请求数

pe :即pending,表示发送到对等节点的请求数,但是对等节点还没有做出相应

ua :即unacknowledged,表示对等节点所接受的请求数,但是还没做出相应

ap :即application pending,表示转发到DRBD的块I/O请求数,但是还没有做出相应

ep :即epochs,表示epoch对象的数量,通常当在用 barriernone写的顺序方法而加载I/O的时候会增加

wo :即write order,表示当前所使用的写的顺序方法:bbarrier),fflush),ddrain),nnone

oos :即out of sync,表示当前还没有同步的存储量

drbdadm cstate r0 #也可以查看资源的连接状态

drbdadm role r0#也可以查看资源的角色

drbdadm dstate r0 #查看资源的硬盘状态

启用资源

 若是配置成集群,就是用集群资源管理程序。

 也可在系统启动的时候使用/etc/init.d/drbd初始脚本

 或手动 drbdadm up <resource>/all

禁用资源

drbdadm down <resource>/all 可临时禁用指定的或所用的资源

重新配置资源

注意事项:

 对资源的任何改变,都要包含到/etc/drbd.conf

 将修改的/etc/drbd.conf在两个节点之间进行同步

 分别在两个节点上执行drbdadm adjust<resource>/all命令。

资源角色的设置

drbdadm primary <resource>

drbdadm secondary <resource>

 在单主模式(DRBD的默认模式),同一时间只允许有一个节点时 primary 模式;双主模式,两个节点可同时都是 primary 模式。

故障转移

如果没有使用Pacemaker,手动故障转移操作如下:

 在当前主节点,操作如下操作:

umount/dev/drbd1

drbdadm secondary <resource>

 在另外一个节点或我们希望要提升为主节点的节点,做如下操作:

drbdadmprimary <resource>

mount/dev/drbd1 <mountpoint>

v DRBD的升级

此处例子是从8.3.x升级到8.4.x

 将yum仓库更新到8.4,就是更新/etc/yum.repos.d/<name>.repo

 确定节点间的同步都已是UpToDate/UpToDate

 先从secondary节点开始升级,两种:

手动方法:/etc/init.d/drbd stop

Pacemaker方法:crm node standby clone1

 然后使用yum upgrade 升级软件

/etc/init.d/drbd start  crm node online clone1 启动服务

将主备节点的角色切换,再重复以上五个步骤。

 因为8.4向后兼容8.3的配置,所以可以使用命令 drbdadm dump all 可以输出升级后的配置。可是作为升级的凭据。

v DRBD的降级

以下操作都是在两个节点上同时操作的

 停止DRBD服务:service drbd stop

 卸载已经挂载的设备:umount /dev/drbd1

 将节点角色改为secondarydrbdadm secondary r0

然后执行如下命令:

drbdadm down all

drbdadm apply-al all

rmmod drbd

如果使用的是yum仓库安装的,那么就:

yum -y remove drbd kmod-drbd

 然后,重新安装8.3版本的

小结:所谓降级,其实就是卸载,删除新版本的,再安装旧版本的

启用双主模式

启用双主模式既可以是永久性的也可以额是临时性的。使用双主模式,资源必须被配置成协议C

永久性双主模式的配置:

 必须在net区域,设置allow-two-primaries选项为yes

 之后同步修改后的文件到对等节点,然后在分别在两个节点上运行drbdadmadjust <resource>

 最后就可以在两个节点上同事执行drbdadm primary<resource>命令

临时性双主模式的配置:

 在单主模式中临时启用双主模式可以使用,drbdadmnet-options --protocol=C --allow-two-primaries <resource>

 结束掉临时双主模式,则使用rbdadm net-options--protocol=C --allow-two-primaries=no,即可。

自动启动双主模式:

 如果希望在重启系统或重启DRBD时,自动启动双主模式(已经被配置为支持双主模式),则在startup区域,将become-primary-on 选项设置为both即可。(注:如果使用pacemaker来管理DRBD配置,则不需要这个设置)

使用在线设备验证

启用在线验证:

 默认情况下是没有启动的。若启用,就在net区段配置选项verify-alg <algorithm>;algorithm可以是sha1md5crc32c中的任何一种。

在线验证的调用:

 在启用在线验证后,就可以使用 drbdadm verify<resource>来进行调用了。使用此命令可以对资源启动在线验证。如果找到的任何没有同步的块,它会将这些块做标记并且写信息到内核日志里面。

 如果在验证中找到了没有同步的块,那么可以在验证完成后使用

Drbdadm disconnect <resource>

Drbdadm connect <resource>

两条命令实现再同步

自动在线验证:

 可以通过创建名为/etc/cron.d/drbd-verify的文件,内容如下

32 0 * * 0 root/sbin/drbdadm verify<resource>/all

来实现自动在线验证。(注:文件内容含义是在每星期日的凌点32分时,通过cron调用设备验证。

配置同步速率

 永久固定的同步速率配置:

disk区段配置resync-rate选项为一个给定值,如下所示

Resource <resource> {

Disk {

Resync-rate 40M;

......

}

......

}

默认的速率是250KB/s。此值的设定较好的是设定有效复制带宽的30%。例如,I/O子系统的可持续写吞吐量为180MB/s,千兆以太网的吞吐量为110MB/s。那么,子选项的速率应该是110*0.3=33MB/s

小结:速率的计算以I/O子系统和网络吞吐量其中小的为计算标准。

 临时固定的同步速率配置:

Drbdadm disk-options --resync-rate=110M<resource>

若要恢复临时的设定,用如下命令:

Drbdadm adjust <resource>

 可变同步速率配置:

如果多个DRBD资源共享一个单独的复制/同步网络,固定速率的同步或许不是一个最优的选择,在这种情况下,可以使用可变速率。

可变同步速率的最佳配置是取决于可用的网络带宽,应用程序的I/O模式,链路阻塞情况等。理想的配置也取决于是否使用了DRBD代理。下面是一个和DRBD代理同事使用的配置:

Resource <resource> {

Disk {

c-plan-ahead 200;

c-max-rate 10M;

c-fill-target 15M;

}

}

配置基于校验的同步

默认是没有启用的,若启用如下所示:

Resource <resource> {

net {

csums-alg <algorithm>;

.....

}

.....

}

可使用的摘要算法有sha1md5crc32c

配置阻塞策略和挂起复制

在一个复制带宽高度变化的环境中,复制链路有时会发生阻塞。在默认的配置中,这种情况将引起主节点的阻塞,这是我们不希望发生的。

因此,你可以配置DRBD在遇到这种持续复制情况时挂起。这是会导致主节点的数据领先于备用节点。在这种模式下,DRBD将一直保持复制通道处于打开状态,它绝不会切换到disconnected模式,,而是直到又一次有可用带宽时在进行复制。以下是DRBD代理的配置:

Resource <resource> {

net {

on-congestion pull-ahead;

Congestion-fill 2G;

Congetstion-extents 2000;

}

}

通常在设置congestion-fillcongestion-extents明智的做法是和pull-ahead一起设定。

当在DRBD代理上复制时,Congestion-fill一般取分配给DRBD缓冲内存大小的90%;而在非DRBD代理上复制时,congestion-fill一般取TCP发送缓冲区大小的90%

Congestion-extents一般取你配置的al-extents90%

配置I/O错误处理策略

处理底层I/O错误的DRBD策略是由on-io-error选项决定的,如:

Resource <resource> {

Disk{

On-io-error <strategy>;

......

}

......

}

此选项有三个取值:

1. detach 此值是默认的并是被推荐的选项。表示在出现底层I/O错误时,节点将会丢弃它的支持设备,以无盘的模式继续运行。

2. pass-on 表示设置此值将会使DRBD向它的上层报告I/O错误。在主节点上它会报告给被挂载的文件系统。在备用节点上,将被忽略,因为备用节点上没有上层。

3. call-local-io-error 表示调用自定义的脚本来处理I/O错误。

配置复制流量完整性检查

默认未启用,若启用,如下:

Resource <resource> {

Net {

Data-integrity-alg <algorithm>;

......

}

......

}

摘要算法:sha1md5crc32c

重置资源的大小

 在线增加

需要满足两个条件:

1. 支持设备必须是逻辑卷

2. 当前的资源必须处于connected的连接状态。

在两个节点给设备增加大小后,再确认只有一个节点处于primary状态。然后输入:

Drbdadm resize <resource>

此命令会触发新扇区的同步,完成主节点到备用节点间的同步。

如果你添加的空间是干净没有数据的,你可以使用--assume-clean 选项:

Drbdadm -- --assume-clean resize <resource>

来跳过格外的空间。

 离线增加

1. 资源被配置为external meta data

DRBD在处于非活动情况下,在俩个节点的支持设备被增加时,并且DRBD资源使用的是external meta data,那么新的大小会自动被识别,不需要管理员干预。DRBD设备将在下次两个节点活动并且成功建立网络连接之后,显示增加后的新容量。

2. 资源被配置为internal meta data

DRBD资源被配置为使用 internal meta data时,元数据必须被移动到这增加容量后设备的末端,在当新的大小生效时。为此,需要完成以下几步:

● 取消你的DRBD资源配置:

Drbdadm down <resource>

● 增加容量前保存元数据到一个文本文件中:

Drbdadm dump-md <resource> > /tmp/metadata

以上必须在两个节点上分别运行。不能再一个节点上保存了元数据然后在考到另外一个节点上。否则就无法工作。

● 在两个节点上给支持的块设备增加容量

● 分别在两个节点上调整/tmp/metadata 文件中la-size-sect的大小信息。注:这la-size-sect指定的是扇区的多少。

● 重新初始化元数据区域

Drbdadm create-md <resource>

分别在两个节点上重新导入更正的元数据

drbdmeta_cmd=$(drbdadm -d dump-md test-disk)

${drbdmeta_cmd/dump-md/restore-md} /tmp/metadata

重新启用DRBD资源

Drbdadm up <resource>

在一个节点上,设置DRBDprimary

Drbdadm primary <resource>

到此,已完成DRBD设备大小的扩容。

 在线缩小容量

注:在线缩小容量,仅支持externalmetadata

在缩小DRBD设备时必须首先缩小DRBD的上层。例如,文件系统。文件系统是否可以被缩小取决于所使用的文件系统。大多数文件系统不支持在线缩减。XFS也不支持在线缩减。

因此,在缩小文件系统后,就可以使用以下命令在线缩小DRBD设备容量了。

Drbdadm resize --size=<new-size><resource>

 离线缩小容量

● DRBD还处于配置运行状态时,在一个节点上缩小文件系统

● 取消DRBD资源的配置

Drbdadm down <resource>

在缩小前保存元数据到一个文件中:

Drbdadm dump-md <resource> > /tmp/metadata

以上必须在两个节点上分别运行。不能再一个节点上保存了元数据然后在考到另外一个节点上。否则就无法工作。

● 在两个节点上给支持的块设备缩小容量

● 分别在两个节点上调整/tmp/metadata 文件中la-size-sect的大小信息。注:这la-size-sect指定的是扇区的多少。

● 只要你使用的是internal metadata,就可以重新初始化元数据区域

Drbdadm create-md <resource>

分别在两个节点上重新导入更正的元数据

drbdmeta_cmd=$(drbdadm -d dump-md test-disk)

${drbdmeta_cmd/dump-md/restore-md} /tmp/metadata

重新启用DRBD资源

Drbdadm up <resource>

在一个节点上,设置DRBDprimary

Drbdadm primary <resource>

到此,已完成DRBD设备大小的缩减。

禁用支持设备flushes

你应该仅在有电池支撑的写缓存的设备(即BBWC,battery-backed write cache)中运行DRBD时,可以禁用设备flushes。大多数存储控制器都会在电源快用尽时,自动禁用写缓存并切换至直接写模式。强烈推荐启用此功能。

如果在没有使用BBWC或使用了BBWC但电池已经耗尽的时,禁用此功能,很可能会造成数据丢失。

DRBD允许你单独的启用或禁用复制数据集和DRBD自身的元数据。这两个选项默认是启用的。你可以在配置文件的disk区段来禁用或启用这两个或一个选项。如:

Resource <resource> {resource<resource> {

Disk {disk {

Disk-flushes on;md-flushes no;

...... ......

}}

............

}}

配置脑分裂特性

 配置脑分裂,是在handlers 区段,如:

Resource <resource> {

Handlers {

Split-brait <handler>;

......

}

......

}

<handler>可以使系统中任何可执行的程序。DRBD本身自带了一个脑分裂处理脚本/usr/lib/drbd/notify-split-brain.sh。它会给指定地址发送一个e-mail消息通知。例如,配置发送给管理员root的消息:

Resource <resource> {

Handler {

Split-brain “/usr/lib/drbd/notify-split-brain.shroot”;

......

}

......

}

 脑分裂自动恢复策略

DRBD提供的脑分裂恢复处理,是基于脑分裂处理程序所检测到的处于primary角色的节点数量。要实现这种功能,DRBD需要在net配置区段查找以下几个关键字:

● after-sb-0pri :表示已经检测到了脑分裂,但是没有主机节点处于primary角色。对于此选项DRBD有以下几个值:

• disconnect :表不会自动恢复,如果配置了脑分裂处理脚本,就会调用这个脚本,断开连接并继续保持在disconnected模式;

• discard-younger-primary:丢弃并回滚最近在承担primary角色的主机上所做的修改;

• discard-least-changes:丢弃并回滚在修改较少的主机上所做的修改;

• discard-zero-changes:如果有节点没有发生一点改变,那么在另一个节点上会应用所做的所有修改,并继续。

● after-sb-1pri:表检测到有脑分裂,同时在一个节点上资源为primary角色。对于这个选项也有一下几个值:

• disconnect:和after-sb-0pri一样

• consensus :和after-sb-0pri一样应用相同的恢复策略,如果在应用这些策略后,脑分裂的牺牲者是可以选择的,那么就可以实现自动恢复。否则,表现完全好像指定是disconnect值一样。

• call-pri-lost-after-sb:应用在after-sb-0pri指定的恢复策略。如果在应用这些策略后,脑分裂的牺牲者是可以选择的,那么就会在作为牺牲节点的主机上调用pri-lost-after-sb处理程序。这个处理程序必须在handlers区段配置好,并且可以强制从集群中移除。

•discard-secondary:无论当前哪个主机是secondary角色,这个主机将作为脑分裂的牺牲主机。

● after-sb-2pri:表已经检测到脑分裂,同时两个节点都是primary角色。这选项使用after-sb-1pri相同的值,除了discard-secondaryconsensus外。

注意,这些关键字选项还有其他的值,因为很少被使用到,所以在此没有提及。详细内容请参考drbd.conf的帮助文档。

v DRBD 代理

DRBD代理既可以和DRBD安装在同一台电脑上,也可以是完全独立的一台服务器。DRBD代理可以为分布在多个节点上的多个DRBD设备提供代理服务。

DRBD代理对DRBD是完全透明的。在这种情况下可能会有大量的数据包通过,因而日志文件会变的相当的大。这样会使当主节点崩溃时,再同步时间会很长。为了避免这种情况,建议启用csums-alg 设置。

Drbd-proxy的安装(略)

 许可证文件

从官网下载许可证文件drbd-proxy.license。它必须被拷贝到/etc目录底下,并将此文件的所有者和组改为drbdpxy

cp drbd-proxy.license /etc/

chown drbdpxy.drbdpxy/etc/drbd-proxy.license

 配置

配置DRBD代理,是在配置文件中附加一个叫做proxy的区段,并且在主机区段附加proxy on区段。以下是直接在DRBD的节点上,配置DRBD代理的例子:

resource ro {

net {

Protocol A; #也可以使BC

}

Deviceminor 0;

Disk/dev/sdb1;

Meta-disk/dev/sdb2;

Proxy {

Memlimit100M;

Plugin {

Zliblevel 9;

}

}

On server {

Address 127.0.0.1:7789;

Proxy on server {

Inside 127.0.0.1:7788;

Outside192.168.1.103:7788;

}

}

On clone1 {

Address 127.0.0.1:7789;

Proxy on {

Inside127.0.0.1:7788;

Outside192.168.1.105:7788;

}

}

}

注:inside IP地址是用来在DRBDDRBD 代理之间通信用的。Outside IP地址使用来在代理之间进行通信用的。

 管理DRBD代理

可是使用drbdadmproxy-up drbdadm proxy-down。来配置或删除与指定资源的本地DRBD代理进程的连接。这些命令可以通过/etc/init.d/drbdproxy start/stop来实现。

也可以使用drbd-proxy-ctl,例如,drbd-proxy-ctl -c “help” 来显示可使用的命令。

 关于DRBD代理的插件

DRBD代理3.0开始允许在WAN连接中使用少量指定的插件。当前可使用的插件是zlib  lzma

zlib插件使用GZIP算法进行压缩。使用此插件的好处是它CPU使用率很低。

lzma插件使用liblzma2库。它使用了几百兆的库文件,因此它可以非常高效的增量压缩重复的数据。但是它需要更多的CPU和内存,因此压缩比会比zlib好很多。若使用此插件必须在许可证文件中启用此功能。

注意:在proxy区段旧有的compression on 在以后的版本中将不再使用,当前使用的是zlib level 9.

 疑难排解

DRBD proxy 通过syslog使用LOG_DEAMON来记录日志。日志信息可以在/var/log/daemon.log中查看到。可以使用如下命令启用DRBD proxy日志的debug模式:

Drbd-proxy-ctl -c‘set loglevel debug’

排错与恢复

如何处理硬盘驱动器故障取决于配置处理I/O错误的方法和配置的元数据的方法。

 从你的硬盘驱动器手动分离DRBD

如果你的DRBD配置成为pass on I/O errorsI/O错误处理模式的话(不推荐的),你必须首先分离DRBD资源,也就是说,使它和它的支持存储器分离:

Drbdadm detach <resource>

然后通过drbdadmdstate命令查看资源现在已经是diskless模式。

Drbdadm dstate <resource>

Diskless/UpToDate

如果在primary节点上出现磁盘故障,除了上面的步骤还要做一个角色切换的操作。

 如果DRBD被配置为当出现I/O错误的时候可自动从硬盘驱动器分离(推荐这样),那么DRBD应该会自动从它的支持存储器中分理出资源,不需要手动干预。你仍旧可以使用drbdadmdstate 命令来查看资源是否运行在diskless 模式。

 在使用internal meta data设置时替换故障磁盘

如果使用internalmeta data,那么完全可以绑定DRBD设备到一个新的磁盘上。如果新的的磁盘使用另外一个设备名而不是故障磁盘的设备名,那么必须修改DRBD配置文件中相关的选项。操作流程是:

1. 创建一个新的元数据集,即 drbdadm create- md <resource>

2. 重新添加资源,即 drbdadm attach <resource>

之后就会自动并立即开始新磁盘的完全同步。你可是通过/proc/drbd来监控同步过程。

 在使用external meta data设置时替换故障磁盘

使用externalmeta data的过程和使用internal meta data的过程基本相同。但是使用external meta data不会自动识别硬盘已被交换,还有多一个操作步骤:

 1. drbdadmcreate-md <resource>

2. Drbdadmattach <resource>

3. Drbdadminvalidate <resource>

此处,drbdadminvlidate <resource> 命令会触发同步。同样,同步过程可以通过/proc/drbd来查看。

节点故障的处理

DRBD检测到对等节点当机时(既可以是真正的硬件故障,也可是手动干预的),DRBD会将它的连接状态从Connected状态转到WFConnection状态,并且等待重新发现对等层。然后DRBD资源会处在disconnetced模式。在disconnected模式中,资源和它的相关块设备完全不可用,并且必要的话可能会被提升或降低角色,但是没有修改过的块会被复制到对等节点上去。代替的是,当失去连接时,DRBD会将内部信息存储在正在被修改的块中。

 临时secondary节点故障的处理

如果在一个节点处于secondary角色的资源临时性的出现故障(例如,因为替换内存而引起大小调整的内存问题),不需要做进一步的手工干预——除了那种明显需要修复的故障节点外,并且会自己返回在线状态。当这种情况发生的时候,两个节点只需简单的重新建立连接状态,在系统启动的时候。之后,DRBD会复制所有在此期间在primary节点上修改过块到secondary节点上。

 临时primary节点故障的处理

DRBD的观点来看,primary节点故障和secondary节点故障处理几乎差不多。还在线的节点检测到另一个节点发生故障,并切换模式到disconnectedDRBD并不会提升还在线节点到primary角色,这是由集群管理程序负责完成的。

当故障节点修复完并返回集群,它会在secondary节点上提升角色,因此和上小节一样不需要在进行手工干预。还有,角色的提升不是有DRBD完成,而是由集群管理程序负责。

DRBD会通过一种特殊的机制来确保当primary节点出现故障时块设备的一致性。

 永久性节点故障的处理

如果节点遇到不可恢复或者永久性的破坏,你需要做以下几步:

1. 替换一个和故障件性能和磁盘容量相似的硬件。(注意:如果体会的硬体的性能差一些也是可以的,但不推荐这样做。而替换的硬盘容量一定不能小于故障件否则DRBD会拒绝连接被替换的节点。)

2. 安装基本的系统和应用程序。

3. 安装DRBD和拷贝/etc/drbd.conf/和在/etc/drbd.d/下所有还存在的节点。

4. 配置DRBD但绝不能初始化设备同步。

在这个地方没有必要手动启动完全设备同步,它会自动连接到还在线的primary节点上。

手动恢复脑分裂

在连接再次有效的时候DRBD检测到脑分裂,并且对等节点会交换初始DRBD握手协议。如果DRBD检测到两个节点都是primary角色,它会立即断开复制连接。这会在系统日志文件中出现以下信息:

Split-Braindetected, dropping connection!

在检测到脑分裂之后,一个节点将会总是处于StandAlone资源连接状态。另外一个节点或许既可能是StandAlone状态(如果两个节点同时检测到脑分裂),也可能是WFConnection状态(如果对等节点断开了连接,在另外一个节点有机会检测到脑分裂之前)。

在此时,除非你配置DRBD可是从脑分裂中自动恢复,否则你必须手动干预,通过选择哪个一个修改过的节点将会被丢弃。手动干预需要使用以下几个命令:

drbdadmsecondary <resource>

drbdadmconnect --discard-my-data <resource> 

(注意使用上面的几个命令时,脑分裂的牺牲者需要处在StandAlone的连接状态,否则会返回错误信息。你可以使用drbdadm disconnect<resource>来确保它是standalone状态。)

在另一个节点上,如果它的连接状态也是StandAlone,你可以输入:

drbdadmconnect <resource>

你可以省略上面这个步骤,如果节点已经处在WFConnection状态的话,它之后会自动重新连接。

如果被脑分裂影响的是栈资源,就使用drbdadm --stacked 代替仅有drbdadm

在连接的情况下,你的脑分裂的牺牲者会立即改变它的连接状态为SyncTarget,已经修改过的会被剩下的主节点覆盖。

在再同步完成之后,脑分裂会被认为已经解决了,两个节点有构成了一致的,冗余复制的存储系统。

手动处理方法:

a)secondary主机上执行如下命令:

drbdadm secondary r0

drbdadm disconnect all

drbdadm –discard-my-dataconnect r0

b)primary主机上执行如下命令:

Drbdadm disconnect all

Drbdadm connect r0