preface
我們緊接着上一篇博文的基礎(drbd+heartbeat的正常工作,http://www.cnblogs.com/liaojiafa/p/6129499.html)來搭建NFS的服務。
NFS主備服務器都安裝NFS
安裝NFS
我這里使用的CentOs6.6默認是安裝了NFS的,如果你的沒有安裝,請使用下面的yum命令安裝:
[root@nfsmaster ~]# yum -y install nfs-utils nfs-utils-lib nfs4-acl-tools
[root@nfsmaster ~]# rpm -qa nfs*
nfs-utils-lib-1.1.5-11.el6.x86_64
nfs-utils-1.2.3-70.el6_8.2.x86_64
nfs4-acl-tools-0.3.3-8.el6.x86_64
啟動NFS並配置它
[root@nfsmaster ~]# service rpcbind restart
[root@nfsmaster ~]# service nfs start
[root@nfsmaster nfs]# cat /etc/exports
/nfs 192.168.1.0/255.255.255.0(rw,sync,no_root_squash)
# 共享哪個目錄 ,允許哪些client連接,具有什么屬性對這個目錄。
[root@nfsmaster ~]# showmount -e 192.168.1.100 # 查看是否有共享目錄
Export list for 192.168.1.7:
/nfs 192.168.1.*
NFS的exports配置文件需要copy到backup 服務器上。
客戶端掛載它
客戶端需要安裝nfs庫,不然會提示下面這樣的報錯:
[root@nfsclient ~]# mount -t nfs 192.168.1.7:/nfs /database/
mount: wrong fs type, bad option, bad superblock on 192.168.1.7:/nfs,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount.<type> helper program)
In some cases useful info is found in syslog - try
dmesg | tail or so
出現上面的報錯后,安裝nfs-utils
[root@nfsclient ~]# yum -y install nfs-utils
安裝完之后掛載nfs,使用vip
[root@nfsclient ~]# showmount -e 192.168.1.100
clnt_create: RPC: Program not registered #出現這個錯誤的話,去nfs服務器上確認是否NFS服務正常啟動,重啟下即可
[root@nfsclient ~]# showmount -e 192.168.1.100
Export list for 192.168.1.100:
/nfs 192.168.1.0/255.255.255.0
[root@localhost ~]# mount -t nfs 192.168.1.100:/nfs /database/
[root@localhost ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 ext4 28G 2.9G 24G 11% /
tmpfs tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 ext4 283M 28M 240M 11% /boot
192.168.1.100:/nfs nfs 9.8G 23M 9.2G 1% /database
# 掛載成功。
模擬Nfs-server故障
我們把NFSmaster關機,此時客戶端不管是df ,還是進入到/database下面,都是卡死的。解決辦法是在/etc/mtab里面刪除最后一行:
[root@nfsclient ~]# cat /etc/mtab
/dev/sda2 / ext4 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs rw 0 0
/dev/sda1 /boot ext4 rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
vmware-vmblock /var/run/vmblock-fuse fuse.vmware-vmblock rw,nosuid,nodev,default_permissions,allow_other 0 0
nfsd /proc/fs/nfsd nfsd rw 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
192.168.1.100:/nfs /database nfs rw,addr=192.168.1.100 0 0 #刪除這一行即可。
由此可見,這個heartbeat雖然會讓VIP進行漂移,但是呢nfs客戶端依然是不可用的。所以我們需要采用另外一種方法來來export共享目錄。
刪除export里面的內容,使用命令exporfs申明要共享的目錄
我們刪除/etc/exports里面的內容,然后通過exportfs來申明要共享的目錄。
[root@nfsmaster ~]# > /etc/exports
[root@nfsmaster ~]# exportfs -o rw,sync,all_squash,mp,fsid=2 192.168.1.0/24:/nfs/
上面這種exportfs的方法同樣可以申明共享目錄,nfsclient也同樣正常使用。
高可用方案
經過dbrd+heartbeat+NFS的搭建,以及exportfs的簡單使用,下面我們就開始做高可用了。
說道高可用,不得不說exportfs這個命令,如果我們使用exportfs這個命令來申明需要共享目錄的話,那么我們就不需要到/etc/exports里面再次添加這個要申明的目錄了。
對於NFS高可用,我們需要使用exportfs來關閉共享的目錄和打開共享的目錄,這樣做的好處就需要修改/etc/exports文件了,大大提高了方便性。對此,我們通過exportfs命令寫了一個腳本,由heartbeat來接管這個腳本,當nfsmaster服務器宕機時,nfsbackup的heartbeat開始就執行腳本,腳本通過exportfs來共享目錄,此時VIP也已經飄過去了,所以nfsclient受影響很小。達到了高可用的目的。更多關於exportfs的資料,可以參考man exportfs。下面就看看這個腳本的內容:
[root@nfsbackup ~]# cat /etc/ha.d/resource.d/rsdata1.sh #必須放在/etc/ha.d/resource.d下面
#!/bin/bash
FSID="1"
EXPORT_DIR="/nfs"
EXPORT_OPTIONS="-o rw,sync,all_squash,mp,fsid=2"
EXPORT_CLIENT="192.168.1.0/24"
exportfs_usage() {
cat <<EOF
USEAGE: $0 {start|stop}
EOF
}
exportfs_start()
{
fn="/nfs"
service rpcbind stop &>/dev/null
service rpcbind start &>/dev/null
service nfs restart &>/dev/null
echo "=======nfs restart========"
exportfs ${EXPORT_OPTIONS} ${EXPORT_CLIENT}:${EXPORT_DIR} 2>1& #通過exportfs來申明共享目錄
rc=$?
if [ $rc -ne 0 ];then
echo "export resource ${EXPORT_DIR} error"
exit $rc
else
echo "export resource ok"
exit 0
fi
}
exportfs_stop()
{
fn="/nfs"
service rpcbind stop &>/dev/null
service rpcbind start &>/dev/null
service nfs restart &>/dev/null
echo "=======nfs restart========"
exportfs -u ${EXPORT_CLIENT}:${EXPORT_DIT} 2>1& 通過exportfs來取消共享目錄
rc=$?
if [ $rc -ne 0 ];then
echo "export resource ${EXPORT_DIR} error"
exit $rc
else
echo "umount resource ok"
exit 0
fi
}
if [ $# -lt 1 ];then
exportfs_usage
exit 1
fi
case $1 in
start)
exportfs_start
;;
stop)
exportfs_stop
;;
*)
exit 1
;;
esac
這個腳本必須賦予可執行權限,且必須是LSB規范。同時在/etc/ha.d/haresources添加上這個腳本
[root@nfsmaster ~]# cat /etc/ha.d/haresources
nfsbackup IPaddr::192.168.1.100/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/nfs::ext4 rsdata1.sh #尾部添加rsdata1.sh這個腳本名
上面的操作主備都需要操作。腳本主備都要有。
測試高可用性
此時VIP在nfsmaster上面,我們在nfsclient端首先掛載NFS共享目錄后創建一些文件:
[root@nfsclient /]# mount -t nfs 192.168.1.100:/nfs /database #
[root@nfsclient /]# cd /database/
[root@nfsclient database]# touch {1..10}
[root@nfsclient database]# ls
1 10 2 3 4 5 6 7 8 9 lost+found readme
關閉nfsmaster的電源,模擬宕機。此時等待VIP漂移到nfsbackup上面。待漂移到位后,我們繼續在nfsclient上操作:
[root@nfsclient database]# ls # 可以查看目錄下的文件
1 10 2 3 4 5 6 7 8 9 lost+found readme
[root@nfsclient database]# rm -f {1..5} # 也可以刪除文件。
[root@nfsclient database]# ls
10 6 7 8 9 lost+found readme