DRBD(Distribute Replicated Block Device) :分布式复制块设备 在高可用性网络中,实现多个节点之间的存储一致性,当一个节点的磁盘内容变化后,自动将数据同步到其他节点上。镜像设备可以是硬盘、分区或逻辑卷
只有主设备才能对自己的磁盘读取、写入、挂载,从设备必须变为主设备才能操作磁盘
主备模式:同一时刻只有一台设备工作。此时文件系统可以使用本地文件系统:ext2 ext3 xfs等
主主模式:同一时刻可以有两个节点同时工作,所以要锁机制和推送功能,因此要用到群集文件系统:gfs 或ocfs
两节点之间的协议:
protocol A:异步的传输
protocol B:同步到内存
protocol C:同步到对方的磁盘上
案例一:
节点一的环境:
内核版本:2.6.18-164.el5
主机名:node1.a.com
ip地址:eth0: 192.168.1.1/24
节点二的环境:
内核版本:2.6.18-164.el5
主机名:node2.a.com
ip地址:eth0: 192.168.1.2/24
1.按照实验环境要求分别配置两个节点的ip参数,主机名,并查看内核版本
节点一:
# uname -r 查看内核版本,在2.6.33及以上的内核中有DRBD
2.6.18-164.el5
# hostname node1.a.com 临时修改主机名
# vim /etc/sysconfig/network 编辑文件永久修改主机名
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node1.a.com
# uname -n 查看当前的主机名
node1.a.com
节点二:
# uname -r 查看内核版本,在2.6.33及以上的内核中有DRBD
2.6.18-164.el5
# hostname node2.a.com 临时修改主机名
# vim /etc/sysconfig/network 编辑文件永久修改主机名
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node2.a.com
# uname -n 查看当前的主机名
node2.a.com
2.要保证两个节点之间可以相互解析,在两台节点上分别配置hosts文件
# vim /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.1.1 node1.a.com
192.168.1.2 node2.a.com
3.为两个节点的磁盘进行分区,要求两个节点上的分区大小要一模一样。
以下操作在两台节点上都进行
# fdisk /dev/sda
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
Command (m for help): n 增加一个分区
Command action
e extended
p primary partition (1-4)
e 增加和一个扩展分区
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): 结束柱面
Using default value 2610
Command (m for help): n 增加一个分区(此时默认为逻辑分区)
First cylinder (1416-2610, default 1416): 起始柱面
Using default value 1416
Last cylinder or +size or +sizeM or +sizeK (1416-2610, default 2610): +1G 大小为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 2610 9598837+ 5 Extended
/dev/sda5 1416 1538 987966 83 Linux
Command (m for help): w 保存分区结果并退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
4.使内核重新读取分区表(两个节点上做同样的操作)
# partprobe /dev/sda
# cat /proc/partitions
major minor #blocks name
8 0 20971520 sda
8 1 104391 sda1
8 2 10241437 sda2
8 3 1020127 sda3
8 4 0 sda4
8 5 987966 sda5
5.上传GRBD主程序和内核模块程序,由于当前内核模块为2.6.18 ,在2.6.33的内核中才开始集成DRBD的内核代码,但是可以使用模块方式将DRBD的载入内核。安装这两个软件
drbd83-8.3.8-1.el5.centos.i386.rpm GRBD主程序
kmod-drbd83-8.3.8-1.el5.centos.i686.rpm 内核模块
# rpm -ivh drbd83-8.3.8-1.el5.centos.i386.rpm
# rpm -ivh kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
6.查看drbd的安装路径
# rpm -ql drbd83
/etc/drbd.conf 配置文件
/etc/rc.d/init.d/drbd 配置脚本
/sbin/drbdadm 高级别管理工具
/sbin/drbdmeta 低级别管理工具
/sbin/drbdsetup 低级别管理工具
/usr/sbin/drbd-overview 查看工具
7.在两个节点上分别执行以下命令
#modprobe drbd 加载内核模块
# lsmod |grep drbd 显示是否加载成功
drbd 228528 0
8.在两个节点上编辑grbd的配置文件 :/etc/grbd.conf
#
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf"; 包含全局通用配置文件
include "drbd.d/*.res"; 包含资源文件
# please have a a look at the example configuration file in
# /usr/share/doc/drbd83/drbd.conf
9. 在两个节点上编辑global_common.conf文件,编辑之前最好做备份
# cd /etc/drbd.d/
# cp -p global_common.conf global_common.conf.bak
#vim global_common.conf
global {
usage-count no; 不统计用法计数(影响性能)
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; 使用C类协议当存储到对方的磁盘后才算结束
handlers {
# 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 120;
degr-wfc-timeout 120;
}
disk {
on-io-error detach; 当io出错时拆除磁盘
fencing resource-only;
}
net {
cram-hmac-alg "sha1";通讯时使用sha1加密
shared-secret "abc"; 预共享密钥,双方应相同
}
syncer {
rate 100M; 同步时的速率
}
}
10.在两个节点上分别编辑资源文件,文件名可随便写,但是不能有空格
#/etc/drbd.d/ web.res
resource web { 资源名
on node1.a.com { node1.a.com的资源
device /dev/drbd0; 逻辑设备名,在/dev/下
disk /dev/sda5; 真实设备名,节点间共享的磁盘或分区
address 192.168.1.1:7789; 节点1的ip地址
meta-disk internal; 磁盘类型
}
on node2.a.com { node2.a.com的资源
device /dev/drbd0;
disk /dev/sda5;
address 192.168.1.2:7789;
meta-disk internal;
}
11.在两个节点上初始化资源web
# drbdadm create-md web 创建多设备web
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
12.在两个节点上启动drbd服务
# service drbd start
Starting DRBD resources: [
web
Found valid meta data in the expected location, 1011671040 bytes into /dev/sda5.
d(web) n(web) ]...
13.查看当前哪台设备室激活设备
# 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: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:b oos:987896
当前设备的角色/对方的角色 ,可知当前两台设备都未激活,都无权限读取磁盘
或是使用命令drbd-overview 查看当前设备状态
drbd-overview
0:web Connected Secondary/Secondary Inconsistent/Inconsistent C r----
14.在节点1上执行命令,将当前设备成为主设备
# drbdadm -- --overwrite-data-of-peer primary web
# drbd-overview 查看当前激活设备,显示该设备为主设备,已经同步3.4%
0:web SyncSource Primary/Secondary UpToDate/Inconsistent C r----
[>....................] sync'ed: 3.4% (960376/987896)K delay_probe: 87263
节点2 上的情况:
# drbd-overview
0:web SyncTarget Secondary/Primary Inconsistent/UpToDate C r----
[=>..................] sync'ed: 10.0% (630552/692984)K queue_delay: 0.0 ms
15. 在节点1上格式化主设备的磁盘
# mkfs -t ext3 -L drbdweb /dev/drbd0
-L:设置卷标
16. 在节点1上新建挂载点,将/dev/drbd0挂载到上面
# mkdir /mnt/web
# mount /dev/drbd0 /mnt/web
17. 在节点1上切换至挂载点,产生网页文件index.html
# cd /mnt/web/
# echo "hello web" >index.html
18.将node1变为备份设备,node2 变为主设备,在node1上执行命令
# drbdadm secondary web
0: State change failed: (-12) Device is held open by someone 提示资源正在被某个用户使用
Command 'drbdsetup 0 secondary' terminated with exit code 11
可以先卸载,然后再执行
# umount /mnt/web/
# drbdadm secondary web
19.查看当前设备node1的状态,显示:两个节点都为备份节点
# drbd-overview
0:web Connected Secondary/Secondary UpToDate/UpToDate C r----
20.在节点2上,将当前设备设置为主设备
# drbdadm primary web
# drbd-overview 当前设备成为主设备
0:web Connected Primary/Secondary UpToDate/UpToDate C r----
21.在节点2上格式化/dev/drbd0
# mkfs -t ext3 -L drbdweb /dev/drbd0
22.节点2上创建挂载点,将/dev/drbd0 挂载上
# mkdir /mnt/web
# mount /dev/drbd0 /mnt/web 若节点2 不是主节点,将不能挂载
23.切换至挂载点, 里面可以看到在节点1上创建的网页文件index.html,说明两个磁盘同步成功
# cd /mnt/web/
[root@node2 web]# ll
-rw-r--r-- 1 root root 10 10-18 10:54 index.html
24.在以上试验中我们知道,只有手动将一个节点设置为主节点时,才可访问该节点下的内容,显然不符合智能化的要求,可以使用heartbeat工具,将drbd作为其资源,实现主节点和 备份节点的自动切换。
在两个节点上都安装nfs服务,将分区共享出来,这样客户端就可以看到这些内容
25.在两个节点上新建挂载点,挂载光盘
# mkdir /mnt/cdrom
# mount /dev/cdrom /mnt/cdrom
26.在两个节点上编辑nfs的共享清单
# vim /etc/exports
/mnt/web 192.168.1.0/24(rw,sync)
27在两个节点上导出共享清单
# exportfs -rv
28.修改nfs的启动脚本文件
# vim /etc/init.d/nfs
122 killproc nfsd -9
安装配置heartbeat
29.需要的软件包如下,并在两个节点上配置yum工具进行安装
heartbeat-2.1.4-9.el5.i386.rpm
heartbeat-devel-2.1.4-9.el5.i386.rpm
heartbeat-gui-2.1.4-9.el5.i386.rpm
heartbeat-pils-2.1.4-10.el5.i386.rpm
heartbeat-stonith-2.1.4-10.el5.i386.rpm
libnet-1.1.4-3.el5.i386.rpm
perl-MailTools-1.77-1.el5.noarch.rpm
# vim /etc/yum.repos.d/rhel-debuginfo.repo
[rhel-server]
name=Red Hat Enterprise Linux serverbaseurl=file:///mnt/cdrom/Server
enabled=1
gpgcheck=1
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
[rhel-cluster]
name=Red Hat Enterprise Linux cluster
baseurl=file:///mnt/cdrom/Cluster
enabled=1
gpgcheck=1
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
# yum localinstall heartbeat-2.1.4-9.el5.i386.rpm heartbeat-pils-2.1.4-10.el5.i386.rpm heartbeat-stonith-2.1.4-10.el5.i386.rpm libnet-1.1.4-3.el5.i386.rpm perl-MailTools-1.77-1.el5.noarch.rpm --nogpgcheck
以下在两个节点上都配置:
30.将/usr/share/doc/heartbeat-2.1.4下的文件复制到/etc/ha.d下
# cp /usr/share/doc/heartbeat-2.1.4/authkeys ha.cf haresources /etc/ha.d/
切换至/etc/ha.d/
编辑ha.cf文件,定义心跳参数
bcast eth0 # Linux 在eth0上监测心跳
node node1.a.com
node node2.a.com
31.编辑authkeys验证文件,进行节点之间的验证
# vim authkeys
auth 3
3 md5 hellp
32.手工创建文件:
#/etc/ha.d/resource.d/killnfsd
killall -9 nfsd;
/etc/init.d/nfs restart;
exit 0
修改权限
# chmod 600 authkeys (不能少)
# chmod 755 resource.d/killnfsd
33.编辑资源文件,两个节点配置一样
node1.a.com IPaddr::192.168.1.3/24/eth0 drbddisk::web Filesystem::/dev/drbd0::/mnt/web::ext3 killnfsd
34. 在两个节点上启动heartbeat服务
# service heartbeat start
35.查看是哪个节点获得了虚拟ip
节点1上:
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:37:3F:E6
inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:67 Base address:0x2024
在节点1上查看哪个是主节点,可知,当前设备为主节点
# drbd-overview
0:web Connected Primary/Secondary UpToDate/UpToDate C r---- /mnt/web ext3 950M 18M 885M 2%
36.在客户端上新建挂载点,进行挂载
#mkdir /mnt/nfs
# mount 192.168.1.3:/mnt/web /mnt/nfs/
37. #vim /mnt/nfs/test.sh
//此配置脚本文件的主要作用是为了反复的读写操作
while true
do
echo --\<;trying touch x:`date`
touch x
echo \<-----done touch x:`date`
echo
sleep 2
done
将shell文件放置到root的家目录,然后切换到挂载点下执行该脚本