nfs+drbd+heartbeat實現高可用文件系統

寫在前面:

上兩篇博客詳細的描述了heartbeat    http://blog.csdn.net/sj349781478/article/details/77865621

以及drbd詳解    http://blog.csdn.net/sj349781478/article/details/77893474

下面我們要做的就是將着兩種軟件結合,並給上層NFS提供高可靠服務。

一、NFS介紹

1)什麼是NFS

         NFS(Network File System)即網絡文件系統,它的主要功能是通過網絡讓不同的機器系統之間可以彼此共享文件和目錄NFS服務器可以允許NFS客戶端將遠端NFS服務器端的共享目錄掛載到本地的NFS客戶端中。在本地NFS客戶端的機器看來,NFS服務器端共享的目錄就好像自己的磁盤分區和目錄一樣。一般客戶端掛載到本地目錄的名字可以隨便,但爲方便管理,我們要和服務器端一樣比較好。NFS一般用來存儲共享視頻,圖片等靜態數據。

2)rpcnfs的關係

   pcportmap)就是用來統一管理NFS端口的服務,並且統一對外的端口是111NFS服務端需要先啓動rpc,再啓動NFS這樣NFS才能夠到RPC去註冊端口信息。客戶端的RPC可以通過向服務端的RPC請求獲取服務端的NFS端口信息。當獲取到了NFS端口信息後,就會以實際端口進行數據的傳輸。因爲NFS有很多功能,不同的功能需要使用不同的端口。因此NFS無法固定端口RPC會記錄NFS端口的信息,這樣我們就能夠通過RPC實現服務端和客戶端的RPC來溝通端口信息。

     NFS在文件傳送或信息傳送過程中依賴於RPC協議。RPC,遠程過程調用 (Remote Procedure Call) 是能使客戶端執行其他系統中程序的一種機制。NFS本身是沒有提供信息傳輸的協議和功能的,但NFS卻能讓我們通過網絡進行資料的分享,這是因爲NFS使用了一些其它的傳輸協議。而這些傳輸協議用到這個RPC功能的。可以說NFS本身就是使用RPC的一個程序。或者說NFS也是一個RPC SERVER。所以只要用到NFS的地方都要啓動RPC服務,不論是NFS SERVER或者NFS CLIENT。這樣SERVER和CLIENT才能通過RPC來實現PROGRAM PORT的對應。可以這麼理解RPC和NFS的關係:NFS是一個文件系統,而RPC是負責負責信息的傳輸。

3)客戶端NFS和服務端NFS通訊過程

1、首先服務器端啓動RPC服務,並開啓111端口
2、啓動NFS服務,並向RPC註冊端口信息
3、客戶端啓動RPC(portmap服務),向服務端的RPC(portmap)服務請求服務端的NFS端口
4、服務端的RPC(portmap)服務反饋NFS端口信息給客戶端。
5、客戶端通過獲取的NFS端口來建立和服務端的NFS連接並進行數據的傳輸。

二、NFS部署

