DRBD的简单实现
一. DRBD介绍

DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地
文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中.
本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会
保留有一份相同的数据,可以继续使用.

在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,
切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了.
DRBD的工作原理如下图:

+----------+
| 文件系统 |
+----------+
      |
      V
+--------------+
 | 块设备层    |
|(/dev/drbd0)  |
+--------------+
  |              |
  |              |
  V              V
+--------------+ +------------------+
| 本地硬盘 | | 远程主机硬盘 |
| (/dev/sda5) | | (/dev/sda5) |
+-------------+ +------------------+

二. DRBD的安装
使用的是drbd-8.3.2版.分别在两台主机上安装:
# tar zxvf drbd-8.3.2.tar.gz
# cd drbd-8.3.2
# make
# make install
加载模块
#modprobe drbd
#lsmod | grep drbd
三. DRBD的配置及使用
1.磁盘或分区的操作
这里要注意的是两个磁盘或分区最好大小一致,因为DRBD类似RAID1,大小不一致,将会产生浪费。可

先进行格式化(我在后面时一直不能格式化从节点,建议先格式话)
2.drbd.conf配置文件
DRBD的配置文件是/etc/drbd.conf.文件描述了DRBD设备与硬盘分区的映射关系及DRBD的一些配置参数

.
主节点:centos 5.4 主机名为nod1,IP地址为 192.168.0.29,DRBD分区为/dev/sda5
备节点: centos 5.4 主机名为nod2,IP地址为 192.168.0.20,DRBD分区为/dev/sda5

global { usage-count yes; } #是否参加使用者统计

common { syncer { rate 100M; } } # 设置主备节点同步时的网络速率最大值,单位是字节.
# 下面是一个"资源".里面包含一个DRBD设备的主备节点的各自信息
resource r0 {

protocol C; # 使用协议C.表示收到远程主机的写入确认后,则认为写入完成.
net { # 设置主备机之间通信使用的信息算法.
cram-hmac-alg sha1;
shared-secret "FooFunFactory";
}

on node1 { # 以on开头,后面是主机名.在{}中为这个主机的配置.
device /dev/drbd0; # 创建的DRBD设备 为/dev/drbd1使用的磁盘分区是/dev/sda5
disk /dev/sda5;
address 192.168.0.20:7788; # 设置DRBD的监听端口,用于与另一台主机通信
meta-disk internal;
}
on node2 {
device /dev/drbd0;
disk /dev/sda5;
address 192.168.0.29:7788;
meta-disk internal;
}
}

保证两台主机的/etc/drbd.conf文件一致.
3.DRBD的启动
启动DRBD之前,需要在两台主机的sda5分区上,创建供DRBD记录信息的数据块.分别在
两台主机上执行:
# drbdadm create-md r0
# drbdadm create-md r0

现在我们可以启动DRBD了,分别在两台主机上执行:
#service drbd start
# service drbd start
此时DRBD无法判断哪一方为主机,以哪一方的磁盘数据作为标准数据.我们需要初始化
一个主机.在node1上执行:
[root@node1 ~]# drbdsetup /dev/drbd0 primary -o
现在可以查看DRBD的状态,然后在nod1主机上执行:(两个节点的数据进行了同步)
[root@node1 ~]# cat /proc/drbd 
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by root@node1, 2010-09-01 

18:49:21
0: cs:Connected ro:Primary/Secondary ds:UpToDate/Diskless C r----
ns:138 nr:20 dw:20 dr:138 al:1 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:28
此时node1就是主节点,node2就是从节点
4.使用DRBD
你现在可以把主机上的DRBD设备挂载到一个目录上进行使用.备机的DRBD设备无法被挂载,因为它是
用来接收主机数据的,由DRBD负责操作.
在node1上执行:
[root@g105-1 /]# mount /dev/drbd0 /mnt/
现在,我们在mnt目录里建立一个200M的文件:

[root@node1 ~]# dd if=/dev/zero of=/mnt/123.tmp bs=100000 count=2

下面我们测试是否拷贝了数据,(因为从几点的设备是无法被挂载的,所以需要升级node2,降级node1

在node1,上先要卸载掉DRBD设备.
[root@node1 ~]# umount /mnt/drbd0
将主机降级为”备机”.
[root@node1 ~]# drbdadm secondary r0
[root@node1 ~]# cat /proc/drbd 
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by root@node1, 2010-09-01 

18:49:21
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/Diskless C r----
ns:80 nr:9 dw:9 dr:80 al:1 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:16

现在,两台主机都是从节点
在备机node2上,将它升级为主节点
[root@node2 ~]# drbdadm primary r0
[root@node2 ~]# cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by root@node2, 2010-08-17 

12:34:19
0: cs:Connected ro:Primary/Secondary ds:Diskless/UpToDate C r----
ns:6 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
现在,node2成为了”主机”.
挂载node2的设备
[root@node2 ~]# mount /dev/drbd0 /mnt/
[root@node2 ~]# cd /mnt/
[root@node2 mnt]# ls
123.tmp lost+found
可以看到node2上有了123.tmp文件。
这时我们将node2变作了主节点了,同样,操作的数据会被同步到node1上面.