一、部署
Role hostname IP Gateway LVM
Primary node2 eth0:192.168.32.32/24 192.168.32.254 /dev/vg01/lv01
eth1:10.160.100.32/24
Secondary node2 eth0:192.168.32.33/24 192.168.32.254 /dev/vg01/lv01
eth1:10.160.100.33/24
二、软件安装
1. drbd安装
[root@node3 ~]# rpm -ivh drbd83-8.3.10-2.el5.centos.i386.rpm
2. heartbeat的安装(略)
三、drbd配置(两节点drbd配置文件完全一样)
1. 主配置文件(/etc/drbd.conf)
[root@node2 ~]# vim /etc/drbd.conf
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
#drbd的主配置文件为/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d目录中,主配置文件中仅使用"include"指令将这些配置文件片断整合起来。通常,/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。
2. 全局配置文件(/etc/drbd.d/global_common.conf)
[root@node2 ~]# vim /etc/drbd.d/global_common.conf
global { #global段仅能出现一次,global段必须位于配置文件的最开始处
usage-count no;
#是否参与DRBD使用者统计,默认为yes。
# minor-count dialog-refresh disable-ip-verification
#minor-count:从(设备)个数,取值范围1~255,默认值为32。该选项设定了允许定义的resource个数,当要定义的resource超过了此选项的设定时,需要重新载入drbd内核模块。
#dialog-refresh time:time取值0,或任一正数。默认值为1。我没理解官方对该选项的解释。很少见到此选项被启用。
#disable-ip-verification:是否禁用ip检查
}
common { #common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义;非必须。
protocol C; #使用DRBD的第三种同步协议,写I/O到达本地磁盘和远程节点的磁盘之后,返回操作成功
#procoto A :写I/O到达本地磁盘和本地的TCP发送缓存区之后,返回操作成功
#protocol B :写I/O到达本地磁盘和远程节点的缓存之后,返回操作成功
handlers { #用来定义一系列处理器,用来回应特定事件。
fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
#outdate-peer "/usr/lib/drbd/obliterate-peer.sh";
split-brain "/usr/lib/drbd/notify-split-brain.sh root";
out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
}
startup {
#become-primary-on both;
wfc-timeout 120; #该选项设定一个时间值,单位是秒。在启用DRBD块时,初始化脚本drbd会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间的,默认为0,即不限制,永远等待
degr-wfc-timeout 120; #选项也设定一个时间值,单位为秒。也是用于限制等待时间,只是作用的情形不同:它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。
}
disk {
on-io-error detach;
#on-io-error选项:此选项设定了一个策略,如果底层设备向上层设备报告发生I/O错误,将按照该策略进行处理。有效的策略包括:
#pass_on:把I/O错误报告给上层设备。如果错误发生在primary节点,把它报告给文件系统,由上层设备处理这些错误(例如,它会导致文件系统以只读方式重新挂载),它可能会导致drbd停止提供服务;如果发生在secondary节点,则忽略该错误(因为secondary节点没有上层设备可以报告)。该策略曾经是默认策略,但现在已被detach所取代。
#call-local-io-error:调用预定义的本地local-io-error脚本进行处理。该策略需要在resource配置段的handlers部分,预定义一个相应的local-io-error命令调用。该策略完全由管理员通过local-io-error命令(或脚本)调用来控制如何处理I/O错误。
#detach:发生I/O错误的节点将放弃底层设备,以diskless mode继续工作。在disklessmode下,只要还有网络连接,drbd将从secondary node读写数据,而不需要failover。该策略会导致一定的损失,但好处也很明显,drbd服务不会中断。官方推荐和默认策略。
fencing resource-only;
#fencing选项:该选项设定一个策略来避免split brain的状况。有效的策略包括:
#dont-care:默认策略。不采取任何隔离措施。
#resource-only:在此策略下,如果一个节点处于split brain状态,它将尝试隔离对等端的磁盘。这个操作通过调用fence-peer处理器来实现。fence-peer处理器将通过其它通信路径到达对等节点,并在这个对等节点上调用drbdadm outdate res命令。
#resource-and-stonith:在此策略下,如果一个节点处于split brain状态,它将停止I/O操作,并调用fence-peer处理器。处理器通过其它通信路径到达对等节点,并在这个对等节点上调用drbdadm outdate res命令。如果无法到达对等节点,它将向对等端发送关机命令。一旦问题解决,I/O操作将重新进行。如果处理器失败,你可以使用resume-io命令来重新开始I/O操作
}
net {
cram-hmac-alg "sha1";
shared-secret "Myhttpd";
#DRBD同步时使用的验证方式和密码
}
syncer {
rate 20M; #同步时网络速率的最大值
}
3. 资源配置文件(/etc/drbd.d/*.conf)
[root@node2 ~]# vim /etc/drbd.d/web.res
resource web { #资源名
on node2 { #主机说明,必须以on开头,后面接hostname(uname -n)
device /dev/drbd0; #drbd生成的磁盘分区
disk /dev/vg01/lv01; #drbd使用的磁盘逻辑分区(lvm)
address 10.160.100.32:7788; #通信协议端口
meta-disk internal; #drbd的元数据存储方式
}
on node3 {
device /dev/drbd0;
disk /dev/vg01/lv01;
address 10.160.100.33:7788;
meta-disk internal;
}
}
四. 在两个节点上初始化已定义的资源并启动服务:
1. 初始化资源,在node2和node3上分别执行:
[root@node2 ~]# drbdadm create-md web #可用all表示为所有资源创建元数据库信息
#如出现创建不成功的情况,这时需覆盖文件系统中的设备块信息,可进行如下操作:
[root@node2 ~]#dd if=/dev/zero of=/dev/vg01/lv01 bs=1M count=128
#执行完dd命令后,再重新创建
2. 启动服务,在node2和node3上分别执行:
[root@node2 ~]# /etc/init.d/drbd start
3. 查看启动状态:
[root@node2 ha.d]# cat /proc/drbd
version: 8.3.10 (api:88/proto:86-96)
GIT-hash: 5c0b0469666682443d4785d90a2c603378f9017b build by [email protected], 2011-02-11 10:05:34
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:140768 nr:12 dw:140780 dr:1925 al:145 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
# ro:角色信息
# ds:磁盘状态,显示数据是否一致,(UpToDate/UpToDate表面同步没有延时)
# ns:网络发送的数据包,单位Kb
# dw:磁盘写操作
# dr:磁盘读操作
#也可以使用drbd-overview命令来查看:
[root@node2 ~]# drbd-overview
0:web Connected Secondary/Secondary Inconsistent/Inconsistent C r----
#从上面的信息中可以看出此时两个节点均处于Secondary状态。需要将其中一个节点设置为Primary。
4. 设置节点为Primary
[root@node2 ~]# drbdsetup /dev/drbd0 primary -o
#也可以在要设置为Primary的节点上使用如下命令来设置主节点:
[root@node2 ~]# drbdadm -- --overwrite-data-of-peer primary web
#以后再设置节点为primary节点是可用如下命名:
[root@node2 ~]# drbdadm primary web
[root@node2 ~]# drbd-overview
#再次查看状态,可以发现数据同步过程已经开始,等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次。
5、创建文件系统
文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
[root@node2 ~]# mke2fs -j -L DRBD /dev/drbd0
[root@node2 ~]# mount /dev/drbd0 /var/www/html
6、切换Primary和Secondary节点
对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:
[root@node2 ~]# touch /var/www/html/index{1,2,3}.html
[root@node2 ~]# umount /mnt/drbd
[root@node2 ~]# drbdadm secondary web
[root@node2 ~]# drbd-overview
0:web Connected Secondary/Secondary UpToDate/UpToDate C r----
[root@node3 ~]# drbdadm primary web
[root@node3 ~]# drbd-overview
0:web Connected Primary/Secondary UpToDate/UpToDate C r----
[root@node3 ~]# mount /dev/drbd0 /var/www/html
使用下面的命令查看在此前在主节点上复制至此设备的文件是否存在:
[root@node3 ~]#ls /var/www/html
index1.html index2.html index3.html
五. drbd的相关问题处理
1. 脑裂之后的手工处理
(1)首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据:
drbdadm disconnect resource_name/all
drbdadm secondary resource_name/all
drbdadm -- --discard-my-data connect resource_name/all
(2)在要作为primary的节点重新连接secondary(如果这个节点当前的连接状态为WFConnection的话,可以省略)
drbdadm connect resource_name/all
2.主从都StandAlone的情况
重启服务仍然无法链接成功,可以在两端分别执行:
drbdadm disconnect resource_name/all
drbdadm connect resource_name/all
六. drbd相关命令的使用
1. drbdsetup
drbsetup是drbd 程序套件中的底层配置工具。您可以使用该工具把低层模块设备和drbd 设备联系起来、安装drbd设备对,以便镜像它们的低层模块设备和检查运行drbd 设备的配置。
如:
在节点node2上,您可以发出以下命令
[root@node2 ~]# insmod drbd.o
[root@node2 ~]# drbdsetup /dev/drbd0 disk /dev/vg01/lv01
[root@node2 ~]# drbdsetup /dev/drbd0 net 10.160.100.33 10.160.100.32 B #B:同步协议
在节点node3上,您可以发出以下命令:
[root@node2 ~]# insmod drbd.o
[root@node2 ~]# drbdsetup /dev/drbd0 disk /dev/vg01/lv01
[root@node2 ~]# drbdsetup /dev/drbd0 net 10.160.100.32 10.160.100.33 B
[root@node2 ~]# drbdsetup /dev/drbd0 primary
此时,您就可以像在其他设备一样使用/dev/drbd0 了。
七. heartbeat的配置(两节点配置一样)
1. ha.cf配置略
2. authkeys配置略
3. haresource配置
[root@node2 ha.d]# vim /etc/ha.d/haresources
node2 drbddisk::web Filesystem::/dev/drbd0::/var/www/html
#drbddisk: heartbeat默认提供的DRBD管理脚本,web是drbd的资源
4. 启动heartbeat
[root@node2 ha.d]#service heartbeat start