参考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
网络拓扑:
简要说明:
两台 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服务重启一下