天天看點

DRBD+HEARTBEAT 搭建NFS 服務高可用方案

1. 簡述

本篇文章主要是使用 DRBD+HEARTBEAT 來保證 NFS 的高可用。使用 DRBD 來保證主從伺服器的檔案一緻, 使用 HEARTBEAT 來做熱切換。

2. 硬體和網絡需求

需要兩台伺服器, 并且分别單獨挂載硬碟或者硬碟分區。 同時有一個 VIP 能夠對外統一提供 NFS 服務

3. 安裝 DRBD

3.1 安裝 DRBD

兩台伺服器都進行添加的磁盤分區格式化, 如果是有已存在的分區可以忽略

parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0 1024
parted /dev/sdb mkpart primary 1025 2146
parted /dev/sdb p
mkfs.ext4 /dev/sdb1           

複制

安裝 和初始化 drbd

rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
yum install -y drbd84-utils kmod-drbd84
modprobe drbd           

複制

3.2 編輯配置檔案

建立檔案

/etc/drbd.d/r0.res

172.16.1.31 和 172.16.1.32 分别為兩台伺服器 IP

resource r0 {
  net {
    protocol C;
    cram-hmac-alg "sha1";
    shared-secret "c4f9375f9834b4e7f0a528cc65c055702bf5f24a";
}
  device      /dev/drbd0;
  disk        /dev/sdb1;
  meta-disk   /dev/sdb2[0];
  on nfs {
    address     172.16.1.31:7788;
  }
  on nfs-s {
    address     172.16.1.32:7788;
  }
}           

複制

3.3 初始化裝置

drbdadm create-md r0
drbdadm up r0
cat /proc/drbd           

複制

NFS 主伺服器提升

drbdadm -- --overwrite-data-of-peer primary r0           

複制

将主 NFS 伺服器的 drbd0 格式化供使用

mkfs.ext4 /dev/drbd0           

複制

測試一下

mkdir /data
mount /dev/drbd0 /data           

複制

4 NFS 服務安裝

4.1 安裝服務

yum install -y rpcbind nfs-utils           

複制

4.2 配置

修改配置檔案

echo "/data 10.0.0.0/24(rw,sync,anonuid=502,anongid=502,all_squash)" >/etc/exports           

複制

建立使用者個使用者組 , 賦予權限,這裡的 502 是 建立的 nginx 使用者的 UID

useradd -s /sbin/nologin -u 502 -M nginx
chown -R nginx.nginx /data           

複制

啟動 NFS 服務

/etc/init.d/rpcbind start
/etc/init.d/nfs start           

複制

5. 安裝 heartbeat

5.1 安裝

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum repolist
yum install -y heartbeat           

複制

5.2 修改配置

5.2.1 修改總體配置

/etc/ha.d/ha.cf

如下

## 日志檔案
logfile /var/log/ha-log
logfacility      local0
keepalive 2
deadtime 30
warntime 10
initdead 60
# 對方的IP
mcast eth0 225.0.0.31 694 1 0
auto_failback on
node nfs
node nfs-s           

複制

5.2.2 修改雙機驗證檔案

/etc/ha.d/authkeys

auth 1
1 sha1 c4f9375f9834b4e7f0a528cc65c055702bf5f24a           

複制

修改一下權限

chmod 600 /etc/ha.d/authkeys

5.2.3 修改叢集資源檔案配置

/etc/ha.d/haresources

nfs 10.0.0.30 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext4 nfs           

複制

注意這裡配置的 IP 是 VIP, 兩台伺服器都一緻

5.3 啟動

/etc/init.d/heartbeat start           

複制

用戶端挂載它

用戶端需要安裝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
  # 挂載成功。           

複制

6、模拟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也同樣正常使用。

7、高可用方案

經過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           

複制

到此NFS高可用就做完了