数据镜像软件DRBD

一、DRBD简介

DRBD:叫做分布式复制块设备,这是一种基于软件,无共享,复制的解决方案。在服务器之间的块设备(包括硬盘、分区、逻辑卷)进行镜像。也就是说当某一个应用程序完成写操作后,它提交的数据不仅仅会保存在本地块设备上,DRBD也会将这份数据复制一份,通过网络传输到另一个节点的块设备上,这样,两个节点上的块设备上的数据将会保存一致,这就是镜像功能。

二、DRBD的特性

DRBD具有如下特性:
1)实时性:当某个应用程序完成对数据的修改时,复制功能立即发生
2)透明性:应用程序的数据存储在镜像块设备上是独立透明的,他们的数据在两个节点上都保存一份,因此,无论哪一台服务器宕机,都不会影响应用程序读取数据的操作,所以说是透明的。
3)同步镜像和异步镜像:同步镜像表示当应用程序提交本地的写操作后,数据后会同步写到两个节点上去;异步镜像表示当应用程序提交写操作后,只有当本地的节点上完成写操作后,另一个节点才可以完成写操作。

三、部署DRBD

1.安装repo源

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

2.yum安装drbd

yum -y install drbd84-utils kmod-drbd84

3.加载drbd模块到内核

modprode drbd
#这一步如果报错,是因为内核不支持,需要更新内核“yum install -y kernel-devel kernel kernel-headers”,并重启

4.检查drbd是否安装成功

lsmod |grep -i drbd

5.查看drbd.ko的安装路径

modprode -l|grep -i drbd  
#实测我装的版本modprode已经没有-l参数,所以我只能ls /lib/modules/3.10.0-514.21.2.el7.x86_64/weak-updates/drbd84/来确定是否有drbd.ko了

四、准备环境

我准备了两台阿里云用来测试
主节点:10.26.248.169 s1
备节点:10.27.226.162 s2
两台服务器分别买了一个20G的硬盘用来测试DRDB,毕竟一小时才几分钱嘛,懒得自己去弄虚拟机,反正是公司的钱(滑稽.jpg)
硬盘如何格式化和分区?
参考:https://help.aliyun.com/document_detail/25426.html

五、配置DRBD配置文件

(两台服务器的配置文件一致)
yum安装的drbd配置文件默认是/etc/drbd.conf,它的内容如下:

[root@S1 drbd.d]# cat /etc/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启动的时候加载/etc/drbd.d/下面的res文件和global_common.conf

cd /etc/drbd.d/
cp global_common.conf global_common.conf.bak  #留一份备份,不管有没有卵用
sed -i '/#/d' global_common.conf    #删除里面的注释内容

修改global_common.conf文件,如下:

global {
    usage-count no;    #是否参加DRBD使用者统计,默认参加
}

common {
    protocol C;    #使用DRBD的第三种同步协议,表示收到远程主机的写入确认后认为写入完成
    handlers {
        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";
    }

    startup {
        wfc-timeout 120;
        degr-wfc-timeout 120;
    }

    options {
    }

    disk {
        on-io-error detach;        #使用dpod功能(drbd outdate-peer daemon)保证在数据不同步时不进行切换
        fencing resource-only;
    }

    net {
        cram-hmac-alg "sha1";        #DRBD同步时使用的验证方式和密码信息
        shared-secret "drbdtest";
    }
    
    syncer {
        rate 200M;    #设置主用节点和备用节点同步时的网络速率最大值,单位是字节
    }
}

vim r0.res 创建res文件

resource r0 {  
        device /dev/drbd0;  
        meta-disk internal;        #DRBD的元数据存放方式

        on s1 {              #这里要注意,on后面接主机名,必须要和你的主机名(uname -n)一致,否则报错
        address 10.26.248.169:9527;      #设置DRBD的监听端口,用于和另一台主机通信
        disk /dev/vdb1;      #/dev/drbd0使用的磁盘分区是/dev/vdb1
        } 

        on s2 {  
        address 10.27.226.162:9527;  
        disk /dev/vdb1;  
        }  
}

六、启动DRBD

1.在两个节点执行

drbdadm create-md all 或者 drbdadm create-md r0