一、準備階段:(客戶端和服務端)
[[email protected] ~]# cat /etc/redhat- release #查看系統版本
CentOS release 6.6 (Final) [[email protected]-server ~]# uname -r #查看系統內核版本 2.6.32-504.el6.x86_64 [[email protected]-server ~]# uname -m #查看系統是否64位 x86_64
二、NFS服務端所需的軟件列表
nfs-utils:這個是NFS服務主程序(包含rpc.nfsd、rpc.mountd、daemons)
rpcbind:這個是CentOS6.X的RPC主程序(CentOS5.X的爲portmap)
三、檢查軟件是否安裝
[[email protected] ~]# rpm -qa nfs-utils rpcbind #檢查安裝的軟件包 rpcbind-0.2.0-12.el6.x86_64 nfs-utils-1.2.3-70.el6_8.2.x86_64
<如果沒有安裝在系統中通過yum 命令進行安裝以上兩個包>
[[email protected] ~]# yum install -y nfs-utils rpcbind #安裝上述所需的兩個軟件包
四、啓動NFS服務端相關服務
---開啓rpcbind服務
[[email protected] ~]# /etc/init.d/rpcbind status  #查詢rpcbind服務狀態並啓動 rpcbind (pid 1281) is running... 
[[email protected] ~]# lsof -i : 111 #查詢rpcbind監聽狀態 (111是rpcbind的主端口)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1281 rpc 6u IPv4 10766 0t0 UDP *:sunrpc rpcbind 1281 rpc 8u IPv4 10769 0t0 TCP *:sunrpc (LISTEN) rpcbind 1281 rpc 9u IPv6 10771 0t0 UDP *:sunrpc rpcbind 1281 rpc 11u IPv6 10774 0t0 TCP *:sunrpc (LISTEN)
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1281/rpcbind tcp 0 0 :::111 :::* LISTEN 1281/rpcbind udp 0 0 0.0.0.0:608 0.0.0.0:* 1281/rpcbind udp 0 0 0.0.0.0:111 0.0.0.0:* 1281/rpcbind udp 0 0 :::608 :::* 1281/rpcbind udp 0 0 :::111 :::* 1281/rpcbind
[[email protected] ~]# chkconfig --list rpcbind #檢查rpcbind自啓動情況 rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[[email protected] ~]# rpcinfo -p localhost #查看NFS服務項rpc服務器註冊的端口信

<這個是還未啓動NFS服務的rpcbind狀態>
---啓動NFS服務
[[email protected] ~]# /etc/init.d/nfs status #查看NFS服務並啓動 rpc.svcgssd is stopped rpc.mountd is stopped nfsd is stopped rpc.rquotad is stopped 
[[email protected] ~]# /etc/init.d/nfs start
Starting NFS services:  [  OK  ] Starting NFS quotas: [  OK  ] Starting NFS mountd: [  OK  ] Starting NFS daemon: [  OK  ] Starting RPC idmapd: [  OK  ] 
[[email protected]-server ~]# lsof -i :2049 #查看NFS端口啓動(NFS默認端口爲2049) [[email protected]-server ~]# netstat -lntup|grep 2049 #查看NFS端口啓動(NFS默認端口爲2049) tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN - tcp 0 0 :::2049 :::* LISTEN - udp 0 0 0.0.0.0:2049 0.0.0.0:* - udp 0 0 :::2049 :::* -
[[email protected] ~]# rpcinfo -p localhost #啓動NFS過後rpcbind服務已經啓用了對NFS的端口映射
<這個是啓動FNS服務過後 的rpcbind的狀態>
[[email protected] ~]# chkconfig --list nfs #查看nfs的開機自啓動情況 nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off [[email protected]-server ~]# chkconfig nfs on #讓NFS開機自啓動
由於在NFS服務過程中,必須先啓動rpcbind,再啓動nfs,這樣才能讓NFS在rpcbind上註冊成功
[[email protected] ~]# less /etc/init.d/rpcbind  #查看rpcbind服務啓動詳情

同理我們查看nfs服務的自啓動詳情
[[email protected] ~]# less /etc/init.d/nfs

<由上面可以看出系統默認會讓rpcbind服務先啓動,再啓動nfs服務,但是在實際生產環境中,我們最好不要用chkconfig來控制服務的開機自啓動,我們生產環境中我們一般用rc.local來管理。主要是爲了方便以後查閱哪些服務開機自己,並且能控制先後順序,如圖>
<爲了規範化我們用rc.local來管理開機自啓動>
[[email protected] ~]# vi /etc/rc.local

