群集之
DRDB+Heartbeat
Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。
数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)
DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。
DRBD功能
单主模式:典型的高可靠性集群方案。
复主模式:需要采用共享cluster文件系统,如GFS和OCFS2。用于需要从2个节点并发访问数据的场合,需要特别配置。
复制模式:3种模式:
协议A:异步复制协议。本地写成功后立即返回,数据放在发送buffer中,可能丢失。
协议B:内存同步(半同步)复制协议。本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失。
协议C:同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏,则数据可能丢失。
一般用协议C。选择协议将影响流量,从而影响网络时延。
有效的同步:按线性而不是当初写的顺序同步块。同步损坏时间内的不一致数据。
在线的设备检验:一端顺序计算底层存储,得到一个数字,传给另一端,另一端也计算,如果不一致,则稍后进行同步。建议一周或一月一次。
复制过程的一致性检验:加密后,对方若不一致则要求重传。防止网卡、缓冲等问题导致位丢失、覆盖等错误。
Split brain:当网络出现暂时性故障,导致两端都自己提升为Primary。两端再次连通时,可以选择email通知,建议手工处理这种情况。
当数据写在缓冲区里,没有真正写到磁盘上时,系统崩溃会导致数据丢失。而disk flush是指将数据真正写到磁盘上后才返回。
有些带电池的硬盘控制器,如带电池的带点出Dell PERC Raid卡,不但自带缓存而且自带电池,会在系统意外断电或者崩溃后将最后的数据写入磁盘,对这类控制器,可以使用disk flush,从而在保证性能的前提下提高了数据的安全性。
磁盘错误处理策略:
传递给上层:可能造成文件系统remounting成只读,不推荐。
对上层屏蔽:用另一端的相应块进行读写,应用不中断。可以在任何方便的时候再切换。
不一致的(inconsistent)数据:不能以任何方式访问和使用的数据。如正在同步时的目标节点数据,这些数据不能识别,不能mount,甚至不能通过磁盘的自动检测。
过期的(outdated)数据:在备机上的数据,与主机一致,但不需要同步。如主备机网络中断后,备机上的数据就是过期的。
DRBD有接口允许应用程序在网络中断时将备机数据标识为过期的。DRBD拒绝将这个节点提升为主角色。这些管理接口在Heartbeat框架上得到完整实现。
一旦过期资源的复制链接恢复,他的过期标志自动清除,接着进行后台同步。
工作原理
在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,
切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了.
实验步骤:
DRBD
一、准备环境
1.系统环境
# uname –r //内核版本
2.6.18-164.el5
# cat /etc/redhat-release //查看系统信息
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
2.修改主机名称等
在节点1上进行修改
# hostname wj1.a.com //修改主机名称
# vim /etc/sysconfig/network //修改文件
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=wj1.a.com
之后退出再次登陆。
# hostname //查看名称
wj1.a.com
# vim /etc/hosts //修改hosts文件
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.2.1 wj1.a.com
192.168.2.3 wj 2.a.com
在节点2上进行修改
# hostname wj2.a.com //修改主机名称
# vim /etc/sysconfig/network //修改文件
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=wj2.a.com
之后退出再次登陆。
# hostname //查看名称
wj2.a.com
# vim /etc/hosts //修改hosts文件
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.2.1 wj1.a.com
192.168.2.3 wj2.a.com
3.安装所需的文件
预先将所需的文件上传到管理员家目录。以下操作在wj1.a.com和wj2.a.com上都进行操作。
# yum localinstall *.rpm --nogpgcheck –y //使用yum进行安装可以有效的解决包的依赖性问题。
4.同步时钟
要求两个节点上的始终必须要一致。
# hwclock -s //同步始终
5.加载模块
在两个节点上都去进行如下操作。
# modprobe drbd //加载drbd模块
#
# lsmod |grep drbd //查看模块
drbd 228528 0
#
6.创建新分区
以下操作要求在wj1.a.com和wj2.a.com上都进行。同时要求两个节点所创建的新分区大小一致。
# fdisk -l //查看有关情况
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 1288 10241437+ 83 Linux
/dev/sda3 1289 1415 1020127+ 82 Linux swap / Solaris
# fdisk /dev/sda
The number of cylinders for this disk is set to 2610.
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 //创建新分区
Command action
e extended
p primary partition (1-4)
p //创建主分区
Selected partition 4
First cylinder (1416-2610, default 1416):
Using default value 1416
Last cylinder or +size or +sizeM or +sizeK (1416-2610, default 2610): +1G //两个节点的分区大小要一致。
Command (m for help): p //显示
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 1288 10241437+ 83 Linux
/dev/sda3 1289 1415 1020127+ 82 Linux swap / Solaris
/dev/sda4 1416 1538 987997+ 83 Linux
Command (m for help): w 保存
# fdisk -l //再次查看
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 1288 10241437+ 83 Linux
/dev/sda3 1289 1415 1020127+ 82 Linux swap / Solaris
/dev/sda4 1416 1538 987997+ 83 Linux
#
# partprobe /dev/sda //重新加载
二、DRBD配置
以下操作要求在节点wj1和wj2上都做。
1.修改conf配置文件
# cd /usr/share/doc/drbd83-8.3.8/
#ls
ChangeLog COPYING drbd.conf file.list README
#cp drbd.conf /etc/ 复制配置文件到相关目录
cp: overwrite `/etc/drbd.conf'? y
#cd /etc/drbd.d/
# ls
global_common.conf
# cp -p global_common.conf global_common.conf.bak //最好对文件进行备份
# vim global_common.conf
//第一列是行的序号
1 global {
2 usage-count no;
3 }
4
5 common {
6 protocol C;
7 startup {
8 wfc-timeout 120;
9 degr-wfc-timeout 120;
10 }
11 disk {
12 on-io-error detach;
13 fencing resource-only;
14 }
15 net {
16 cram-hmac-alg "sha1";
17 shared-secret "mydrbdlab";
18 }
19 syncer {
20 rate 100M;
21 }
22 }
2.修改资源文件
# cd /etc/drbd.d/
# vim web.res
1 resource web {
2 on wj1.a.com {
3 device /dev/drbd0;
4 disk /dev/sda5;
5 address 192.168.2.1:7789;
6 meta-disk internal;
7 }
8 on wj2.a.com {
9 device /dev/drbd0;
10 disk /dev/sda5;
11 address 192.168.2.3:7789;
12 meta-disk internal;
13 }
14 }
3.创建资源
#drbdadm create-md web
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
4.启动服务、测试
创建文件系统(在主节点上实现)
mkfs -t ext3 -L drbdweb /dev/drbd0
[root@wj2 ~]# mkdir /web
[root@wj2 ~]# drbdadm primary web
[root@wj2 ~]# drbd-overview
0:web Connected Primary/Secondary UpToDate/UpToDate C r----
[root@wj2 ~]# drbdadm role web
Primary/Secondary
[root@wj2 ~]# mount /dev/drbd0 /web
[root@wj2 web]# vim test.html
[root@wj2 ~]# umount /web
[root@wj2 ~]# drbdadm secondary web
测试,把wj2变成从的,wj1 变成主的
[root@wj1 web]# drbdadm primary web
[root@wj1 web]# mount /dev/drbd0 /web
[root@wj1 web]# ll /web
总计 20
drwx------ 2 root root 16384 10-18 00:13 lost+found
-rw-r--r-- 1 root root 18 10-17 16:28 test.html
[root@wj1 web]#
三 NFS配置
两台服务器的nfs配置必须要一致。
1.修改相关文件
# vim /etc/exports
/web *(rw,sync,insecure,no_root_squash,no_wdelay)
2.执行相关操作。
#service portmap start && chkconfig portmap on
#service nfs start && chkconfig nfs on
3.修改nfs启动脚本
# vim /etc/init.d/nfs
122 killproc nfsd –9
四、Heartbeat配置
Heartbeat的配置要求两个节点的配置一致。在wj1和wj2上进行如下操作
1.复制模版文件
# cd /usr/share/doc/heartbeat-2.1.4/
# cp authkeys ha.cf haresources /etc/ha.d/
2.修改相关的配置信息
# cd /etc/ha.d/ //切换到相关目录
# vim ha.cf
24 debugfile /var/log/ha-debug
29 logfile /var/log/ha-log
34 logfacility local0
48 keepalive 2
56 deadtime 10
76 udpport 694
121 bcast eth0 //此行可以添加在任意一行
157 auto_failback off
211 node wj1.a.com
212 node wj2.a.com
3.修改资源文件
# echo "node1.a.com IPaddr::192.168.2.2/24/eth0 drbddisk::web Filesystem::/dev/drbd0::/web::ext3 killnfsd">>/etc/ha.d/haresources
4.修改key文件
# vim authkeys
23 auth 1
24 1 crc
5.手工创建文件
# cd /etc/ha.d/resource.d/
# echo "killall -9 nfsd ; /etc/init.d/nfs restart ; exit 0" >>/etc/ha.d/resource.d/killnfsd
6.修改配置文件的权限
# chmod 600 /etc/ha.d/authkeys
# chmod 755 /etc/ha.d/resource.d/killnfsd
7.启动服务
# service heartbeat start
五、测试
使用客户端进行测试
1.挂载
#mkdir /mnt/nfs
#cd
#mount 192.168.2.2:/web /mnt/nfs
2.创建测试脚本文件
#vim /mnt/test.sh
//此配置脚本文件的主要作用是为了反复的读写操作
while true
do
echo --->trying touch x:`date`
touch x
echo <---done touch x:`date`
echo
sleep 2
done
~
3.执行测试文件
#cd /mnt/nfs/
# bash /mnt/test.sh
--->trying touch x:2012年 10月 17日 星期三 21:21:09 CST
<---done touch x: 2012年 10月 17日星期三 21:21:09 CST
//让客户端一直执行脚本文件,到服务器节点node1上关闭heartbeat服务,之后在客户端会发现丢弃现象,之后文件系统又恢复正常。
--->trying touch x: 2012年 10月 17日 星期三 21:23:08 CST
touch: cannot touch `x': Stale NFS file handle
<-----done touch x: 2012年 10月 17日星期三 21:23:08 CST
--->trying touch x: 2012年 10月 17日星期三 21:23:43 CST
<-----done touch x: 2012年 10月 17日星期三 21:23:43 CST