Heartbeat+DRBD+NFS案例详解

DRBD简介

   Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。
     数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)   
     DBRD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。   
    DBRD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈。
实验背景:
本实验部署DRBD + HEARDBEAT + NFS 环境,建立一个高可用(HA)的文件服务器集群。在方案中,通过DRBD保证了服务器数据的完整性和一致性。DRBD类似于一个网络RAID-1功能。当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上,以相同的形式记录在一个另文件系统中。主节点与备节点的数据可以保证实时相互同步。当本地主服务器出现故障时,备份服务器上还会保留有一份相同的数据,可以继续使用。在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。因为数据同时存在于本地主服务器和备份服务器上。切换时,远程主机只要使用它上面的那份备份数据,就可以继续提供主服务器上相同的服务,并且client用户对主服务器的故障无感知。
实验拓扑:

 

实验步骤:

一、准备环境
1、系统环境
# uname –r              #内核版本
2.6.18-164.el5
# cat /etc/redhat-release  #查看系统信息
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
2、修改主机名称等
在节点1上进行修改
# hostname node1.a.com            #修改主机名称
# vim /etc/sysconfig/network           #修改文件
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node1.a.com       
之后退出再次登陆
# hostname                         #查看名称
node1.a.com
# vim /etc/hosts                    #修改hosts文件
127.0.0.1                 localhost.localdomain localhost
::1              localhost6.localdomain6 localhost6
192.168.10.20 node1.a.com
192.168.10.30 node2.a.com
在节点2上进行修改
# hostname node2.a.com              #修改主机名称
# vim /etc/sysconfig/network             #修改文件
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node2.a.com
之后退出再次登陆
# vim /etc/hosts                #修改hosts文件
127.0.0.1                 localhost.localdomain localhost
::1              localhost6.localdomain6 localhost6
192.168.10.20 node1.a.com
192.168.10.30 node2.a.com
3、同步时钟
要求两个节点上的始终必须要一致。
[root@node2 ~]# hwclock -s              #同步时钟
[root@node1 ~]# hwclock –s
4、新建分区
在节点1上新建分区
[root@node1 ~]# fdisk /dev/sda
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)
e                                      #增加一个扩展分区
Selected partition 4
First cylinder (1799-3916, default 1799):
Using default value 1799
Last cylinder or +size or +sizeM or +sizeK (1799-3916, default 3916):
Using default value 3916
Command (m for help): p         #显示分区内容
Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 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        1543    12289725   83 Linux
/dev/sda3             1544        1798     2048287+ 82 Linux swap / Solaris
/dev/sda4             1799        3916    17012835    5 Extended
Command (m for help): n
First cylinder (1799-3916, default 1799):
Using default value 1799
Last cylinder or +size or +sizeM or +sizeK (1799-3916, default 3916): +1g
Command (m for help): p
Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 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        1543    12289725   83 Linux
/dev/sda3             1544        1798     2048287+ 82 Linux swap / Solaris
/dev/sda4             1799        3916    17012835    5 Extended
/dev/sda5             1799        1921      987966   83 Linux
Command (m for help): w             #保存以上操作
重新读取sda这块盘上的分区表
[root@node1 ~]# partprobe /dev/sda
[root@node1 ~]# cat /proc/partitions
major minor #blocks name
 
   8     0   31457280 sda
   8     1     104391 sda1
   8     2   12289725 sda2
   8     3    2048287 sda3
   8     4          0 sda4
   8     5     987966 sda5
