一、DRBD简介


DRBD的全称为:Distributed ReplicatedBlock 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协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议



五、DRBD支持的底层块设备

DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在上面内创建文件系统。DRBD所支持的底层设备有以下这些类:

1、一个磁盘,或者是磁盘的某一个分区;

2、一个RAID设备;

3、一个LVM的逻辑卷;


四、 DRBD工作原理图


DRBD是linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据。类似于一个网络RAID-1的功能,如图所示:

108857041256.jpg


六、DRBD的配置工具

drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令。

drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用。

drbdmeta:管理META数据结构,平时很少直接用。


七、DRBD的配置文件说明 DRBD的主配置文件为/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d目录中,主配置文件中仅使用"include"指令将这些配置文件片断整合起来。通常,/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。

在配置文件中,global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开为多个文件的话,global段必须位于配置文件的最开始处。目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。

common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义。实际应用中,common段并非必须,但建议将多个资源共享的参数定义为common段中的参数以降低配置文件的复杂度。

resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义。

drbd配置文件是分为模块化的,drbd.conf是主配置文件,其它模块配置文件在/etc/drbd.d/下


八、DRBD 资源 

Resource name:可以是除了空白字符的任意的ACSII码字符

DRBD device:在双方节点上,此DRBD设备的设备文件;一般为/dev/drbdN,其主设备号147

Disk configuration:在双方节点上,各自提供的存储设备

Nerwork configuration:双方数据同步时所使用的网络属性


案例

resource data {     #资源名为“data”  

  on master {        #设置数据节点master    

    device    /dev/drbd0;   #配置drbd的标示名    

    disk      /dev/sdb1; #指定要用于drbd的设备  

    address  192.168.1.136:7788; #指定数据节点ip和端口号  

    meta-disk internal; #配置meta数据盘,我们这里使用的meta-disk和drbd数据盘是一个分区,这里还可以单独分区。

  }    

  on slave {    

    device    /dev/drbd0;    

    disk      /dev/sdb1;    

    address  192.168.1.137:7788;    

    meta-disk internal;    

  }    

}



九、安装DRBD


说明:drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。


master:

[root@master ~]# yum -y install drbd84 kmod-drbd84

slave:

[root@slave ~]# yum -y install drbd84 kmod-drbd84


查看启动后的状态/etc/init.d/drbd status

drbd driver loaded OK; device status:

version: 8.2.6 (api:88/proto:86-88)

GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-build, 2008-10-03 11:30:17

m:res cs st ds p mounted fstype

0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C

现在两机器都是处于Secondary,即备机状态。(红色部分标记),

错误的

drbd driver loaded OK; device status:

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

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

m:res  cs            ro                 ds                     p  mounted  fstype

0:r0   WFConnection  Secondary/Unknown  Inconsistent/DUnknown  C

如果是Unknow,则检查两台是否配置一样。



十、DRBD主备节点切换

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

1停止drbd服务切换

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

[root@slave ~]#drbdadm primary all

此时会报错:

2: State change failed: (-7) Refusing to be Primary while peer is not outdated

Command 'drbdsetup 2 primary' terminated with exit code 11

因此,必须在备用节点执行如下命令:

[root@slave ~]#drbdsetup /dev/drbd0 primary –o

或者

[root@slave ~]#drbdadm -- --overwrite-data-of-peer primary all

此时就可以正常切换了。

当在备用节点执行切换到主节点命令后,原来的主用节点自动变为备用节点。无需在主用节点再次执行切换到备用节点的命令。


2正常切换

在主节点卸载磁盘分区,

umount /mnt/

然后执行

[root@master ~]#drbdadm secondary all

如果不执行这个命令,直接在备用节点执行切换到主节点的命令,会报错:

2: State change failed: (-1) Multiple primaries not allowed by config

Command 'drbdsetup 2 primary' terminated with exit code 11

接着,在备用节点执行

[root@slave ~]#drbdadm primary all

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

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


参考文档

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

http://www.educity.cn/linux/1149600.html