preface
NFS作為業界常用的共享存儲方案,被眾多公司采用。我司也不列外,使用NFS作為共享存儲,為前端WEB server提供服務,主要存儲網頁代碼以及其他文件。
高可用方案
說道NFS,不得不說它的同步技術,同步技術有兩種,
- 第一種就是借助RSYNC+inotify來實現主從同步數據。
- 第二種借助DRBD,實現文件同步。
上訴兩種方案都沒有實現高可用,只是實現了兩者數據同步。但是業務要求NFS服務器必須是高可用,所以我們在第二種同步方案的基礎上,在結合heartbeat來實現高可用。
具體架構如下:

動手搭建
我們看看我們的服務器信息:
| IP | 角色 |
|---|---|
| 192.168.1.4 | NFS-Client(App-Server) |
| 192.168.1.7 | NFS-Master |
| 192.168.1.8 | NFS-Backup |
- 以上系統版本都是CentOs6.6
- heartbeat的VIP為192.168.1.100
- 我們實驗室環境采用都是單張網卡,所以heartbeat監聽eth0
基礎工作要到位
- 確保所有服務器時間同步。
- 確保所有服務器的防火牆,Selinux關閉了。
- 且主機名配置到位,能夠根據主機名知道服務器角色。
- 確保所有服務器hosts里面能夠解析任意一台服務器的hostname。
上面所有的基礎工作我就不記錄命令了,非常簡單。
搭建DRBD
drbd的原理不贅述了,可以參考我的另一篇博文:http://www.cnblogs.com/liaojiafa/p/6118425.html 。這里我們采用C協議(backup端網絡接收到后寫入磁盤再返回OK狀態給Master)。
開始動手配置它吧。
在nfs主備服務器都敲下面的命令
安裝DRBD
[root@nfsmaster ~]# yum -y update kernel kernel-devel
[root@nfsmaster ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
[root@nfsmaster ~]# yum -y install drbd84-utils kmod-drbd84
格式化磁盤
主備都安裝drbd以后,我們就開始格式化磁盤。這里我把/dev/sdb直接分成主分區,大小為20G,在這基礎之上,做了LVM卷,划分大小為10G。主備同時操作:
[root@nfsmaster ~]# fdisk /dev/sdb
[root@nfsmaster ~]# pvcreate /dev/sdb1
[root@nfsmaster ~]# vgcreate nfsdisk /dev/sdb1
[root@nfsmaster ~]# lvcreate -L 10G -n nfsvolume nfsdisk
[root@nfsmaster ~]# lvdisplay # 剛才創建LVM卷的信息
--- Logical volume ---
LV Path /dev/nfsdisk/nfsvolume
LV Name nfsvolume
VG Name nfsdisk
LV UUID ub6vWZ-kX6r-zNdz-mzRy-7z1w-QsKb-ke8QBO
LV Write Access read/write
LV Creation host, time nfsmaster, 2016-12-03 16:06:41 +0800
LV Status available
# open 0
LV Size 10.00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
配置完成后,把master的drbd相關配置文件直接copy到backup上面就行了,我使用的是SCP。
啟動drbd
磁盤創建成功后,開始啟動drbd了:·
[root@nfsbackup ~]# drbdadm create-md r0
[root@nfsmaster ~]# service drbd start
[root@nfsmaster ~]# drbdadm primary r0 # 到這里報錯了,一看DRBD狀態,兩者不同步的狀態,所以無法切換到primary。
[root@nfsmaster ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
m:res cs ro ds p mounted fstype
0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C # inconsisten是兩者數據不同步狀態。
[root@nfsmaster ~]# drbdadm -- --overwrite-data-of-peer primary all #不同步的話,我們在master節點執行這條命令。意思是讓備的數據和主的一致。
[root@nfsmaster ~]# drbd-overview # 此時能夠看到同步狀態了
0:r0/0 SyncSource Primary/Secondary UpToDate/Inconsistent
[================>...] sync'ed: 86.3% (1408/10236)M
[root@nfsmaster ~]# drbd-overview # 這個時候的狀態表示同步成功。
0:r0/0 Connected Primary/Secondary UpToDate/UpToDate
[root@nfsmaster ~]# mkfs.ext4 /dev/drbd0 #格式化磁盤,待會准備使用
搭建heartbeat了
安裝heartbeat
采用yum安裝,
[root@nfsmaster ~]# rpm -vih http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@nfsmaster ~]# yum -y install heartbeat heartbeat-devel heartbeat-stonith heartbeat-pils
配置heartbeat
[root@nfsmaster ~]# cp /usr/share/doc/heartbeat-3.0.4/ha.cf /etc/ha.d/
[root@nfsmaster ~]# cp /usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/
[root@nfsmaster ~]# cp /usr/share/doc/heartbeat-3.0.4/authkeys /etc/ha.d/
[root@nfsmaster ~]# chmod 600 /etc/ha.d/authkeys #必須是600權限
[root@nfsmaster ~]# grep -v ^# /etc/ha.d/haresources
nfsmaster IPaddr::192.168.1.100/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/nfs::ext4 #drbddisk后面的r0是資源名,drbd配置文件定義的。
[root@nfsmaster ~]# grep -v ^# /etc/ha.d/ha.cf #主配置文件
logfile /var/log/ha-log #指定heartbeat日志文件的位置
keepalive 1 # 心跳發送時間間隔
deadtime 5 # 備用節點5s內沒有檢測到master機的心跳,確認對方故障
warntime 2 # 警告2次
initdead 10 # 守護進程啟動30s后,啟動服務資源。
ucast eth0 192.168.1.8 # 另一台主機節點eth0的地址,注意是另一台。
auto_failback off # 當primary節點切換到secondary節點之后,primary節點恢復正常,不進行切回操作,因為切換一次mysql master成本很高。
node nfsmaster # 定義兩個節點的主機名,一行寫一個。
node nfsbackup
respawn hacluster /usr/lib64/heartbeat/ipfail #開啟dopd功能
respawn hacluster /usr/lib64/heartbeat/dopd
apiauth ipfail gid=haclient uid=hacluster
apiauth dopd gid=haclient uid=hacluster
[root@nfsmaster ~]# grep -v ^# /etc/ha.d/authkeys #認證文件
auth 1
1 sha1 HA_DB
[root@nfsmaster ~]# vim /etc/ha.d/resource.d/drbddisk
69 $DRBDADM --force primary $RES && break # 更改第69行,添加--force。
配置完成后,把配置文件copy到backup上面即可。不過需要改動的是/etc/ha.d/ha.cf下面的ucast參數,還有/etc/ha.d/haresources下面的nfsmaster,改成nfsbackup,與主機名一致。
啟動heartbeat
[root@nfsmaster ~]# service heartbeat start
[root@nfsmaster ~]# ip a|grep 'inet '
inet 127.0.0.1/8 scope host lo
inet 192.168.1.7/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.100/24 brd 192.168.1.255 scope global secondary eth0 # VIP已經在了,啟動成功
設置開機自啟動
[root@nfsmaster ~]# chkconfig heartbeat on
[root@nfsmaster ~]# chkconfig drbd on
測試drbd+heartbeat是否正常工作。
- 把master服務器拔掉往下或者直接拔電源,模擬宕機狀態,看VIP是否會切換到backup上,如果能夠切換,說明成功。drbd狀態為primary/unknow
- 當master啟動后以后,Master不會搶占backup的VIP以及drbd資源。。drbd狀態為primary/Secondary
下面開始說說NFS結合drbd+heartbeat做高可用吧。
