实现DRBD的简单配置

DRBD介绍

DRBDDistributed Replicated Block Device 分布式复制的块设备,是一个软件实现的、无共享的、服务器之间镜像块设备内容存储复制的解决方案。DRBD的功能在内核中开启,在内核中完成。一段工作在内核空间,一段工作在用户空间。

DRBD的系统结构图:

说明:在linux kernel 2.6.33之前,DRBD并没有做进内核,而是需要通过打内核补丁的方式打进内核并重新编译内核;linux kernel 2.6.33以后,DRBD直接做进内核了,只需要在编译内核时选中DRBD功能就行了。

由于作者本人的内核版本低于2.6.33,但又不想通过打内核补丁的方式重新编译内核,在专业人士的指导下,找到了一条捷径:只需要安装一个内核模块,不需要重新编译内核即可(此时这个内核模块是一个rpm包)。

本实验共需两个服务器(两个测试节点):

node1.lihuan.com  IP:172.16.22.10

node2.magedu.com  IP:172.16.22.11

系统为rhel5.4x86平台

本文以Primary/Secondary模型来配置

一、准备条件

1.node1上:

sda上准备一个分区:sda5,大小为2G,先不要格式化

  1. # vim /etc/sysconfig/network-scripts/ifcfg-eth0  #更改其中IPADDR,NETMASK为:  
  2. IPADDR=172.16.22.10  
  3. NETMASK=255.255.0.0  
  4. # service network restart  
  5. # hostname node1.lihuan.com  
  6. # vim /etc/sysconfig/network  #更改HOSTNAME为:  
  7. HOSTNAME=node1.magedu.com  
  8. # ssh-keygen -t rsa  
  9. # ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.22.11  
  10. # vim /etc/hosts  #增加如下两项:  
  11. 172.16.22.10   node1.lihuan.com nide1  
  12. 172.16.22.11   node2.lihuan.com nide2 

 

2.node2上:

sda上准备一个分区:sda5,大小为2G,先不要格式化

  1. # vim /etc/sysconfig/network-scripts/ifcfg-eth0   #更改其中IPADDR,NETMASK为:  
  2. IPADDR=172.16.22.11  
  3. NETMASK=255.255.0.0  
  4. # service network restart  
  5. # hostname node2.lihuan.com  
  6. # vim /etc/sysconfig/network  #更改HOSTNAME为:  
  7. HOSTNAME=node2.magedu.com  
  8. # ssh-keygen -t rsa  
  9. # ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.22.10  
  10. # vim /etc/hosts  #增加如下两项:  
  11. 172.16.22.10   node1.lihuan.com nide1  
  12. 172.16.22.11   node2.lihuan.com nide2 

 

二、安装配置DRBD

1.安装DRBD软件以及内核模块

所需软件包为:

drbd83-8.3.12-2.el5.centos.i386.rpm

kmod-drbd83-PAE-8.3.12-1.el5.centos.i686.rpm

下载地址为:http://mirrors.163.com/centos/5.8/extras/i386/RPMS/

node1上安装:

rpm -ivh drbd83-8.3.12-2.el5.centos.i386.rpm  kmod-drbd83-PAE-8.3.12-1.el5.centos.i686.rpm 

node2上安装:

rpm -ivh drbd83-8.3.12-2.el5.centos.i386.rpm  kmod-drbd83-PAE-8.3.12-1.el5.centos.i686.rpm

 

2.drbd进行配置

drbd的主配置文件/etc/drbd.conf,为了方便管理将配置文件分成多个部分放在/etc/drbd.d/下,主配置文件使用"include"指令将这些配置文件片断整合起来。

(1).建立主配置文件以及修改片段配置文件

