对于一些中小型的企业来说,欲购买共享存储的设备压力还是挺大的。在承受不起那么昂贵的成本的情况下,DRBD可以发挥一定的作用,其实他就类似于基于网络的raid1,在各个主机的磁盘上都有一个完整的备份,所以在单台机器宕机的情况下,并不会对业务造成太大影响。
    我在做实验之前,在理解上有一个误区,这里提出来,给大家提下醒:
    一开始,我以为DRBD是这样的,局域网内每台服务器的磁盘上都有一份完全一样的数据,每台服务器挂载各自的硬盘,通过DRBD,实现数据同步。
    但是,我在下面做实验的时候发现从节点没办法挂载相关的DRBD设备(/dev/drbd1),也就是说,只有主服务器上的DRBD设备能够提供读写,而从服务器上的设备根本都没办法使用,但是它上面有数据,而且跟主服务器是同步的。
    这就说明了,我之前的理解是错误的。实际上,用到DRBD的时候,通常会用在HeartBeat+NFS+DRBD 类似于这样的架构中,DRBD只是提供数据的冗余。这次先不介绍那么多,下次实验再做。
【实验拓扑】
【实验环境】
virtual box 
centos 6.4  最小化

【实验步骤】
1、配置主机名
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=node1

[root@localhost ~]# vim /etc/hosts
192.168.56.120  node1
192.168.56.121  node2

[root@localhost ~]# hostname node1
===============================
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=node2

[root@localhost ~]# vim /etc/hosts
192.168.56.120  node1
192.168.56.121  node2

[root@localhost ~]# hostname node2

2、添加需要同步的硬盘
3、建立分区
[root@node1 ~]# fdisk -cu /dev/sdb
 The number of cylinders for this disk is set to 20805.
 There is nothing wrong with that, but this is larger than 1024,
 and could in certain setups cause problems with:
 1) software that runs at boot time (e.g., old versions of LILO)
 2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
 Command (m for help): n                                              //键入 n 表示要建立分区
 Command action
    e   extended
    p   primary partition (1-4)
 p                                                                                    //键入 p 表示建立主要分区
 Partition number (1-4): 1                                            //键入 1 为此主要分区代号
 First cylinder (1-20805, default 1):                                 //开始磁柱值,按下 enter 即可
 Using default value 1
 Last cylinder or +size or +sizeM or +sizeK (1-20805, default 20805): //结束磁柱值,按下 enter 即可
 Using default value 20805
 Command (m for help): w                                              //键入 w 表示确定执行刚才设定
 The partition table has been altered!
 Calling ioctl() to re-read partition table.
 Syncing disks.

 [root@node1 ~]# partprobe                                  //使刚才的 partition table 变更生效

注意:这里只对新添加的硬盘做分区,不进行格式化,也不挂载
建立分区完成后请建立 /db 目录
[root@node1 drbd]# mkdir /db

4、安装DRBD
        节点一和节点二接下来的配置上是完全一样的,这里只记录node1的步骤,node2按照node1操作。
[root@node1 ~]# yum -y install kernel-devel kernel-headers flex wget gcc gcc-c++ make
[root@node1 src]# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
[root@node1 src]# tar xf drbd-8.4.3.tar.gz 
[root@node1 src]# cd drbd-8.4.3
[root@node1 drbd-8.4.3]# ./configure --prefix=/usr/local/drbd --with-km
[root@node1 drbd-8.4.3]# make KDIR=/usr/src/kernels/2.6.32-358.14.1.el6.i686/
[root@node1 drbd-8.4.3]# make install
[root@node1 drbd-8.4.3]# mkdir -p /usr/local/drbd/var/run/drbd
[root@node1 drbd-8.4.3]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
[root@node1 drbd-8.4.3]# chkconfig --add drbd
[root@node1 drbd-8.4.3]# chkconfig drbd on

按照drbd模块
[root@node1 drbd-8.4.3]# cd /usr/src/drbd-8.4.3/drbd
[root@node1 drbd]# make clean
[root@node1 drbd]# make KDIR=/usr/src/kernels/2.6.32-358.14.1.el6.i686/
[root@node1 drbd]# cp drbd.ko /lib/modules/`uname -r`/kernel/lib/
[root@node1 drbd]# depmod