NFS服務常見進程的詳細說明
我們可以重NFS服務的啓動過程看到以下幾個進程:
rpcuser 1303 1 0 Nov22 ? 00:00:00 rpc.statd #檢查文件一致性 root 1512 2 0 Nov22 ? 00:00:00 [rpciod/0] rpc 2723 1 0 02:43 ? 00:00:00 rpcbind root 2896 1 0 02:56 ? 00:00:00 rpc.rquotad #磁盤配額進程 root 2901 1 0 02:56 ? 00:00:00 rpc.mountd #權限管理驗證等 root 2908 2 0 02:56 ? 00:00:00 [nfsd4] root 2909 2 0 02:56 ? 00:00:00 [nfsd4_callbacks] root 2910 2 0 02:56 ? 00:00:00 [nfsd] root 2911 2 0 02:56 ? 00:00:00 [nfsd] root 2912 2 0 02:56 ? 00:00:00 [nfsd] root 2913 2 0 02:56 ? 00:00:00 [nfsd] #NFS主進程,管理登入,身份判定 root 2914 2 0 02:56 ? 00:00:00 [nfsd] root 2915 2 0 02:56 ? 00:00:00 [nfsd] root 2916 2 0 02:56 ? 00:00:00 [nfsd] root 2917 2 0 02:56 ? 00:00:00 [nfsd] root 2948 1 0 02:56 ? 00:00:00 rpc.idmapd #名稱映射

<如果對上述進程不明白可以 用man命令查閱幫助信息,如 「man rpc.statd」>

五、配置NFS服務端
前面介紹了NFS的啓動,接下來我們配置NFS服務端的配置
/etc/exports 是NFS程序的配置文件。並且默認爲空
/etc/exports文件的配置格式爲:
NFS共享目錄 NFS客戶端地址1(參數1,參數2,參數3......) 客戶端地址2(參數1,參數2,參數3......)
NFS共享目錄 NFS客戶端地址(參數1,參數2,參數3......)
<我們在此共享給 192.168.1.0/24所有主機,>
<man exports 查看 例子和參數詳情。如下:>
配置完成exports後平滑重啓NFS服務 ,下面兩條命令等同
[[email protected] ~]# /etc/init.d/nfs reload [[email protected]-server ~]# exportfs -r
[[email protected] ~]# showmount -e 127.0.0.1 #查看本機掛載情況
<必須先啓動rpcbinc 再啓動nfs纔會顯示正確>
[[email protected] ~]# mount -t nfs 192.168.1.5:/data /mnt #在本機測試掛載

<我們用客戶機器進行掛載並測試>
<掛在過後由於權限問題,我們不能再/mnt裏面進行編輯刪除新增文件等操作。接下來爲/data目錄進行權限的設置>
六、配置NFS客戶端
客戶端也需要安裝rpcbind和nfs-utils軟件,並且設置開機自啓動。(只需要啓動rpcbind即可)
然後再進行如下操作
<自此,我們配置成功,但是別高興。我們只是掛載動作完成了,但是我們沒有權限對掛載的目錄進行各種操作。>
接下來我們在服務端配置如下命令,給/data目錄添加nfsnobody權限,
[[email protected] ~]# cat /var/lib/nfs/etab  #查看一條配置的詳細信息

現在我們可以對掛載目錄進行各種操作,但是還沒有完。我們需要把掛載命令放在rc.local裏面,
我們不要把掛載命令放在fstab,因爲fstab比網絡先啓動,會出現掛載不上網絡NFS
-------------------------------------------------------------------------------------------------------
WINDOWS客戶端的配置
現在我們客戶端和服務端的NFS配置都已經完成,多臺客戶端同上的客戶端操作,
如果是WINDOWS客戶端,我們需要在程序和功能裏面啓用 NFS客戶端。
 
Windows 7 連接 NFS Server:
控制面板——所有控制面板項——程序和功能——勾選NFS服務,NFS客戶端
CMD 進入命令行
mount ip:/www/abc/ z:
 