# cp /usr/share/doc/drbd83-8.3.8/drbd.conf  /etc  #复制样例配置文件作为配置文件

  1. # vim /etc/drbd.d/global-common.conf  #内容如下:  
  2. global {  
  3.         usage-count yes;  
  4.         # minor-count dialog-refresh disable-ip-verification  
  5. }  
  6.    
  7. common {  
  8.         protocol C;  
  9.         handlers {  
  10.                 pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";  
  11.                 pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";  
  12.                 local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";  
  13.                 # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";  
  14.                 # split-brain "/usr/lib/drbd/notify-split-brain.sh root";  
  15.                 # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";  
  16.                 # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";  
  17.                 # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;  
  18.         }  
  19.  
  20.         startup {  
  21.                 wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb  
  22.                 wfc-timeout 120;  
  23.         }  
  24.  
  25.         disk {  
  26.                  on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes  
  27.                  no-disk-drain no-md-flushes max-bio-bvecs  
  28.         }  
  29.  
  30.         net {  
  31.                 # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers  
  32.                 # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret  
  33.                 # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork  
  34.                cram-hmac-alg "sha1";  
  35.                 shared-secret "mydrbdlab";  
  36.         }  
  37.    
  38.         syncer {  
  39.                 # rate after al-extents use-rle cpu-mask verify-alg csums-alg  
  40.                rate 1000M;  
  41.         }  

 

(2).定义一个资源:

  1. # vim /etc/drbd.d/web.res  #内容如下:  
  2. resource web {  
  3.   on node1.magedu.com {  
  4.     device    /dev/drbd0;  
  5.     disk      /dev/sda5;  
  6.     address   172.16.100.11:7789;  
  7.     meta-disk internal;  
  8.   }  
  9.   on node2.magedu.com {  
  10.     device    /dev/drbd0;  
  11.     disk      /dev/sda5;  
  12.     address   172.16.100.12:7789;  
  13.     meta-disk internal;  
  14.   }  
  15. }  

 

# scp -r  /etc/drbd.*  node2:/etc   #由于两个节点的配置文件相同,直接把配置文件拷贝到另一个节点

 

三、测试

1.初始化资源并启动服务:

node1上:

# drbdadm create-md web

node2上:

# drbdadm create-md web

node1上:

# /etc/init.d/drbd start

node2上:

# /etc/init.d/drbd start

2.node1上,查看服务启动状态:

  1. [root@node1 ~]# cat /proc/drbd  
  2. version: 8.3.8 (api:88/proto:86-94)  
  3. GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by   
  4. mockbuild@builder10.centos.org, 2010-06-04 08:04:16  
  5.  0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----  
  6.     ns:2024308 nr:36 dw:64544 dr:1960114 al:27 bm:150 lo:0 pe:0 ua:0   
  7. ap:0 ep:1 wo:b oos:0  

说明:此时可以看到两个节点都是Secondary,这是由于没有定义谁是primary,这里定义以node1primary

3.定义node1primary

node1上:

  1. # drbdadm -- --overwrite-data-of-peer primary web  
  2. [root@node1 ~]# cat /proc/drbd  
  3. version: 8.3.8 (api:88/proto:86-94)  
  4. GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by   
  5. mockbuild@builder10.centos.org, 2010-06-04 08:04:16  
  6.  0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----  
  7.     ns:2024308 nr:36 dw:64544 dr:1960114 al:27 bm:150 lo:0 pe:0 ua:0   
  8. ap:0 ep:1 wo:b oos:0 

说明:此时看到node1Primary了。

 

四、创建文件系统

文件系统的挂载只能在Primary节点进行,因此,这里只能在node1上进行:

node1上:

  1. # mke2fs -j -L DRBD /dev/drbd0  
  2. # mount /dev/drbd0 /mnt  
  3. # cd /mnt  
  4. # mkdir a b c   #创建几个测试目录   
  5. # touch 1 2 3    #创建几个测试文件  
  6. [root@node1 ~]# ls /mnt  
  7. 1  2  3  a  b  c  lost+found 

 

现在把主节点改为node2

首先在node1上:

# umount /mnt

# drbdadm secondary web

说明:先卸载/dev/drbd0再设置node1为次节点

然后在node2上:

# drbdadm primary web

# mount /dev/drbd0 /mnt

说明:先设置node2为主节点再挂载/dev/drbd0

[root@node2 ~]# ls /mnt

1  2  3  a  b  c  lost+found

此时在node2上也能看到刚才创建的目录以及文件了。

一个简单的DRBD实现了。

 

补充知识:

DRBD的资源角色有:

primary(主节点):可读可写可挂载

secondary(次节点):不可读不可写不可挂载

DRBD有两种模型:

Dual-primary

Primary/Secondary

DRBD的复制模型有:

Protocol A:异步复制(主节点一旦写入完成,数据发往本地TCP/IP缓存就宣告完成)

Protocol B:内存同步复制,半同步复制(主节点一旦写入完成,数据发往接收方的内存空间中,就宣告完成)

Protocol C:同步复制(主节点一旦写入完成,数据发往接收方的磁盘中,就宣告完成)

 

要想简单实现Primary/Secondary模型只需要在/etc/drbd.d/global-common.conf文件中net{……}

里增加如下一句:

allow-two-primaries;

并定义二者都为primary即可实现Primary/Secondary模型。