实现DRBD的简单配置
DRBD介绍
DRBD:Distributed 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.4,x86平台
本文以Primary/Secondary模型来配置
一、准备条件
1.在node1上:
在sda上准备一个分区:sda5,大小为2G,先不要格式化
- # vim /etc/sysconfig/network-scripts/ifcfg-eth0 #更改其中IPADDR,NETMASK为:
- IPADDR=172.16.22.10
- NETMASK=255.255.0.0
- # service network restart
- # hostname node1.lihuan.com
- # vim /etc/sysconfig/network #更改HOSTNAME为:
- HOSTNAME=node1.magedu.com
- # ssh-keygen -t rsa
- # ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
- # vim /etc/hosts #增加如下两项:
- 172.16.22.10 node1.lihuan.com nide1
- 172.16.22.11 node2.lihuan.com nide2
2.在node2上:
在sda上准备一个分区:sda5,大小为2G,先不要格式化
- # vim /etc/sysconfig/network-scripts/ifcfg-eth0 #更改其中IPADDR,NETMASK为:
- IPADDR=172.16.22.11
- NETMASK=255.255.0.0
- # service network restart
- # hostname node2.lihuan.com
- # vim /etc/sysconfig/network #更改HOSTNAME为:
- HOSTNAME=node2.magedu.com
- # ssh-keygen -t rsa
- # ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
- # vim /etc/hosts #增加如下两项:
- 172.16.22.10 node1.lihuan.com nide1
- 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 #复制样例配置文件作为配置文件
- # vim /etc/drbd.d/global-common.conf #内容如下:
- global {
- usage-count yes;
- # minor-count dialog-refresh disable-ip-verification
- }
- common {
- protocol C;
- handlers {
- 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";
- 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";
- local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
- # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
- # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
- # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
- # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
- # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
- }
- startup {
- wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
- wfc-timeout 120;
- }
- disk {
- on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes
- no-disk-drain no-md-flushes max-bio-bvecs
- }
- net {
- # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers
- # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret
- # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork
- cram-hmac-alg "sha1";
- shared-secret "mydrbdlab";
- }
- syncer {
- # rate after al-extents use-rle cpu-mask verify-alg csums-alg
- rate 1000M;
- }
- }
(2).定义一个资源:
- # vim /etc/drbd.d/web.res #内容如下:
- resource web {
- on node1.magedu.com {
- device /dev/drbd0;
- disk /dev/sda5;
- address 172.16.100.11:7789;
- meta-disk internal;
- }
- on node2.magedu.com {
- device /dev/drbd0;
- disk /dev/sda5;
- address 172.16.100.12:7789;
- meta-disk internal;
- }
- }
# 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上,查看服务启动状态:
- [root@node1 ~]# cat /proc/drbd
- version: 8.3.8 (api:88/proto:86-94)
- GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by
- [email protected], 2010-06-04 08:04:16
- 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----
- ns:2024308 nr:36 dw:64544 dr:1960114 al:27 bm:150 lo:0 pe:0 ua:0
- ap:0 ep:1 wo:b oos:0
说明:此时可以看到两个节点都是Secondary,这是由于没有定义谁是primary,这里定义以node1为primary
3.定义node1为primary
在node1上:
- # drbdadm -- --overwrite-data-of-peer primary web
- [root@node1 ~]# cat /proc/drbd
- version: 8.3.8 (api:88/proto:86-94)
- GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by
- [email protected], 2010-06-04 08:04:16
- 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
- ns:2024308 nr:36 dw:64544 dr:1960114 al:27 bm:150 lo:0 pe:0 ua:0
- ap:0 ep:1 wo:b oos:0
说明:此时看到node1为Primary了。
四、创建文件系统
文件系统的挂载只能在Primary节点进行,因此,这里只能在node1上进行:
在node1上:
- # mke2fs -j -L DRBD /dev/drbd0
- # mount /dev/drbd0 /mnt
- # cd /mnt
- # mkdir a b c #创建几个测试目录
- # touch 1 2 3 #创建几个测试文件
- [root@node1 ~]# ls /mnt
- 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模型。