clip_p_w_picpath002

DRBD(Distribute Replicated Block Device) :分布式复制块设备 在高可用性网络中,实现多个节点之间的存储一致性,当一个节点的磁盘内容变化后,自动将数据同步到其他节点上。镜像设备可以是硬盘、分区或逻辑卷

只有主设备才能对自己的磁盘读取、写入、挂载,从设备必须变为主设备才能操作磁盘

主备模式:同一时刻只有一台设备工作。此时文件系统可以使用本地文件系统:ext2 ext3 xfs等

主主模式:同一时刻可以有两个节点同时工作,所以要锁机制和推送功能,因此要用到群集文件系统:gfs 或ocfs

两节点之间的协议:

protocol A:异步的传输

protocol B:同步到内存

protocol C:同步到对方的磁盘上

案例一:

p_w_picpath

节点一的环境:

内核版本: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 mockbuild@builder10.centos.org, 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%

clip_p_w_picpath004

36.在客户端上新建挂载点,进行挂载

#mkdir /mnt/nfs

# mount 192.168.1.3:/mnt/web /mnt/nfs/

clip_p_w_picpath005

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的家目录,然后切换到挂载点下执行该脚本

clip_p_w_picpath007