什么是DRBD


DRBD的全称为:Distributed Replicated Block Device(DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。你可以把它看作是一种网络RAID。它允许用户在远程机器上建立一个本地块设备的实时镜像。


DRBD工作原理


(DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary)。另一个主机再将数据存到自己的磁盘中。目前,DRBD每次只允许对一个节点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。有可能以后的版本支持两个节点进行读写存取。


DRBD与HA关系


一个DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备(/dev/drbd*)。在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中。现在大部分的高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要太多的硬件的投资。因为它在TCP/IP网络中运行,所以,利用DRBD作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错


DRBD复制模式


协议A:

异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点

协议B:

内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘

协议C:

同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽

一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议


简单解释

A 数据一旦写入磁盘并发送到网络中就认为完成了写入操作.

B 收到接收确认就认为完成了写入操作.

C 收到写入确认就认为完成了写入操作.


DRBD启动进程


每个drbd设备会有三个进程:

drbd0_worker是drbd0的主要进程,

drbd0_asender是primary上drbd0的数据发送进程,

drbd0_receiver是secondary上drbd0的数据接收进程


DRBD内部原理图

wKioL1cnRtiQV6qUAABYOlZb6-I005.png


DRBD安装与部署


实验环境

系统主机名IP磁盘
Centos6.5node1192.168.0.15/dev/sdb1
Centos6.5node2192.168.0.16/dev/sdb2





注:关闭防火墙,selinux,配置网卡,修改主机名,分区(仅分区,不格式化)省去


准备yum源,并安装软件(node1/node2)


[root@node1 ~]# wget http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm

[root@node1 ~]# mv elrepo-release-6-6.el6.elrepo.noarch.rpm  /etc/yum.repos.d/

[root@node1 ~]# cd /etc/yum.repos.d/

[root@node1 yum.repos.d]# yum install drbd83-utils kmod-drbd83 -y

[root@node1 ~]# modprobe  drbd

[root@node1 ~]# lsmod | grep drbd

drbd                  332493  0 


配置DRBD(node1/node2配置文件相同)


(DRBD的配置文件主要分三个比分:global、common和resource。在运行的时候默认读取配置文件的路径是/etc/drbd.conf,这个文件描述了DRBD的一些配置参数以及设备与硬盘分区的映射关系,默认情况下是空的,不过在DRBD的源代码包中包含了配置文件的样例)

一般情况下global_common.conf(本次实验文件所在目录/etc/drbd.d/)文件仅包含global和common部分配置(理解为全局配置),在/etc/drbd.d/*.res的文件定义于一个资源(理解为主机定义)。

其实可以将DRBD配置整合到drbd.conf文件中,不过这样做在资源比较多的情况下会变得混乱。


(1) 本次采用分布式配置首先我们来配置/etc/drbd.d/global_common.conf


内容如下:

global {

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

}

common {

syncer {rate 200M;} #主节点和备用节点同步时最大的网络速率

protocol C; #使用DRBD的第三种同步协议,表示收到远程主机的写入确认后认为写入完成

handlers {

pri-on-incon-degr "echo o > /proc/sysrq-trigger ;halt -f";

pri-lost-after-sb "echo o > /proc/sysrq-trigger ;halt -f";

local-io-error "echo o >/proc/sysrq-trigger ;halt -f";

fence-peer "/usr/lib64/heartbeat/drbd-peer-outdater -t 5";

pri-lost "echo pri-lost. Have a look at the log files. | mail -s 'DRBD Alert'root";

split-brain "/usr/lib/drbd/notify-splot-brain.sh root";

out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";

}

net { #DRBD同步时使用的验证方式和密码

cram-hmac-alg "sha1";

shared-secret "MySQL-HA";

}

disk { #使用dpod功能(drbd outdate-peer daemon)保证数据在同步时不能进行切换

on-io-error detach;

fencing resource-only;

}

startup {

wfc-timeout 120;

degr-wfc-timeout 120;

}

}

(2) 其次我们在drbd.d目录下创建以.res为后缀的文件,本次创建的文件是drbd.res目录是/etc/drbd.d/

内容如下:

resource r0 { #定义资源名称为r0

on node1 { #每个主机的说明以on开头 后面是主机名hostname

device /dev/drbd0; #定义DRBD使用磁盘的逻辑路径

disk /dev/sdb1; #/dev/drbd0 使用的磁盘分区

address 192.168.0.15:7788; #设置DRBD的监听端口,与另一台主机通信

meta-disk internal; #DRBD元数据存放方式 internal 内部

}

on node2 {

device /dev/drbd0;

disk /dev/sdb1;

address 192.168.0.16:7788;

meta-disk internal;

}

}

3) 创建haclient组并设置权限 原因是:我们会使用drbd-peer-outdater fence-peer程序。使用该机制dopd心跳插件程序,就需要能够调用drbdsetup和drbdmeta根特权。

命令如下:

            groupadd haclient

            chgrp haclient /sbin/drbdsetup

            chmod o-x /sbin/drbdsetup

            chmod u+s /sbin/drbdsetup

            chgrp haclient /sbin/drbdmeta

            chmod o-x /sbin/drbdmeta

            chmod u+s /sbin/drbdmeta

(4) 使用scp 将配置文件复制到另一台计算机上 scp 192.168.0.16:/etc/dbrd.d/* /etc/drbd.d/

并执行

            groupadd haclient

            chgrp haclient /sbin/drbdsetup

            chmod o-x /sbin/drbdsetup

            chmod u+s /sbin/drbdsetup

            chgrp haclient /sbin/drbdmeta

            chmod o-x /sbin/drbdmeta

            chmod u+s /sbin/drbdmeta

(5) 在启动DBRD之前,需要分别在两台主机上的指定分区(这里是sdb4)上创建提供DRBD记录信息的数据块

drbdadm create-md r0(r0表示之前定义的资源)或者执行drbdadm create-md all

正确的提示是:

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.


这不操作也可能存在不成功的情况

[root@node1 drbd.d]# drbdadm create-md all

md_offset 10733953024

al_offset 10733920256

bm_offset 10733592576


Found ext3 filesystem

    10482380 kB data area apparently used

    10482024 kB left usable by current configuration


Device size would be truncated, which

would corrupt data and result in

'access beyond end of device' errors.

You need to either

   * use external meta data (recommended)

   * shrink that filesystem first

   * zero out the device (destroy the filesystem)

Operation refused.


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

drbdadm create-md r0: exited with code 40

执行如下命令解决此问题
[root@node1 drbd.d]# dd if=/dev/zero of=/dev/sdb1

(6) 在两个节点上启动DRBD服务 服务脚本位于/etc/init.d/drbd

/etc/init.d/drbd start

(7) 执行cat /proc/drbd

输出内容如下

version: 8.3.16 (api:88/proto:86-97)

GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37

0: 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:f oos:10482024

输出解释:

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

ds表示磁盘状态信息,“Inconsistent/Inconsistent”即 “不一致/不一致”状态表示两个节点的磁盘数据不一样

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

dw表示磁盘写信息

dr表示磁盘读信息

(8) 设置主用节点在默认情况下没有主用节点和备用节点之分因此需要设置两个主机的主次,选择需要设置为主用节点的主机执行以下命令

drbdsetup /dev/drbd0 primary -o 也可以执行以下命令 drbdadm -- --overwrite-data-of-peer primalry all

执行之后需要设置哪个主用节点就可以使用另一条命令

/sbin/drbdadm primary r0 或者/sbin/drbdadm primary all

稍等片刻后查看/proc/drbd

输出如下:

version: 8.3.16 (api:88/proto:86-97)

GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37

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

ns:10482024 nr:0 dw:0 dr:10482696 al:0 bm:640 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

ro的状态变成Primary/Secondary

ds状态也变成UpToDate/UpToDate 表示实时同步

(9) 挂载DRBD设备在主节点上挂载以下操作

mkfs.ext4 /dev/drbd0  只需要格式化此分区,sdb1无需格式化

mount /dev/drbd0 /mnt (这里是挂载到mnt下根据需要自行挂载)

(10) 测试DRBD数据镜像

在主节点的挂载点/mnt下创建一个文件

dd if=/dev/zero of=/mnt/drdb_test.tmp bs=10M count=20

完成后接着查看备用主机上的文件是否同步过去了

首先先停止DRBD服务,为了保证数据的一致性

/etc/init.d/drbd stop

mount /dev/sdb1 /mnt (这里挂载是/dev/sdb1物理分区,因为DRBD在启动的时候才会加载DRBD设备到系统中)

ls /mnt 即可查看到文件

-rw-r--r-- 1 root root 104857600 May  2 07:07 drdb_test.tmp

(11)主从节点切换

方法1:

关掉主节点服务,这是drbd分区会自动在主节点卸载,然后在备节点执行切换命令

[root@node2 drbd.d]# drbdsetup /dev/drbd0 primary -o

也可以执行drbdadm -- --overwrite-data-of-peer primalry all

[root@node2 drbd.d]# cat /proc/drbd 

version: 8.3.16 (api:88/proto:86-97)

GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37

 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/Outdated C r-----

    ns:0 nr:10882272 dw:10882272 dr:672 al:0 bm:640 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

You have new mail in /var/spool/mail/root

Unknow是因为没有启动服务
[root@node1 drbd.d]# /etc/init.d/drbd start

[root@node2 drbd.d]# mount /dev/drbd0 /mnt

[root@node2 drbd.d]# ll /mnt

total 102416

-rw-r--r-- 1 root root 104857600 May  2 07:07 drdb_test.tmp  由此证明数据同步成功


方法2:

先卸载分区

[root@node2 drbd.d]# umount /mnt

[root@node2 drbd.d]# drbdadm secondary all

在node1执行

[root@node1 drbd.d]# drbdadm primary all

[root@node1 drbd.d]# mount /dev/drbd

[root@node1 drbd.d]# ll /mnt

total 102416

-rw-r--r-- 1 root root 104857600 May  2 07:07 drdb_test.tmp


至此drbd配置完成

参考:

http://www.linuxidc.com/Linux/2013-09/90321.htm

http://www.linuxidc.com/Linux/2015-11/124760.htm

http://www.linuxidc.com/Linux/2015-11/125332.htm