1 概述

1.1 DRBD简介

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

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

l DRBD是一种块设备

2 可用于高可用集群中(HA)

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

4 类似于一个网络的raid-1

工作特点:

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

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

1.1 DRBD工作原理

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

 

wKiom1VaxgOxh2yJAAGU4_N1x28956.jpg

DRBD的三种复制模式:

l 协议A

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

l 协议B

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

l 协议C

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

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

1.2 DRBD在高可用中体系结构

wKioL1Vax5KxnaCdAAIEAxFcV5g936.jpg

从图中可以看出,DRBD是作为调度服务器的存储高可用套件来实现数据的在调度服务器保持同步,完成相关的业务服务。

1.3 安装

系统环境: centos-6.4 64bit
drbd: drbd-8.4.4.tar.gz

 第一步:在如下网站下载源码包(本次采用Version drbd-8.4.4

DRBD的官方网站为:http://www.drbd.org/

×××地址:http://oss.linbit.com/drbd/

在此之前。请安装一下一些简单的工具  

yum install -y kernel-devel
推荐源码安装:

tar xvf drbd-8.4.4.tar.gz

./configure --prefix=/usr/local/drbd --with-km    生成drbd.ko文件

make KDIR=/usr/src/kernels/2.6.32-131.0.15.el6.x86_64      内核版本根据具体情况

make install

cp drbd/drbd.ko /lib/modules/`uname -r`/kernel/lib/   
# modprobe drbd
查看模块是否加载成功
# lsmod | grep drbd

drbd                  344534  0

libcrc32c               1180  1 drbd cp

设置开机启动

cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/

chkconfig --add drbd

chkconfig drbd on

mkdir -p /usr/local/drbd/var/run/drbd      添加必要运行目录

       到此drbd安装完成。

    主备两台都如上安装。

1.4 配置

基本的主备配置主服务器:

查看drbd的主配置文件
# pwd
/usr/local/drbd/etc
# cat 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";
由此可见:主配置文件里面已经包含了全局配置文件和drbd目录下以.res结尾的文件
修改全局配置文件:
# pwd
/usr/local/drbd/etc/drbd.d
# ls
global_common.conf
配置文件内容如下修改(红色新增):
# cat global_common.conf
global {
usage-count yes; #是否参加drbd的使用者统计,默认此选项为yes
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; #使用drbd的同步协议
handlers {
# These are EXAMPLE handlers only.
# They may have severe implications,
# like hard resetting the node under certain circumstances.
# Be careful when chosing your poison.
pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
# fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
# split-brain "/usr/lib/drbd/notify-split-brain.sh root";
# out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
# before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
# after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
}
startup {
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
}
options {
# cpu-mask on-no-data-accessible
}
disk {
on-io-error detach; #配置I/O错误处理策略为分离
# size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
# disk-drain md-flushes resync-rate resync-after al-extents
# c-plan-ahead c-delay-target c-fill-target c-max-rate
# c-min-rate disk-timeout
}
net {
# protocol timeout max-epoch-size max-buffers unplug-watermark
# connect-int ping-int sndbuf-size rcvbuf-size ko-count
# allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
# after-sb-1pri after-sb-2pri always-asbp rr-conflict
# ping-timeout data-integrity-alg tcp-cork on-congestion
# congestion-fill congestion-extents csums-alg verify-alg
# use-rle
}
syncer {
rate 1024M; #
设置主备节点同步时的网络速率
}

}
资源配置文件配置如下需自己新建,这是关键
# vim /usr/local/drbd/etc/drbd.d/drbd.res
resource r1 { #这个r1是定义资源的名字
on rh10 { #on
开头,后面是主机名称
device /dev/drbd0; #drbd
设备名称
disk /dev/xvdb1; #drbd0
使用的磁盘分区为xvdb1
address 10.243.29.64:7789; #
设置drbd监听地址与端口
meta-disk internal;
}
on rh11 { #on
开头,后面是主机名称
device /dev/drbd0; #drbd
设备名称
disk /dev/xvdb1; #drbd0
使用的磁盘分区为xvdb1
address 10.243.29.65:7789; #
设置drbd监听地址与端口
meta-disk internal;
}
}

备服务器配置:(同上)

 

主备启动服务:

在启动DRBD之前,你需要分别在两台主机上创建供DRBD记录信息的数据块.分别在两台主机上执行:

# drbdadm create-md r0 或者执行drbdadm create-md all

# drbdadm create-md r0

如果遇到no resourcedefind可以指定配置文件位置

drbdadm -c /usr/local/drbd/etc/drbd.conf create-md  r0

如果提示:Command 'drbdmeta 0 v08 /dev/sdc7 internal create-md' terminated with exit coolcode 40

运行如下命令清除元数据,重新执行

# dd if=/dev/zero bs=1M count=1 of=/dev/xvdb1

如果已经配置过了重新配置可以将原资源down

Drbdadm down r0

如果遇到脑裂问题如:

0:mfs_store/0 WFConnection Primary/UnknownUpToDate/DUnknown C r-----

从节点上执行:

# drbdadm disconnect r0

# drbdadm secondary r0

# drbdadm --discard-my-data connect r0

# cat /proc/drbd

主节点上执行:

# drbdadm connect r0

# cat /proc/drbd

在两个节点启动服务

#/etc/init.d/drbd start

#/etc/init.d/drbd start

最好同时启动

# netstat -anput|grep 7789

tcp  0     0 10.243.29.64:7789      10.243.29.65:51989          ESTABLISHED             

tcp  0   0 10.243.29.64:53835       10.243.29.65:7789           ESTABLISHED
在任意节点查看节点状态:

[root@drbd1 ~]# cat /proc/drbd

 1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----

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

对输出的含义解释如下:

ro表示角色信息,第一次启动drbd时,两个drbd节点默认都处于Secondary状态,

ds是磁盘状态信息,“Inconsistent/Inconsisten”,即为“不一致/不一致”状态,表示两个节点的磁盘数据处于不一致状态。

Ns表示网络发送的数据包信息。

Dw是磁盘写信息

Dr是磁盘读信息

设置主节点

由于默认没有主次节点之分,因而需要设置两个主机的主次节点,选择需要设置为主节点的主机,然后执行如下命令:

#drbdsetup /dev/drbd1 primary –o

或者执行下面命令也是可以的

#drbdadm -- --overwrite-data-of-peer primary all

然后可以设置主备了
    #/sbin/drbdadm primary r0
(主节点)

#/sbin/drbdadm secondary r0(备节点)

查看主备节点

# drbd-overview

  0:??not-found??  Connected Secondary/Primary UpToDate/UpToDate C r-----

查看同步状态:

# cat /proc/drbd

version: 8.4.4 (api:1/proto:86-101)

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@rh11, 2015-05-12 00:12:42

 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n-

    ns:1644176 nr:0 dw:0 dr:1646232 al:0 bm:100 lo:1 pe:10 ua:7 ap:0 ep:1 wo:f oos:19322388

       [>...................] sync'ed:  7.9% (18868/20472)M

       finish: 0:08:07 speed: 39,640 (36,480) K/sec

从输出可知:

       “ro状态现在变为“Primary/Secondary”,“ds”状态也变为“UpToDate/Inconsistent”,也就是“实时/不一致”状态,现在数据正在主备两个主机的磁盘间进行同步,且同步进度为7.9%,同步速度每秒3968M左右。

等待片刻,再次查看同步状态,输出如下:

[root@rh10 ~]#  cat /proc/drbd

version: 8.4.4 (api:1/proto:86-101)

GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@rh10, 2015-05-11 09:47:31

 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----

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

可以看到同步完成了,并且“ds“状态也变为“UpToDate/UpToDate”了。即为“实时/实时”状态了。


验证测试:主服务器增加文件

格式化文件系统

#mkfs.ext4 /dev/drbd0

#mount /dev/drbd0 /drbd

如果在从节点,会报错

[root@rh10 ~]# mkfs.ext4 /dev/drbd0

mke2fs 1.41.12 (17-May-2010)

mkfs.ext4: 错误的介质类型 while trying to determine filesystem size

[root@rh11 drbd]# ls    增加测试文件,切换后在备服务器是否正确

data.txt  lost+found  si-tech

主备切换

主备节点切换有两种方式,分别是停止drbd服务切换和正常切换

正常切换方式:

#drbdadm secondary all(主节点)

#drbdadm primary all(备节点)

最后在备用节点挂载磁盘分区即可:

[root@drbd2 ~]#mount /dev/drbd0  /mnt

[root@rh10 drbd]# ls

data.txt  lost+found  si-tech

服务切换方式:

关闭主节点服务,此时挂载的drbd分区就自动在主节点卸载了,然后在备用节点执行切换命令:

#drbdsetup /dev/drbd0 primary --o

#drbdadm primary all

1.5 卸载

软件卸载

直接make uninstall,然后

make clean