参考1:http://os.51cto.com/art/201412/461533.htm

参考2:http://732233048.blog.51cto.com/9323668/1669417

参考3:http://network.51cto.com/art/201010/230237_all.htm

网络拓扑:


DRBD+HEARTBEAT+NFS高可用架构笔记_hearbeat drbd nfs

简要说明:

两台 NFS 服务器,通过 eth0 网卡与内网的其他业务服务器进行通信,eth1网卡主要负责两台 NFS 服务器之间心跳通信,eth2网卡主要负责drbd数据同步的传输。

NFS 集群提供出来的一个VIP 192.168.1.160 来对外提供服务。

二、基础服务配置

1、配置时间同步

NFS1端:

[root@M1 ~]# ntpdate pool.ntp.org

NFS2端:

[root@M2 ~]# ntpdate pool.ntp.org

2、增加主机间路由 (选做)

首先先验证 M1 和 M2 的服务器 IP 是否合乎规划

   M1端:

[root@M1 ~]# ifconfig|egrep 'Link encap|inet addr'
[root@M2 ~]# ifconfig|egrep 'Link encap|inet addr'   
查看现有路由,然后增加相应的心跳线和drbd数据传输线路的端到端的静态路由条目。
目的是为了让心跳检测和数据同步不受干扰。

M1端:

route add -host 172.16.0.3 dev eth1
route add -host 172.16.100.3 dev eth2
echo 'route add -host 172.16.0.3 dev eth1' >> /etc/rc.local
echo 'route add -host 172.16.100.3 dev eth2' >> /etc/rc.local
traceroute 172.16.100.3

M2端:

和1 类似

三、部署 heartbeat 服务

此处仅演示 NFS1 服务端的安装,2 的不做复述。 

1、安装heartbeat软件

[root@M1 ~]# cd /etc/yum.repos.d/    
[root@M1 yum.repos.d]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo   
[root@M1 yum.repos.d]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm   
[root@M1 yum.repos.d]# sed -i 's@#baseurl@baseurl@g' *   (待研究,不做可以)
[root@M1 yum.repos.d]# sed -i 's@mirrorlist@#mirrorlist@g' *   (待研究,不做可以)
[root@M1 yum.repos.d]# yum install heartbeat -y     # 该命令有时可能需要执行2次

2、配置heartbeat服务

[root@M1  yum.repos.d]# cd /usr/share/doc/heartbeat-3.0.4/    
[root@M1 heartbeat-3.0.4]# ll |egrep 'ha.cf|authkeys|haresources' 
[root@M1 heartbeat-3.0.4]# cp ha.cf authkeys haresources /etc/ha.d/    
[root@M1 heartbeat-3.0.4]# cd /etc/ha.d/  
chmod 600 authkeys 
[root@M1 ha.d]# ls    authkeys ha.cf harc haresources rc.d README.config resource.d shellfuncs

注意:主备节点两端的配置文件(ha.cf,authkeys,haresource)完全相同,下面是各个节点的文件内容

针对heartbeat的配置,主要就是修改ha.cf、authkeys、haresources这三个文件,下面我列出这三个文件的配置信息,大家仅作参考!

ha.cf

debugfile /var/log/ha-debug
logfile    /var/log/ha-log
logfacility    local0
keepalive 2
deadtime 10
warntime 6
udpport    694
ucast eth0 192.168.1.168 
auto_failback on
node    fuzai01
node    fuzai02
ping 192.168.1.199
respawn hacluster /usr/lib64/heartbeat/ipfail

authkeys

auth 1
1 crc

haresources

fuzai01 IPaddr::192.168.1.160/24/eth0

注意:这个里的nfsd并不是heartbeat自带的,需要自己编写。

针对该脚本的编写需要满足一下需求:

1、有可执行权限

2、必须存放在/etc/ha.d/resource.d或/etc/init.d目录下

3、必须有start、stop这两个功能

具体脚本信息,下文会写。

4、启动heartbeat

[root@M1 ha.d]# /etc/init.d/heartbeat start
 Starting High-Availability services: INFO: Resource is stopped    Done.   
 [root@M1 ha.d]# chkconfig heartbeat off

说明:关闭开机自启动。当服务重启时,需要人工去启动。

5、测试heartbeat

在此步测试之前,请先在 NFS2 上操作如上步骤!

a、正常状态

[root@M1 ha.d]# ip a|grep eth0        
  
[root@M2 ha.d]# ip a|grep eth0

说明:M1主节点拥有vip地址,M2节点没有。

b、模拟主节点宕机后的状态