在节点2上创建一个扩展分区和一个逻辑分区
[root@node2 ~]# fdisk /dev/sda
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)
e
Selected partition 4
First cylinder (1354-2610, default 1354):
Using default value 1354
Last cylinder or +size or +sizeM or +sizeK (1354-2610, default 2610):
Using default value 2610
Command (m for help): n
First cylinder (1354-2610, default 1354):
Using default value 1354
Last cylinder or +size or +sizeM or +sizeK (1354-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        1353      522112+ 82 Linux swap / Solaris
/dev/sda4             1354        2610    10096852+   5 Extended
/dev/sda5             1354        1476      987966   83 Linux
Command (m for help): w              #保存以上操作
重新加载sda这块盘上的分区
[root@node2 ~]# partprobe /dev/sda
二、安装DRBD主程序和提供内核模块的rpm包
[root@node1 ~]# ll
-rw-r--r-- 1 root root 221868 10-18 10:14 drbd83-8.3.8-1.el5.centos.i386.rpm
-rw-r--r-- 1 root root 125974 10-18 10:14 kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
1、在node1和node2节点安装
# rpm -ivh drbd83-8.3.8-1.el5.centos.i386.rpm
# rpm -ivh kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
以下操作要求在节点node1和node2上都做。
2、修改conf配置文件
# cd /usr/share/doc/drbd83-8.3.8/
#cp drbd.conf /etc/              #复制配置文件到相关目录
#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;
        startup {
                wfc-timeout 120;
                degr-wfc-timeout 120;
         }
        disk {
                  on-io-error detach;
                  fencing resource-only;
          }
        net {
                cram-hmac-alg "sha1";
                shared-secret "mydrbdlab";
         }
        syncer {
                  rate 100M;
         }
3、修改资源文件
# cd /etc/drbd.d/
# vim web.res
1 resource web {
2         on node1.a.com {
3         device /dev/drbd0;
4         disk /dev/sda5;
5         address 192.168.10.20:7789;
6         meta-disk internal;
7         }
8         on node2.a.com {
9         device /dev/drbd0;
10         disk /dev/sda5;
11         address 192.168.10.30:7789;
12         meta-disk internal;
13        }
14 }
4、node1和node2分别进行初始化
[root@node1 drbd.d]# drbdadm    create-md web
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
[root@node2 drbd.d]# drbdadm    create-md web
5、在节点1和2上启动drbd服务
[root@node1 drbd.d]# service drbd start
[root@node2 drbd.d]# service drbd start
在节点1和节点2上全是辅助设备,都为second 状态,没有同步
[root@node1 drbd.d]# 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指令,查看设备状态
6、指明节点1为主设备
[root@node1 drbd.d]# drbdadm    -- --overwrite-data-of-peer primary web
查看同步
[root@node1 drbd.d]# 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:SyncSource ro: Primary/Secondary ds:UpToDate/Inconsistent C r----
    ns:132164 nr:0 dw:0 dr:140352 al:0 bm:8 lo:1 pe:10 ua:256 ap:0 ep:1 wo:b oos:856024
       [=>..................] sync'ed: 14.1% (856024/987896)K delay_probe: 11
       finish: 0:00:51 speed: 16,484 (16,484) K/sec
查看同步过程
[root@node1 drbd.d]#watch -n 1 'cat /proc/drbd'
7、格式化文件系统
[root@node1 drbd.d]# mkfs -t ext3 -L drbdweb /dev/drbd0
8、定义资源
 [root@node1 drbd.d]# mkdir /mnt/web
[root@node1 drbd.d]# mount /dev/drbd0 /mnt/web/
[root@node1 drbd.d]# df –h         #查看挂载情况
文件系统               容量   已用 可用 已用% 挂载点
/dev/sda2               12G 2.6G 8.3G 24% /
/dev/sda1               99M   12M   83M 12% /boot
tmpfs                  119M     0 119M   0% /dev/shm
/dev/drbd0             950M   18M 885M   2% /mnt/web
[root@node1 drbd.d]# cd /mnt/web/  #创建资源
[root@node1 web]# cp /etc/passwd ./
[root@node1 web]# cp /etc/inittab ./
#drbdadm create-md web
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
9、把node1变成辅助设备,node2变成主设备
节点1变成辅助设备
[root@node1 ~]# umount /mnt/web/
[root@node1 ~]# df -h
文件系统               容量   已用 可用 已用% 挂载点
/dev/sda2               12G 2.6G 8.3G 24% /
/dev/sda1               99M   12M   83M 12% /boot
tmpfs                  119M     0 119M  0% /dev/shm
[root@node1 ~]# drbdadm secondary web
[root@node1 ~]# drbdadm    role web
Secondary/Secondary
节点2变成主设备
[root@node2 ~]# mkdir /mnt/web
[root@node2 ~]# mount /dev/drbd0 /mnt/web/
[root@node2 ~]# df -h
[root@node2 ~]# drbdadm    primary web
[root@node2 ~]# mount /dev/drbd0 /mnt/web/
[root@node2 ~]# cd /mnt/web/
[root@node2 web]# ll
总计 24
-rw-r--r-- 1 root root 1666 10-18 11:20 inittab
drwx------ 2 root root 16384 10-18 11:17 lost+found
-rw-r--r-- 1 root root 1649 10-18 11:20 passwd
[root@node2 web]# touch aa.txt
10、转换主辅设备
把node2变为辅助
[root@node2 ~]# umount /mnt/web/
[root@node2 ~]# drbdadm secondary web
Node1变为主设备
[root@node1 ~]# drbdadm    primary web
[root@node1 ~]# drbdadm    role web
Primary/Secondary
[root@node1 web]# mount /dev/drbd0 /mnt/web/
[root@node1 web]# cd /mnt/web/
[root@node1 web]# ll
总计 24
-rw-r--r-- 1 root root      0 10-18 11:29 aa.txt   #我们看到了在node2节点创建的aa.txt文件
-rw-r--r-- 1 root root 1666 10-18 11:20 inittab
drwx------ 2 root root 16384 10-18 11:17 lost+found
-rw-r--r-- 1 root root 1649 10-18 11:20 passwd
三、NFS配置
#两台服务器的nfs配置必须要一致
在节点2上的操作 
1、修改相关文件
[root@node2 ~]# vim /etc/exports  
/mnt/web *(rw,sync,insecure,no_root_squash,no_wdelay)
2、执行相关操作。
[root@node2 ~]#service portmap start && chkconfig portmap on
[root@node2 ~]#service nfs start && chkconfig nfs on
3、修改nfs启动脚本
[root@node2 ~]# vim /etc/init.d/nfs
122          killproc nfsd –9
4、在节点1上作上述相同的操作
[root@node2 ~]# scp /etc/exports node1.a.com:/etc/
[root@node2 ~]# scp /etc/init.d/nfs node1.a.com:/etc/init.d/
5、在节点1和节点2上启动 portmap:
[root@node1 ~]# service portmap start
[root@node1 ~]# chkconfig portmap on
[root@node2 ~]# service portmap start
[root@node2 ~]# chkconfig portmap on
四、Heartbeat配置
Heartbeat的配置要求两个节点的配置一致
在node1和node2上进行如下操作
1、挂载光盘,安装软件包
[root@node2 ~]# mkdir /mnt/cdrom
[root@node2 ~]# mount /dev/cdrom /mnt/cdrom
[root@node2 ~]# yum localinstall -y 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
2、复制模版文件
[root@node1 ~]# cd /usr/share/doc/heartbeat-2.1.4/
[root@node1 heartbeat-2.1.4]#cp authkeys ha.cf haresources /etc/ha.d/
3、修改相关的配置信息
[root@node1 ~]# cd /etc/ha.d/           #切换到相关目录
[root@node1 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
77 bcast eth0                    #此行可以添加在任意一行
158 auto_failback off
212 node     node1.a.com
213 node     node2.a.com
4、修改资源文件
[root@node1 ha.d]# vim /etc/ha.d/haresources      #加入下列内容
node1.a.com IPaddr::192.168.10.1/24/eth0 drbddisk::web Filesystem::/dev/drbd0::/mnt/web::ext3 killnfsd
#修改node2资源文件的时候节点名称为node2.a.com
5、修改key文件
[root@node1 ha.d]# # vim authkeys        #去掉23和24行的注释
23 auth 1
24 1 crc
6、手工创建文件
[root@node1 ~]# vim /etc/ha.d/resource.d/killnfsd #加入下列内容
killall -9 nfsd ; /etc/init.d/nfs restart ; exit 0
7、修改配置文件的权限
[root@node1 ~]# chmod 600 /etc/ha.d/authkeys
[root@node1 ~]# chmod 755 /etc/ha.d/resource.d/killnfsd
8、启动服务
[root@node1 ~]# service heartbeat start
五、测试
1、服务器进行测试,
1、启动heartbeat服务节点2为主设备
[root@node2 ha.d]# drbd-overview
 0:web Connected Primary/Secondary UpToDate/UpToDate C r---- /mnt/web ext3 950M 18M 885M 2%
在节点2上可以看到vip地址

2、把节点1变为主设备

[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:4 nr:0 dw:4 dr:17 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

2、客户端测试
1、挂载
[root@localhost ~] #mkdir /mnt/nfs
[root@localhost ~]# mount 192.168.10.1:/mnt/web /mnt/nfs
查看挂载
[root@localhost ~]# df -h
文件系统               容量   已用 可用 已用% 挂载点
/dev/sda2               12G 2.6G 8.3G 24% /
/dev/sda1               99M   12M   83M 12% /boot
tmpfs                  119M     0 119M   0% /dev/shm
/dev/hdc               2.8G 2.8G     0 100% /mnt/cdrom
192.168.10.1:/mnt/web
                      950M   18M 885M   2% /mnt/nfs
2、创建测试脚本文件
[root@localhost ~]#vim /mnt/test.sh  #此配置脚本文件的主要作用是为了反复的读写操作
while true
do
echo ---\> trying touch x:`date`
 touch x
echo \<-----done touch x:`date`
 echo
sleep 1
done
3.执行测试文件
[root@localhost ~]# cd /mnt/nfs/
[root@localhost nfs]# ll
总计 24
-rw-r--r-- 1 root root      0 2012-10-18 aa.txt
-rw-r--r-- 1 root root 1666 2012-10-18 inittab
drwx------ 2 root root 16384 2012-10-18 lost+found
-rw-r--r-- 1 root root 1649 2012-10-18 passwd
[root@localhost ~]# bash /mnt/test.sh
让客户端一直执行脚本文件,到服务器节点node1上关闭heartbeat服务,之后在客户端会发现丢弃现象,之后文件系统又恢复正常。
- ---> trying touch x:2012年 07月 25日 星期三 05:29:37 CST
<-----done touch x:2012年 07月 25日 星期三 05:29:37 CST
 
---> trying touch x:2012年 07月 25日 星期三 05:29:38 CST
<-----done touch x:2012年 07月 25日 星期三 05:29:38 CST
 
---> trying touch x:2012年 07月 25日 星期三 05:29:39 CST
touch:无法触碰 ‘’x” : Stale NFS file handle
<-----done touch x:2012年 07月 25日 星期三 05:29:39 CST
 
---> trying touch x:2012年 07月 25日 星期三 05:29:40 CST
<-----done touch x:2012年 07月 25日 星期三 05:29:40 CST
 

你可能感兴趣的:(heartbeat,nfs,drbd,群集)