如果报错:

Command 'drbdmeta 0 v08 /dev/vdb1 internal create-md' terminated with exit code 40

需要先往硬盘塞点数据

dd if=/dev/zero of=/dev/vdb1 bs=1M count=100

2.在两个节点执行

systemctl start drbd

3.任意节点查看drbd状态

cat /etc/drbd.conf

可以看到两个都还是Secondary

version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:20969820

对输出的含义解释如下:

ro 表示角色信息,第一次启动drbd时,两个drbd节点默认都处于Secondary状态
ds 表示磁盘状态信息,“Inconsistent/Inconsistent” 即“不一致/不一致”状态,表示两个节点的磁盘数据处于不一致状态
ns 表示网络发送的数据包信息
dw 表示磁盘写信息
dr 表示磁盘读信息

4.设置其中一个为主节点,在主节点执行

drbdadm primary --force r0

5.再次查看drbd状态,可以看到数据正在同步

[root@s1 drbd.d]# cat /proc/drbd 
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:380928 nr:0 dw:0 dr:381840 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:20588892
    [>....................] sync'ed:  1.9% (20104/20476)M
    finish: 0:08:06 speed: 42,324 (42,324) K/sec

[root@s1 drbd.d]# cat /proc/drbd 
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:1884160 nr:0 dw:0 dr:1885072 al:8 bm:0 lo:0 pe:4 ua:0 ap:0 ep:1 wo:f oos:19089756
    [>...................] sync'ed:  9.0% (18640/20476)M
    finish: 0:07:46 speed: 40,908 (39,168) K/sec

数据同步完成,ds状态更新为“UpToDate/UpToDate”

[root@s1 drbd.d]# cat /proc/drbd 
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:20969820 nr:0 dw:0 dr:20970732 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

七、挂载DRBD设备

由于mount操作只能用于主节点,因此只有设置了主节点后才能格式化磁盘分区,同时,在两个节点中,同一时刻只能有一台处于Primary状态,另一台要处于Secondary状态,而处于Secondary状态的节点不能挂载DRBD设备,要在备节点上挂载DRBD设备,必须停止主节点的DRBD服务或者将备节点升级为主节点。
下面先将DRBD设备格式化为ext3文件系统,然后在主节点挂载,操作如下:

[root@s1 drbd.d]# mkfs.ext3 /dev/drbd0
[root@s1 drbd.d]# mkdir /s1
[root@s1 drbd.d]# mount /dev/drbd0 /s1
[root@s1 drbd.d]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        69G   12G   55G  18% /
devtmpfs        3.9G     0  3.9G   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           3.9G  316K  3.9G   1% /run
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
tmpfs           783M     0  783M   0% /run/user/0
/dev/drbd0       20G   45M   19G   1% /s1

八、测试DRBD数据镜像

上面我在主节点把/dev/drbd0挂载到了/s1下面,这里在/s1下面创建一个200M的文件,命令如下

[root@s1 drbd.d]# dd if=/dev/zero of=/s1/testdrbd.tmp bs=10M count=20
20+0 records in
20+0 records out
209715200 bytes (210 MB) copied, 0.499709 s, 420 MB/s
[root@s1 drbd.d]# ll -sh /s1
total 201M
 16K drwx------ 2 root root  16K Jun 29 09:53 lost+found
201M -rw-r--r-- 1 root root 200M Jun 29 09:55 testdrbd.tmp

完成操作后,接着在备节点上查看文件是否已经同步过去,因为备节点不能挂载,所以需要把原来的主节点改为备,把原来的备改为主,再挂载
在主节点执行:

[root@s1 drbd.d]# umount /s1
[root@s1 drbd.d]# drbdadm secondary all

在备节点执行:

[root@s2 drbd.d]# drbdadm primary all
[root@s2 drbd.d]# mkdir /s2
[root@s2 drbd.d]# mount /dev/drbd0 /s2
[root@s2 drbd.d]# ll -sh /s2
total 201M
 16K drwx------ 2 root root  16K Jun 29 09:53 lost+found
201M -rw-r--r-- 1 root root 200M Jun 29 09:55 testdrbd.tmp

可以看到数据同步一致

添加新评论