[root@M1 ha.d]# /etc/init.d/heartbeat stop    
Stopping High-Availability services: Done.    
[root@M2 ha.d]# ip a|grep eth0    说明:M1宕机后,VIP地址漂移到M2节点上,M2节点成为主节点

c、模拟主节点故障恢复后的状态

[root@M1 ha.d]# /etc/init.d/heartbeat start    
Starting High-Availability services: INFO: Resource is stopped    Done.    
[root@M1 ha.d]# ip a|grep em1    
说明:M1节点恢复之后,又抢占回了VIP资源

四、DRBD安装部署

1、新添加(初始)硬盘

# fdisk /dev/sdb

----------------

n-p-1-1-"+1G"-w

----------------

# mkdir /data

方法2:创建逻辑卷(LV)的顺序:Linux分区---物理卷(PV)---卷组(VG)---逻辑卷(LV)---挂载到文件系统
 删除逻辑卷(LV)的顺序:卸载文件系统----逻辑卷(LV)---卷组(VG)----物理卷(PV)---Linux分区


2、安装drbd

针对drbd的安装,我们不仅可以使用yum的方式,还可以使用编译安装的方式。由于我在操作的时候,无法从当前yum源取得drbd的rpm包,因此我就采用了编译的安装方式。

[root@M1 ~]# yum -y install gcc gcc-c++ kernel-devel kernel-headers flex make   
[root@M1 ~]# cd /usr/local/src   
[root@M1 src]# wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz    
[root@M1 src]# tar zxf drbd-8.4.3.tar.gz    
[root@M1 src]# cd drbd-8.4.3    
[root@M1 ha.d]# ./configure --prefix=/usr/local/drbd --with-km --with-heartbeat    
[root@M1 ha.d]# make KDIR=/usr/src/kernels/补齐/   
[root@M1 ha.d]# make install   
[root@M1 ha.d]# mkdir -p /usr/local/drbd/var/run/drbd    
[root@M1 ha.d]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/    
[root@M1 ha.d]# chmod +x /etc/init.d/drbd    
[root@M1 ha.d]# modprobe drbd      # 执行命令加载drbd模块到内核   
[root@M1 ha.d]# lsmod|grep drbd     # 检查drbd是否被正确的加载到内核   
drbd 310236 3    libcrc32c 1246 1 drbd 

通过yum安装DRBD(推荐):(dbm135,dbm134)1234   
 [root@scj ~]# cd /usr/local/src/
 [root@scj src]# wget 
 [root@scj src]# rpm -ivh elrepo-release-6-6.el6.elrepo.noarch.rpm
 [root@scj src]# yum -y install  kmod-drbd84      #时间可能会比较长 
[root@scj ~]# modprobe drbd       #加载drbd模块FATAL: Module drbd not found.    
    解决加载drbd模块失败:
        因为在执行yum -y install drbd83-utils kmod-drbd83时,
        对内核kernel进行了update,要重新启动服务器,更新后的内核才会生效

3、配置DRBD

有关DRBD涉及到的配置文件主要是global_common.conf和用户自定义的资源文件(当然,该资源文件可以写到global_common.conf中)。

注意:M1和M2这两个主备节点的以下配置文件完全一样

global {   
        usage-count no;    
}    
common {    
        protocol C;    
        disk {    
                no-disk-flushes;    
                no-md-flushes;    
        }    
        net {    
                sndbuf-size 512k;   
                max-buffers 8000;   
                unplug-watermark 1024;   
                max-epoch-size 8000;   
                after-sb-0pri disconnect;   
                after-sb-1pri disconnect;   
                after-sb-2pri disconnect;   
                rr-conflict disconnect;   
        }    
        syncer {    
                al-extents 517;   
        }   
}
vi /usr/local/drbd/etc/drbd.d/drbd.res
resource drbd {            
        on fuzai01 {                 
                device /dev/drbd0;            
                disk disk /dev/sdb1;
                address 172.16.100.2:7789; 
                meta-disk internal; 
        }    
        on fuzai02 {    
                device /dev/drbd0;    
                disk disk /dev/sdb1;
                address 172.16.100.3:7789;    
                meta-disk internal;    
        }    
}


4、初始化meta分区

[root@M1 drbd]# drbdadm create-md drbd    
Writing meta data...    initializing activity log    
NOT initializing bitmap    
New drbd meta data block successfully created.

5、启动drbd服务

此处,我们可以看下M1 和M2 启动drbd服务前后,drbd设备发生的变化

M1端:

[root@M1 drbd]# cat /proc/drbd       # 启动前 drbd 设备信息   
version: 8.4.3 (api:1/proto:86-101)    
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@M1.redhat.sx, 
2014-11-11 16:20:26    
[root@M1 drbd]# drbdadm up all      # 启动drbd,这里也可以使用脚本去启动   
[root@M1 drbd]# cat /proc/drbd        # 启动后 drbd 设备信息   
version: 8.4.3 (api:1/proto:86-101)    GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 
build by root@M1.redhat.sx, 2014-11-11 16:20:26    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:d oos:133615596

M2端:

[root@M2 ~]# cat /proc/drbd

M1端:

[root@M1 drbd]# drbdadm -- --overwrite-data-of-peer primary drbd    
[root@M1 drbd]# cat /proc/drbd    version: 8.4.3 (api:1/proto:86-101)    
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@M1.redhat.sx, 
2014-11-11 16:20:26    0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C 
r---n-    ns:140132 nr:0 dw:0 dr:144024 al:0 bm:8 lo:0 pe:17 ua:26 ap:0 
ep:1 wo:d oos:133477612    [>....................] sync'ed: 0.2% (130348/130480)M  
  finish: 0:16:07 speed: 137,984 (137,984) K/sec

M2端:

[root@M2 ~]# cat /proc/drbd

M1端:

[root@M1 ~]# cat /proc/drbd
[root@M1 drbd]# mkfs.ext4 /dev/drbd0

M1端:

[root@M1 drbd]# dd if=/dev/zero of=/data/test bs=1G count=1   
 1+0 records in   1+0 records out    
 1073741824 bytes (1.1 GB) copied, 1.26333 s, 850 MB/s   
 [root@M1 drbd]# cat /proc/drbd    
 [root@M1 drbd]# umount /data/   
 [root@M1 drbd]# drbdadm down drbd    # 关闭名字为drbd的资源

M2端:

[root@M2 ~]# cat /proc/drbd    # 主节点关闭资源之后,查看备节点的信息,
可以看到主节点的角色已经变为UnKnown

方法2:yum安装drbd http://www.linuxidc.com/Linux/2013-08/89035p2.htm
wget http://download.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

五、NFS安装部署

该操作依旧仅以NFS1为例,2操作亦如此。

1、安装nfs

[root@M1 drbd]# yum install nfs-utils rpcbind -y   
[root@M2 ~]# yum install nfs-utils rpcbind -y

2、配置 nfs 共享目录

[root@M1 drbd]# cat /etc/exports    
/data 192.168.1.0/24(rw,sync,no_root_squash,anonuid=0,anongid=0)   
[root@M2 ~]# cat /etc/exports    
/data 192.168.1.0/24(rw,sync,no_root_squash,anonuid=0,anongid=0)

3、启动 rpcbind 和 nfs 服务

[root@M1 drbd]# /etc/init.d/rpcbind start;chkconfig rpcbind off    
[root@M1 drbd]# /etc/init.d/nfs start;chkconfig nfs off       
[root@M2 drbd]# /etc/init.d/nfs start;chkconfig nfs off

4、测试 nfs

[root@C1 ~] # mount -t nfs -o noatime,nodiratime 192.168.1.160:/data /xxxxx/    
[root@C1 ~] # df -h|grep data    
lost+found test   
[root@C1 data] # echo 'nolinux' >> nihao   
[root@C1 data] # ls    
lost+found nihao test  
[root@C1 data] # cat nihao    
nolinux

六、整合Heartbeat、DRBD和NFS服务

测试一:远端服务器是否可以成功挂载

        nfs服务端,dbm135,Primary:

1
2
3
4
5
6
7
8
9
10
[root@dbm135 ~]# cd /data/
[root@dbm135 data]# ll
total 16
-rw-r--r-- 1 root root     0 Jun 30 10:15 file1
-rw-r--r-- 1 root root     0 Jun 30 10:15 file2
-rw-r--r-- 1 root root     0 Jun 30 10:15 file3
-rw-r--r-- 1 root root     0 Jun 30 10:15 file4
-rw-r--r-- 1 root root     0 Jun 30 10:15 file5
-rw-r--r-- 1 root root     0 Jun 30 18:01 file6
drwx------ 2 root root 16384 Jun 30 10:14 lost+found

        在另外一台主机192.168.186.131上挂载nfs服务器共享出来的目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@scj131 ~]# showmount -e 192.168.186.150         #150是虚拟ip