5、配置drbd
主要定义两块global和resource
[root@node1 drbd]# vim /usr/local/drbd/etc/drbd.conf 
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
主配置文件内容已经写好,无需修改,其实这个配置文件也只是将global和resource文件引用进来。

[root@node1 drbd]# vim /usr/local/drbd/etc/drbd.d/global_common.conf 
global {
        usage-count yes;
}

common {
        net {
                protocol C;
            }
        } 

[root@node1 drbd]# vim /usr/local/drbd/etc/drbd.d/r0.res 
resource r0 {
        on node1 {
                device  /dev/drbd1;
                disk    /dev/sdb1;
                address 192.168.56.120:7789;
                meta-disk internal;
        }

        on node2 {
                device  /dev/drbd1;
                disk    /dev/sdb1;
                address 192.168.56.121:7789;
                meta-disk internal;
        }
}

[root@node1 drbd]# modprobe drbd//载入drbd 模块
[root@node1 drbd]# lsmod |grep drbd//确认drbd模块是否载入
drbd                  292339  0 

[root@node1 drbd]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=100      //为新建的硬盘创建一些资料(否则create-md会报错)
[root@node1 drbd]# drbdadm create-md r0    //建立drbd resource
[root@node1 drbd]# drbdadm up r0        //启动resource r0

查看node1和node2的状态应该类似下面的:
[root@node1 drbd]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node1, 2013-07-2

 1: cs:Connected ro:Secondary/Secondaryds: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:1047484


表明现在已经启动服务,而且两个节点都是从节点(Secondary),还没有设置同步(即需要设置Primary Node)

以下操作仅在node1执行
设置node1为primary node:

[root@node1 drbd]# drbdadm primary --force r0
再次查看node1的状态:
[root@node1 drbd]# cat /proc/drbd 
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node1, 2013-07-29 08:48:43

 1: cs:SyncSource ro:Primary/Secondaryds:UpToDate/Inconsistent C r---n-
    ns:172600 nr:0 dw:0 dr:173720 al:0 bm:10 lo:0 pe:3 ua:1 ap:0 ep:1 wo:f oos:877500

我们看到状态已经变成Primary/Secondary,即设置primary node成功


创建DRBD文件系统(以下操作仅在node1执行)
将/dev/drbd1 格式化为ext3格式的文件系统并挂载到我们创建的/db目录下
[root@node1 ~]# mkfs.ext3 /dev/drbd1 
[root@node1 ~]# mount /dev/drbd1 /db/

[root@node1 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                      6.5G  903M  5.2G  15% /
tmpfs                 250M     0  250M   0% /dev/shm
/dev/sda1             485M   30M  430M   7% /boot
/dev/drbd1           1007M   18M  939M   2% /db
现在,只要往/db目录写入数据,drbd就会立刻把数据同步到备用机192.168.56.121上了
[root@node1 ~]# echo "test DRBD" > /db/test.txt

6、测试同步
当备机node2启动drbd时,/dev/sdb1是无法挂载的,如果要做同步的测试,我们可以在node1的/db/目录写入数据,然后停掉node2的drbd。
[root@node2 drbd]# mount -t ext3 /dev/sdb1 /db
mount: /dev/sdb1 already mounted or /db busy          //没有停掉node2的drbd是没办法挂载sdb1的

[root@node2 drbd]# drbdadm down r0
[root@node2 drbd]# mount -t ext3 /dev/sdb1 /db
[root@node2 drbd]# cat /db/test.txt 
test DRBD

可以看到node1上面的数据已经同步过来

如果需要手动切换主备,可以这样做:
[root@node1 ~]# umount /dev/drbd1 
[root@node1 ~]# drbdadm secondary r0

[root@node2 drbd]# drbdadm primary r0

[root@node1 ~]# cat /proc/drbd 
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@node1, 2013-07-29 08:48:43

 1: cs:Connected ro:Secondary/Primaryds:UpToDate/UpToDate C r-----
    ns:1080932 nr:0 dw:33460 dr:1049250 al:14 bm:67 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

可以看到已经成功切换了!
至此实验完成!