前段时间研究了一下DRBD的工作方式,作了一下总结,跟大家分享一下。
一、DRBD的介绍DRBD是一种可以提供高可用性集群的块设备,它可以适时的同步远端主机和本地主机之间的数据,类似与Raid1的功能,我们可以将它看作为网络Raid1。在服务器上部署使用DRBD,可以用它代替共享磁盘阵列的功能,因为数据同时存在于本地和远端的服务器上,当本地服务器出现故障时,可以使用远端服务器上的数据继续工作,如果要实现无间断的服务,可以通过drbd结合另一个开源工具heartbeat,实现服务的无缝接管,关于heartbeat,现在还没有进行深入研究,只知道其大概的原理.
关于heartbeat的相关信息可以到官方网站查看。http://linux-ha.org
二、DRBD的安装
由于drbd的架设需要两台机器,假设两台机器名分别为drbd0和drbd1,其IP分别为10.190.40.200和10.190.40.201。虚拟机内核版本为:2.6.9-34.
DRBD的官方网站为http://www.drbd.org,下载其最新版本的源码(目前为8.2.1),
解压后直接运行make和make install,系统会自动加载drbd的模块和一些工具。模块名为drbd.ko,安装后在/lib/modules/2.6.9-34.EL/kernel/drivers/block/目录下可以看到,不同的内核版本路径可能不一样。在/sbin目录下可以看到drbdadm,drbdmeta ,drbdsetup这几个工具。
三、配置DRBD
1、准备drbd要使用的分区
为了试验效果,该分区最好是干净的分区,我在虚拟机中重新划分了一个分区/dev/hdb2作为drbd使用。分区的大小可以自己指定,视需要拷贝的数据量的大小而定。
2、修改drbd的配置文件
Drbd配置文件的为/etc/drbd.conf,这个配置文件记录了drbd在启动时的一些参数和drbd设备与硬盘分区的映射关系。在编译安装后会自动生成,我们需要根据自己机器的环境进行修改。下面是我虚拟机上的配置文件,注释已经很清楚了,我就关键部分作一下说明,见附件:
将这两个配置文件分别拷到两个虚拟机的/etc目录下。
3、启动drbd
为了能够适时的同步数据,在启动DRBD之前,我们需要分别在两台主机的hdb2分区上,创建供DRBD记录信息的数据块.分别在两个虚拟机上执行:
[root@drbd1 ~]# drbdadm create-md r0
r0就是上面配置文件中定义的资源名称。它将为r0这个资源创建供drbd记录信息的数据块。执行这个命令的时候会给出创建成功的提示信息。
现在准备工作已经做好了,我们需要在两个虚拟机上分别启动drbd.
[root@drbd1 /]# /etc/init.d/drbd start
在启动的时候,两个节点会有一个监听对方的过程,可以通过设置配置文件的wfc-timeout值来限定监听对方的时间,如果设置为0,那么节点在启动时如果不能监测到对方,将会无限期的等待,当然在等待的时候在命令行里会有提示,也可以强行跳过。
现在两个节点上的drbd都运行起来了,但是还没有设置哪个是主哪个是从,它怎么同步数据呢?我是将drbd1设置为主节点的,所以在drbd1这个虚拟机上执行命令
[root@drbd1 /]# drbdsetup /dev/drbd0 primary –o
说明:/dev/drbd0是配置文件中定义的drbd设备文件。
现在,drbd1就是主节点了。
这时通过命令 cat /proc/drbd查看drbd的运行状态。
下面是我在主节点上执行这个名后的结果:
version: 8.2.1 (api:86/proto:86-87)
GIT-hash: 318925802fc2638479ad090b73d7af45503dd184 build by root@localhost.localdomain, 2007-12-19 00:50:27
0: cs:WFConnection st:Primary/Unknown ds:UpToDate/DUnknown C r---
ns:513392 nr:0 dw:24538 dr:505600 al:64 bm:34 lo:0 pe:0 ua:0 ap:0
resync: used:0/31 hits:30540 misses:34 starving:0 dirty:0 changed:34
act_log: used:0/257 hits:6132 misses:64 starving:0 dirty:0 changed:64
我在执行的时候从节点drbd0还没有起来,所以存在st:Primary/Unknown这个记录,表示该节点已经作为主节点Primary了,而对方状态未知,我将从节点drbd0也起来后,再执行这个命令可以看到
[root@drbd1 ~]# cat /proc/drbd
version: 8.2.1 (api:86/proto:86-87)
GIT-hash: 318925802fc2638479ad090b73d7af45503dd184 build by root@localhost.localdomain, 2007-12-19 00:50:27
0: cs:Connected st:Primary/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:0
resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
现在两个节点都运行正常了,由于我已经进行过数据同步的测试,所以上面的节点中会有ds:UpToDate/UpToDate这个信息。表示,两个节点的数据已经同步,如果第一次运行的话,这里应该是ds:Inconsistent/Inconsistent,表示两个节点的数据不一致。还会有一个同步进度的信息,类似
[==>.................] sync'ed: 14.7% (262464/305152)K
finish: 0:02:58 speed: 1,440 (1,292) K/sec
finish: 0:02:58 speed: 1,440 (1,292) K/sec
当两端都同步完成后,我们就可以试验它保持主从数据的一致性了。
将主节点虚拟机drbd1上的drbd设备/dev/drbd0(说明一下,我在两个节点上都将/dev/drbd0作为drbd设备了)mount到一个目录,在我的虚报机上是/mnt/drbd1.然后朝里面拷贝一些文件,完成后在从节点虚拟机上先停止drbd:
[root@drbd0 ~]# /etc/init.d/drbd stop
如果不停止的话,drbd会占用这个设备,因此无法将它Mount到一个目录上。
停止后执行
[root@drbd0 ~]#Mount /dev/hdb2 /mnt/drbd0
然后到/mnt/drbd0这个目录下可以看到刚才在主节点上拷贝的一些数据,现在已经同步过来了。
如果需要切换两个节点上的主从关系,可以先在主节点上卸载drbd设备(umount),然后执行
[root@drbd1 ~]# drbdadm secondary r0
现在drbd1已经降为从节点了。
然后在以前的从节点上执行
[root@drbd0 ~]# drbdadm primary r0
就将其升为主节点了。
现在新的主节点上的数据就会向从节点上同步。
drbdadm -- --overwrite-data-of-peer primary all