Export list for 192.168.186.150:
/data 192.168.186.0/255.255.255.0
[root@scj131 ~]# mount 192.168.186.150:/data /data
[root@scj131 ~]# cd /data/
[root@scj131 data]# ll
total 16
-rw-r--r-- 1 root root     0 Jun 30  2015 file1
-rw-r--r-- 1 root root     0 Jun 30  2015 file2
-rw-r--r-- 1 root root     0 Jun 30  2015 file3
-rw-r--r-- 1 root root     0 Jun 30  2015 file4
-rw-r--r-- 1 root root     0 Jun 30  2015 file5
-rw-r--r-- 1 root root     0 Jun 30  2015 file6
drwx------ 2 root root 16384 Jun 30  2015 lost+found
##挂载成功


    测试二:主节点DRBD服务重启

        在主节点把DRBD服务重启,看Secondary节点的变化,192.168.186.131挂载是否仍正常


    测试三:主节点DRBD服务stop掉 (先停heartbeat服务)

        在主节点把DRBD服务stop,看Secondary节点的变化,192.168.186.131挂载是否仍正常


    测试四:主节点nfs服务stop掉

        在主节点把nfs服务stop,看Secondary节点的变化,192.168.186.131挂载是否仍正常

1
##把主节点的nfs服务stop掉后,Secondary节点没有任何变换,且192.168.186.131不能正常挂载了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
##解决方法:
[root@dbm135 ~]#vi /opt/monitor/nfs/monitornfs.sh
#!/bin/bash
#监控nfs服务的运行情况
 
while true
do
    drbdstatus=`cat /proc/drbd 2> /dev/null  grep ro | tail -n1 | awk -F':' '{print $4}' awk -F'/' '{print $1}'`   #判断drbd的状态
    nfsstatus=`/etc/init.d/nfs status | grep -c running`    #判断nfs是否运行
 
    if [ -z  $drbdstatus ];then
        sleep 10
        continue
    elif [ $drbdstatus == 'Primary' ];then     #若drbd是Primary状态
        if [ $nfsstatus -eq 0 ];then           #若nfs未运行
            /etc/init.d/nfs start &> /dev/null   #启动nfs服务
            /etc/init.d/nfs start &> /dev/null
            newnfsstatus=`/etc/init.d/nfs status | grep -c running`     #再次判断nfs是否成功启动
            if [ $newnfsstatus -eq 0 ];then         #若nfs未运行,也就是无法启动
                /etc/init.d/heartbeat  stop &> /dev/null        #将heartbeat服务stop掉,目的是自动切换到另一台备用机
                /etc/init.d/heartbeat  stop &> /dev/null
            fi
        fi
    fi
    sleep 5
done
 
 
##注意:不要将此监控脚本放到/data/目录下,挂载drbd设备时,会把此脚本覆盖掉
 
[root@dbm135 ~]# chmod  u+x /opt/monitor/nfs/monitornfs.sh
[root@dbm135 ~]#nohup bash /opt/monitor/nfs/monitornfs.sh &     #放在后台运行
##别忘了设置开机自动启动


    测试五:主节点HeartBeat服务stop掉或重启

        在主节点把HeartBeat服务stop或重启,看Secondary节点的变化,192.168.186.131挂载是否仍正常

1
2
3
4
##可以通过如下命令,查看Secondary节点的变化
[root@dbm134 ~]# cat /proc/drbd       #查看节点是否由Secondary切换为Primary
[root@dbm134 ~]# df -h                #查看drbd设备是否成功挂载
[root@dbm134 ~]# ps -ef | grep nfs    #查看nfs服务是否启动或重启(进程号发生变化)
1
##测试后,发现主备节点切换正常,客户端挂载正常


    测试六:把主节点服务器关机或重启

        把主节点服务器关机或重启,看Secondary节点的变化,192.168.186.131挂载是否仍正常;等主节点重新启动后,看Secondary节点(新主节点)的变化

1
2
##主节点关机后主备节点切换正常,客户端挂载正常
##主节点恢复正常后,主备节点不会再去切换,由Secondary节点(新主节点)继续对外提供服务

恢复主节点步骤:1.从节点停heartbeat 2 主节点启动heartbeat


    测试七:模拟脑裂

        把主节点的eth0关掉(ifdown eth0),再把eth0启动(ifup eth0),此时两个节点都变成了StandAlone状态

1
2
3
4
5
6
7
8
9
10
11
##解决脑裂的方法
##备用节点:
[root@dbm134 ~]# drbdadm secondary r0
[root@dbm134 ~]# drbdadm disconnect all
[root@dbm134 ~]# drbdadm -- --discard-my-data connect r0 
 
##主节点:
[root@dbm135 ~]# drbdadm disconnect all
[root@dbm135 ~]# drbdadm connect r0
[root@dbm135 ~]# drbdsetup /dev/drbd0 primary
[root@dbm135 ~]# mount /dev/drbd0 /data/

       注意:在解决脑裂时,把上面所有步骤都操作完后,有时候客户端会挂载正常,有时候则挂载不正常;若不正常,可以尝试把主节点的heartbeat服务重启一下