其它不支持直接連接NFS Server的windows,可以在系統上面安裝SFU (Windows Services for UNIX),點開始–>點程序–>點Windows Services for UNIX–>Korn Shell
mount ip:/www/abc/ z:
------------------------------------------------------------------------------------------------------
總結NFS服務的配置過程:
--服務端--
1.安裝軟件
yum install -y nfs-utils rpcbind
2.啓動服務(先啓動rpcbind)
/etc/init.d/rpcbind start
/etc/init.d/nfs start
3.設置開機自啓動
chkconfig nfs on
chkconfig rpcbind on
修改rc.local
4.配置NFS服務
echo "/data 192.168.1.5/24(rw,sync)"
mkdir -p /data
chown -R nfsnobody.nfsnobody /data
5.重新加載服務
/etc/init.d/nfs reload 或者 exportfs -r
6.檢查或測試掛載
showmount -e localhost
mount -t nfs 192.168.1.5:/data /mnt
 
--客戶端-
1.安裝軟件
yum install -y nfs-utils rpcbind
2.啓動rpcbind
/etc/init.d/rpcbind start
3.配置開機自啓動
chkconfig rpcbind on
或者修改rc.local
4.測試服務端共享情況
show -e 192.168.1.5
5.掛載
mkdir -p /data
mount -t nfs 192.168.1.5:/data /data
6.測試是否有讀寫權限
-----------------------------------------------------------------------------------------------
常見錯誤
1.df -h 檢查服務端的NFS服務是不是啓動成功,
2.確認NFS客戶端showmount是否OK。
3.確認rpcbind上是否有NFS註冊,(rpcbind必須先啓動)
3.確認網絡是否通暢
4.確認是否因爲防火牆擋住(一般內網不需要開啓防火牆,在出口加防火牆就夠了)
-----------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------
三、nfs+drbd+heartbeat實現高可用文件系統
上述完成了NFS的配置,可是此時服務端是單點,一旦故障,保存在nfs上的數據將會無法連接,那麼下面要解決的就是nfs上的數據如何做到冗餘?服務器出了故障如何切換?
答案就是:先搭建heartbeat解決切換問題,再搭建drbd解決數據冗餘問題,最後搭建NFS提供數據文件共享。
1、兩臺服務器上,heartbeat的haresources文件中進行drbd與heartbeat的關聯
[[email protected] ~]# vi /etc/ha.d/haresources
master IPaddr::172.16.87.199/24/eth1 drbddisk::web Filesystem::/dev/drbd0::/drbd-data::ext4 killnfsd
 
    
# vi /etc/ha.d/resource.d/killnfsd
killall -9 nfsd; /etc/init.d/nfs restart;exit 0
# chmod 755 /etc/ha.d/resource.d/killnfsd
注:該文件內IPaddr,Filesystem等腳本存放路徑在/etc/ha.d/resource.d/下,也可在該目錄下存放服務啓動腳本(例如:mysql,www),將相同腳本名稱添加到/etc/ha.d/haresources內容中,從而跟隨heartbeat啓動而啓動該腳本。
 
IPaddr::172.16.87.199/24/eth1:用IPaddr腳本配置對外服務的浮動虛擬IP

drbddisk::r0:用drbddisk腳本實現DRBD主從節點資源組的掛載和卸載

Filesystem::/dev/drbd0::/drbd-data::ext4 killnfsd 文件系統,目錄及格式,後跟nfs資源腳本

2、nfs客戶端掛載至heartbeat提供的虛擬vip上
mount -t nfs VIP:/drbd-data  /testdata1

3、測試高可用
主服務器上關閉heartbeat服務---》VIP釋放---》drbd資源是釋放---》查看從服務器的各項狀態
查看vip的切換 #ip add
查看drbd的主從狀態 #cat /proc/drbd
查看nfs掛載情況 #df -h

通過一臺測試機,掛載到虛地址,當故障切換時,nfs無間斷提供服務,提供完美冗餘。


此文爲頭條號作者技術男諾言原創,特此申明