(轉)企業級NFS網絡文件共享服務


企業級NFS網絡文件共享服務

原文:http://www.cnblogs.com/chensiqiqi/archive/2017/03/10/6530859.html

--本教學筆記是本人學習和工作生涯中的摘記整理而成,此為初稿(尚有諸多不完善之處),為原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章原始出處,作者信息和本聲明。否則將追究法律責任。http://www.cnblogs.com/chensiqiqi/


[TOC]


第一章 NFS網絡文件共享服務

1.1 NFS介紹

1)什么是NFS?

  • NFS是Network File System的縮寫,中文意思是網絡文件系統。它的主要功能是通過網絡(一般是局域網)讓不同的主機系統之間可以共享文件或目錄。NFS客戶端(一般為應用服務器,例如web)可以通過掛載(mount)的方式將NFS服務器端共享的數據目錄掛載到NFS客戶端本地系統中(就是某一個掛載點下)。從客戶端本地看,NFS服務器端共享的目錄就好像是客戶端自己的磁盤分區或者目錄一樣,而實際上卻是遠端的NFS服務器的目錄。

  • NFS網絡文件系統很像Windows系統的網絡共享,安全功能,網絡驅動器影射,這也和Linux系統里的samba服務類似。只不過一般情況下,Windows網絡共享服務或samba服務用於辦公局域網共享,而互聯網中小型網站集群架構后端常用NFS進行數據共享。

2)NFS在企業中的應用場景

  • 在企業集群架構的工作場景中,NFS網絡文件系統一般被用來存儲共享視頻,圖片,附件等靜態資源文件,通常網站用戶上傳的文件都會放到NFS共享里,例如:BBS產品的圖片,附件,頭像(注意網站BBS程序不要放NFS共享里),然后前端所有的節點訪問這些靜態資源時都會讀取NFS存儲上的資源。NFS是當前互聯網系統架構中最常用的數據存儲服務之一,前面說過,中小型網站公司應用頻率更高,大公司或門戶除了使用NFS外,還可能會使用更為復雜的分布式文件系統,比如Moosefs(mfs),GlusterFS,FastDFS等

屏幕快照 2017-03-10 下午3.19.53.png-1755.8kB

  • 在企業生產集群架構中,NFS作為所有前端Web服務的共享存儲,存儲的內容一般包括網站用戶上傳的圖片,附件,頭像等,注意,網站的程序代碼不要放NFS共享里,因為網站程序是開發運維人員統一發布的,不存在發布延遲問題,直接批量發布到Web節點提供訪問比共享到NFS里訪問效率更高。

3)企業生產集群為什么需要共享存儲角色。

  • 這里通過圖解給大家展示以下集群架構需要共享存儲服務的理由。例如:A用戶上傳圖片到Web1服務器,然后讓B用戶訪問這張圖片,結果B用戶訪問的請求分發到了Web2,因為Web2上沒有這張圖片,這就導致它無法看到A用戶上傳的圖片,如果此時有一個共享存儲,A用戶上傳圖片的請求無論是分發到Web1還是Web2上,最終都會存儲到共享存儲上,而在B用戶訪問圖片時,無論請求分發到Web1還是Web2上,最終也都會去共享存儲上找,這樣就可以訪問到需要的資源了。這個共享存儲的位置可以通過開源軟件和商業硬件實現,互聯網中小型集群架構會用普通PC服務器配置NFS網絡文件系統實現。
  • 當及集群中沒有NFS共享存儲時,用戶訪問圖片的情況如下圖所示。

屏幕快照 2017-03-08 下午4.34.13.png-458.4kB

上圖是企業生產集群沒有NFS共享存儲訪問的示意圖。下圖是企業生產集群有NFS共享存儲的情況

屏幕快照 2017-03-08 下午4.44.29.png-566.8kB

  • 中小型互聯網企業一般不會買硬件存儲,因為太貴,大公司如果業務發展很快的話,可能會臨時買硬件存儲頂一下網站壓力,當網站並發繼續加大時,硬件存儲的擴展相對就會很費勁,且價格成幾何級數增加。例如:淘寶網就曾替換掉了很多硬件設備,比如,用lvs+haproxy替換了netscaler負載均衡設備,用FastDFS,TFS配合PC服務器替換了netapp,emc等商業存儲設備,去IOE正在成為互聯網公司的主流。

1.2 NFS系統原理介紹

1.2.1 NFS系統掛載結構圖解與介紹

下圖是企業工作中的NFS服務器與客戶端掛載情況結構圖

屏幕快照 2017-03-08 下午4.54.39.png-543kB

  • 可以看到NFS服務器端/video共享目錄掛載到了兩台NFS客戶端上。在客戶端查看時,NFS服務器端的/video目錄就相當於客戶端本地的磁盤分區或目錄,幾乎感覺不到使用上的區別,根據NFS服務端授予的NFS共享權限以及共享目錄的本地系統權限,只要在指定的NFS客戶端操作掛載/v/video或者/video的目錄,就可以將數據輕松地存取到NFS服務器端上的/video目錄中了。

客戶端掛載NFS后,本地掛載基本信息顯示如下:

[root@nfs01 ~]# df -h
Filesystem      Size    Used    Use% Mounted on /dev/sda1 1.1T 467G 544G 47% / tmpfs 7.9G 0 7.9G 0% /dev/shm 10.0.0.7:/video 1002G 59G 892G 7% /video #<==10.0.0.7為nfsserver的ip地址 提示: mount 源 目標 mount 10.0.0.7:/video /video
  • 從掛載信息來看,和本地磁盤分區幾乎沒什么差別,只是文件系統對應列的開頭是以IP滴噢址開頭的形式了。

  • 經過前面的介紹,我們知道NFS系統是通過網絡來進行數據傳輸的(所以叫做網絡文件系統)因此,NFS會使用一些端口來傳輸數據,那么,NFS到底使用哪些端口來進行數據傳輸呢?

  • NFS在傳輸數據時使用的端口會隨機選擇。可能有同學會納悶,既然這樣,NFS客戶端是怎么知道NFS服務端使用的哪個端口呢?
  • 答案就是通過RPC(中文意思遠程過程調用,英文Remote Procedure Call簡稱RPC)協議/服務來實現,這個RPC服務的應用在門戶級的網站有很多,例如:百度等。

1.2.2 什么是RPC(Remote Procedure Call)

  • 因為NFS支持的功能相當多,而不同的功能都會使用不同的程序來啟動,每啟動一個功能就會啟用一些端口來傳輸數據,因此,NFS的功能所對應的端口無法固定,它會隨機取用一些未被使用的端口來作為傳輸之用,其中CentOS5.x的隨機端口都小於1024,而CentOS6.x的隨機端口都是較大的。
  • 因為端口不固定,這樣一來就會造成NFS客戶端與NFS服務端的通信障礙,因為NFS客戶端必須要知道NFS服務端的數據傳輸端口才能進行通信,才能交互數據。
  • 要解決上面的困擾,就需要通過遠程過程調用RPC服務來幫忙了,NFS的RPC服務最主要的功能就是記錄每個NFS功能所對應的端口號,並且在NFS客戶端請求時將該端口和功能對應的信息傳遞給請求數據的NFS客戶端,從而確保客戶端可以連接到正確的NFS端口上去,達到實現數據傳輸交互數據目的。這個RPC服務類似NFS服務端和NFS客戶端之間的一個中介。

屏幕快照 2017-03-08 下午5.44.53.png-681.7kB

  • 就拿房屋中介打個比喻吧:假設我們要找房子,這里的我們就相當於NFS客戶端,中介介紹房子,中介就相當於RPC服務,房子所有者房東就相當於NFS服務,租房的人找房子,就要找中介,中介要預先存有房子主人房東的信息,才能將房源信息告訴租房的人。
  • 那么RPC服務又是如何知道每個NFS的端口呢?
  • 這是因為,當NFS服務端啟動服務時會隨機取用若干端口,並主動向RPC服務注冊取用的相關端口及功能信息,如此一來,RPC服務就知道NFS每個端口對應的NFS功能了,然后RPC服務使用固定的111端口來監聽NFS客戶端提交的請求,並將正確的NFS端口信息回復給請求的NFS客戶端,這樣一來,NFS客戶端就可以與NFS服務端進行數據傳輸了。
  • 在啟動NFS SERVER之前,首先要啟動RPC服務(CentOS5.x下為portmap服務,CentOS6.x下為rpcbind服務,下同),否則NFS SERVER就無法向RPC服務注冊了。另外,如果RPC服務重新啟動,原來已經注冊好的NFS端口數據就會丟失,因此,此時RPC服務管理的NFS程序也需要重新啟動以重新向RPC注冊。要特別注意的是,一般修改NFS配置文件后,是不需要重啟NFS的,直接在命令行執行/etc/init.d/nfs reload或exportfs -rv即可使修改的/etc/exports生效。

1.2.3 NFS的工作流程原理

屏幕快照 2017-03-08 下午5.57.43.png-448.3kB

屏幕快照 2017-03-08 下午6.00.27.png-807.6kB

當訪問程序通過NFS客戶端向NFS服務端存取文件時,其請求數據流程大致如下:

1)首先用戶訪問網站程序,由程序在NFS客戶端上發出存取NFS文件的請求,這時NFS客戶端(即執行程序的服務器)的RPC服務(rpcbind服務)就會通過網絡向NFS服務器端的RPC服務(rpcbind服務)的111端口發出NFS文件存取功能的詢問請求。

2)NFS服務端的RPC服務(rpcbind服務)找到對應的已注冊的NFS端口后,通知NFS客戶端的RPC服務(rpcbind服務)

3)此時NFS客戶端獲取到正確的端口,並與NFS daemon聯機存取數據

4)NFS客戶端把數據存取成功后,返回給前端訪問程序,告知給用戶存取結果,作為網站用戶,就完成了一次存取操作。

因為NFS的各項功能都需要向RPC服務(rpcbind服務)注冊,所以只有RPC服務(rpcbind服務)才能獲取到NFS服務的各項功能對應的端口號(port number),PID,NFS在主機所監聽的IP等信息,而NFS客戶端也只能通過向RPC服務(rpcbind服務)詢問才能找到正確的端口。也就是說,NFS需要有RPC服務(rpcbind服務)的協助才能成功對外提供服務。從上面的描述,我們不難推斷,無論是NFS客戶端還是NFS服務器端,當要使用NFS時,都需要首先啟動RPC服務(rpcbind服務),NFS服務必須在RPC服務啟動之后啟動,客戶端無需啟動NFS服務,但需要啟動RPC服務。

注意:
NFS的RPC服務,在CentOS5.X下名稱為portmap,在CentOS6.x下名稱為rpcbind

1.3 NFS服務端部署環境准備

1.3.1 NFS服務部署服務器准備

角色 主機名 eth0(外網) eth1(內網)
C1-NFS服務器端 nfs01 10.0.0.31 172.16.1.31
C2-Rsync存儲服務器 backup 10.0.0.41 172.16.1.41
B2-nginx web服務器 web01 10.0.0.8 172.16.1.8

1.3.2 修改主機名及標簽

hostname web01
sed -i 's#chensiqi#web01#g' /etc/sysconfig/network

1.3.3 必須的優化(統一使用模版機進行克隆)

從第二階段開始教學筆記中出現的服務器配置沒有意外的情況下,它的IP等相關信息都是統一的,第二階段的教學當中一共大概會出現8-10台必須的服務器(搭建不同的業務),最終這些服務器就組成了我們第二階段最后的考試內容,10台規模的基礎核心架構集群。
因此,我們在克隆虛擬機的時候,要統一克隆模版,因此建議大家,准備一個虛擬機的模版機,只做克隆用。模版機的相關優化及克隆准備工作,請參看http://www.cnblogs.com/chensiqiqi/p/6228006.html實戰教學筆記的第六節

1.4 NFS server端的設置

1.4.1 NFS軟件列表

要部署NFS服務,需要安裝下面的軟件包:

  • [x] nfs-utils:
    NFS服務的主程序,包括rpc.nfsd,rpc.mountd這兩個daemons和相關文檔說明,以及執行命令文件等。
  • [x] rpcbind:
    CentOS6.X下面RPC的主程序。NFS可以視為一個RPC程序,在啟動任何一個RPC程序之前,需要做好端口和功能的對應映射工作,這個映射工作就是由rpcbind服務來完成的。因此,在提供NFS服務之前必須先啟動rpcbind服務才行。

注意:
有關RPC協議知識這里大家不必細究,詳細說明可見本章結尾命令部分。

1.4.2 查看NFS軟件包

可使用如下命令查看默認情況下CentOS6.x里NFS軟件的安裝情況。

rpm -qa nfs-utils rpcbind

當不知道軟件名字時候,可以用rpm -qa | grep -E "nfs-|rpcbind"來過濾包含在引號內的字符串。grep -E這里相當於egrep。grep,egrep這兩個命令在運維工作中非常常用並且很好用。CentOS6.8默認沒有安裝NFS軟件包,可以使用yum -y install nfs-utils rpcbind命令來安裝NFS軟件。

root@nfs01 ~]# yum -y install nfs-utils rpcbind ...忽略軟件顯示信息... [root@nfs01 ~]# rpm -qa nfs-utils rpcbind nfs-utils-1.2.3-70.el6_8.2.x86_64 rpcbind-0.2.0-12.el6.x86_64

如果出現rpcbind和nfs-utils開頭的兩個軟件包,表示NFS服務端軟件安裝完畢

1.4.3 啟動NFS相關服務

查看某個命令屬於已經安裝的哪個rpm包

[root@nfs01 backup]# which rpcinfo #查詢命令絕對路徑 /usr/sbin/rpcinfo [root@nfs01 backup]# rpm -qf /usr/sbin/rpcinfo #查詢某個命令屬於已經安裝的哪個rpm包 rpcbind-0.2.0-12.el6.x86_64 [root@nfs01 backup]# rpm -qf `which showmount` nfs-utils-1.2.3-70.el6_8.2.x86_64

1.4.1.1 啟動rpcbind

因為NFS及其輔助程序都是基於RPC(remote Procedure Call)協議的(使用的端口為111),所以首先要確保系統中運行了rpcbind服務。啟動的實際操作如下:

[root@nfs01 backup]# /etc/init.d/rpcbind status #檢查rpcbind服務狀態 rpcbind 已停 [root@nfs01 backup]# /etc/init.d/rpcbind start #啟動rpcbind服務 正在啟動 rpcbind: [確定] [root@nfs01 backup]# rpcinfo -p localhost #查看NFS服務向rpc服務注冊的端口信息,因為NFS還沒有啟動,因此,沒有太多注冊的端口影射信息。 program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper #提示:111端口為rpcbind服務對外提供服務的主端口 

1.4.3.2 啟動NFS服務

[root@nfs01 backup]# /etc/init.d/nfs start #啟動nfs服務
啟動 NFS 服務: [確定] 關掉 NFS 配額: [確定] 啟動 NFS mountd: [確定] 啟動 NFS 守護進程: [確定] Starting RPC idmapd: [ OK ] 

特別提示:
如果不啟動rpcbind服務直接啟動nfs服務的會啟動時失敗。

1.4.3.3 NFS服務常見進程詳細說明

從上面NFS服務啟動過程可以看出,運行NFS服務默認需要啟動的服務或進程至少有:NFS quotas(rpc.rquotad),NFS daemon(nfsd),NFS mountd(rpc.mountd)。可以通過執行如下命令查看啟動NFS后,系統中運行的NFS相關進程:

[root@nfs01 ~]# ps -ef | egrep "rpc|nfs" root 2179 2 0 07:38 ? 00:00:00 [rpciod/0] rpc 2560 1 0 07:42 ? 00:00:00 rpcbind root 2605 1 0 07:42 ? 00:00:00 rpc.rquotad #磁盤配額進程(remote quota server) root 2610 1 0 07:42 ? 00:00:00 rpc.mountd #權限管理驗證等(NFS mount daemon) root 2617 2 0 07:42 ? 00:00:00 [nfsd4] root 2618 2 0 07:42 ? 00:00:00 [nfsd4_callbacks] root 2619 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2620 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2621 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2622 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2623 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2624 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2625 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2626 2 0 07:42 ? 00:00:00 [nfsd] #nfs主進程 root 2657 1 0 07:42 ? 00:00:00 rpc.idmapd #name mapping daemon root 2728 1525 0 08:06 pts/0 00:00:00 egrep rpc|nfs

NFS服務的主要任務是共享文件系統數據,而文件系統數據的共享離不開權限問題。所以NFS服務器啟動時最少需要兩個不同的進程,一個是管理NFS客戶端是否能夠登入的rpc.nfsd主進程,另一個用於管理NFS客戶端是否能夠取得對應權限的rpc.mountd進程。如果還需要管理磁盤配額,則NFS還要再加載rpc.rquotad進程。

服務或進程名 用途說明
nfsd(rpc.nfsd) rpc.nfsd主要功能是管理NFS客戶端是否能夠登入NFS服務端主機,其中還包含登入者的ID判別等
mountd(rpc.mountd) rpc.mountd的主要功能則是管理NFS文件系統。當NFS客戶端順利通過rpc.nfsd登入NFS服務端主機時,在使用NFS服務器提供數據之前,它會去讀NFS的配置文件/etc/exports來比對NFS客戶端的權限,通過這一關之后,還會經過NFS服務端本地文件系統使用權限(就是owner,group,other權限)的認證程序。如果都通過了,NFS客戶端就可以取得使用NFS服務器端文件的權限。注意,這個/etc/exports文件也是我們用來管理NFS共享目錄的使用權限與安全設置的地方,特別強調,NFS本身設置的是網絡共享權限,整個共享目錄的權限還和目錄自身系統權限有關
rpc.lockd(非必需) 可用來鎖定文件,用於多客戶端同時寫入

1.4.3.4 配置NFS服務端服務開機自啟動

[root@nfs01 ~]# chkconfig rpcbind on [root@nfs01 ~]# chkconfig nfs on [root@nfs01 ~]# chkconfig --list rpcbind rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@nfs01 ~]# chkconfig --list nfs nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off

特別說明:
在很多大企業里,大都是統一按照運維規范將服務的啟動命令放到/etc/rc.local文件里的,而不是用chkconfig管理的。把/etc/rc.local文件作為本機的重要服務檔案文件,所有服務的開機自啟動都必須放入/etc/rc.local。這樣規范的好處是,一旦管理此服務器的人員離職,或者業務遷移都可以通過/etc/rc.local很容易的查看到服務器對應的相關服務,可以方便的運維管理。下面是把啟動命令放入到/etc/rc.local文件中的配置信息,注意別忘了加上啟動服務的注釋。

[root@nfs01 ~]# tail -3 /etc/rc.local 
#start up nfs service by chensiqi at 20170309 /etc/init.d/rpcbind start /etc/init.d/nfs start

1.5 實戰配置NFS服務端

1.5.1 NFS服務端配置文件路徑

NFS服務的默認配置文件路徑為:/etc/exports,並且默認是空的。

[root@nfs01 ~]# ls -l /etc/exports -rw-r--r--. 1 root root 0 1月 12 2010 /etc/exports [root@nfs01 ~]# cat /etc/exports

提示:
NFS默認配置文件/etc/exports其實是存在的,但是沒有內容,需要用戶自行配置。

1.5.2 exports配置文件格式

/etc/exports文件位置格式為:

NFS共享的目錄 NFS客戶端地址1(參1,參2...)客戶端地址2(參1,參2...)

NFS共享的目錄 NFS客戶端地址(參1,參2...)

查看exports語法文件格式幫助的方法為:
執行man exports命令,然后切換到文件結尾,可以快速看如下樣例格式:

[root@nfs01 ~]# cat /etc/exports 
/data 172.16.1.0/24(rw,sync) 命令說明: /data :nfs的共享目錄路徑 172.16.1.0/24:允許掛載我的共享目錄的IP地址段 (rw):可讀可寫 (sync):實時同步

修改配置文件以后,必須重啟nfs服務

[root@nfs01 ~]# /etc/init.d/nfs reload [root@nfs01 ~]# showmount -e #查看生效的nfs配置文件規則 Export list for nfs01: /data 172.16.1.0/24

1.5.3 給共享目錄更改屬主屬組為nfsnobady

[root@nfs01 ~]# grep nfs /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data [root@nfs01 ~]# ll -d /data drwxr-xr-x. 2 nfsnobody nfsnobody 4096 3月 9 09:43 /data

特別提示:
如果不授權屬主屬組,那么共享目錄掛載以后將不遵循配置文件exports的設定好的讀寫規則。雖然也能正常掛載,但是會導致寫入文件時提示沒有權限。

[root@nfs01 ~]# touch /mnt/a touch: 無法創建"/data/a": 權限不夠

1.5.4 進行本地掛載測試

[root@nfs01 ~]# mount 172.16.1.31:/data /mnt

提示:
沒有報錯就說明掛載成功了。

1.5.5 進行文件寫入測試

[root@nfs01 ~]# ls /data #查看目錄 [root@nfs01 ~]# ls /mnt #查看目錄 [root@nfs01 ~]# touch /data/a #在data目錄創建文件a [root@nfs01 ~]# ls /data #data共享目錄有a a [root@nfs01 ~]# ls /mnt #mnt掛載目錄也有a a [root@nfs01 ~]# touch /mnt/b #在mnt目錄創建文件b [root@nfs01 ~]# ls /data #data共享目錄有b a b [root@nfs01 ~]# ls /mnt #mnt掛載目錄也有b a b

提示:
當配置文件exports里設定了(rw,rsync)后,表示目錄可讀寫,並且是實時同步的。也就是說,在其中任意一個掛載目錄里改變了里面的內容信息,那么所有掛載目錄包含源共享目錄的內容信息同步改變。

至此NFS服務器端配置完畢

1.6 實戰配置NFS客戶端配置過程-web01

1.6.1 回顧整體流程

屏幕快照 2017-03-09 上午11.23.52.png-640.6kB

1.6.2 客戶端必須安裝nfs-utils軟件

[root@web01 ~]# yum -y install nfs-utils

提示:不安裝則不能掛載nfs共享目錄

1.6.3 檢查遠端showmount

[root@web01 ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24

1.6.4 客戶端掛載

[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt 

提示:-t nfs 可以省略

1.6.5 進行文件讀寫及同步測試

[root@web01 ~]# ls /mnt a b [root@web01 ~]# touch /mnt/chensiqi #創建文件 [root@web01 ~]# ls /mnt a b chensiqi [root@web01 ~]# ssh root@172.16.1.31 "ls /data" #遠程看一下nfs服務器端共享目錄 root@172.16.1.31's password: a b chensiqi

1.6.6 配置開機自動掛載nfs共享目錄(/etc/fstab)

配置客戶端mount掛載命令使掛載開機自動執行,這里有兩種方法,如下:

第一種方法:將掛載命令放在/etc/rc.local里
缺點:偶爾開機掛載不上,工作中除了開機自啟動配置,還要對是否掛載做監控

echo "mount -t nfs 172.16.1.31:/data /mnt"

第二種方法,將掛載命令放在/etc/fstab里

[root@web01 ~]# tail -1 /etc/fstab 172.16.1.31:/data /mnt nfs defaults 0 0

其實所謂配置方法,這里有一個誤區,如下:

  • fstab會優先於網絡被Linux系統加載。網絡沒啟動時執行fstab會導致連不上NFS服務器端,無法實現開機掛載。而且,即使是本地的文件系統,也要注意,fstab最后兩列要設置0 0.否則有可能導致無法啟動服務器的問題。
  • 因此,nfs網絡文件系統最好不要放到fstab里實現開機掛載。
  • 但是,如果是在開機自啟動服務里設置並啟動了netfs服務,放入fstab里也是可以開機掛載的。

例如:

[root@web01 ~]# chkconfig --list netfs netfs 0:關閉 1:關閉 2:關閉 3:關閉 4:關閉 5:關閉 6:關閉 [root@web01 ~]# chkconfig netfs on [root@web01 ~]# chkconfig --list netfs netfs 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉

如此一來,我們也可以通過fstab進行開機掛載了nfs網絡文件系統了。同學們可以自行仿照測試。

至此NFS客戶端配置完畢

1.7 NFS配置權限設置常用參數說明

rw Read-write,表示可讀寫權限
ro Read-only,表示只讀權限
sync (同步,實時)請求或吸入數據時,數據同步寫入到NFS Server的硬盤后才返回
async (異步)寫入時數據會先寫到內存緩沖區,只到硬盤有空檔才會寫入磁盤,這樣可以提升寫入速率!風險為若服務器掛掉或不正常關機,會損失緩沖區中未寫入磁盤的數據
no_root_squash 訪問NFS Server共享目錄的用戶如果是root,它對該共享目錄具有root權限。
root_squash 如果訪問目錄的是root,則它的權限將被壓縮成匿名用戶。
all_squash 不管訪問共享目錄的用戶身份如何,它的權限都被壓縮成匿名用戶。
anonuid 指定共享文件夾里文件所有者的uid號:例如:(rw,squash,anonuid=12306,anongid=12306)
anongid 指定共享文件夾里文件所有者的gid號:例如:(rw,squash,anonuid=12306,anongid=12306)

1.8 NFS服務企業案例配置實踐

實例一:
共享/data 目錄給10.0.0.0/24整個網段可讀可寫。

實例二:
nfs服務器:172.16.1.31
共享下面兩個目錄:
/app/w :要求可讀可寫,同步數據,所有用戶壓縮為匿名用戶
/app/r:要求只讀,同步數據,所有用戶都壓縮為匿名用戶

客戶端上面的要求:
backup服務器,把nfs服務器的/app/r掛載到/data/r

web01服務器,把nfs服務器的/app/w掛載到/data/w

1.9 exports配置文件相關參數的說明

exports配置文件的相關參數,摘自man exports:

EXAMPLE # sample /etc/exports file / master(rw) trusty(rw,no_root_squash) /projects proj*.local.domain(rw) /usr *.local.domain(ro) @trusted(rw) /home/joe pc001(rw,all_squash,anonuid=150,anongid=100) /pub *(ro,insecure,all_squash)

上述各個列的參數含義如下:

  • [x] :NFS共享的目錄:為NFS服務端要共享的實際目錄,要用絕對路徑,如(/data)。注意共享目錄的本地權限,如果需要讀寫共享,一定要讓本地目錄可以被NFS客戶端的用戶(nfsnobody)讀寫。
  • [x] :NFS客戶端地址:為NFS服務端授權的可訪問共享目錄的NFS客戶端地址,可以為單獨的IP地址或主機名,域名等,也可以為整個網段地址,還可以用“*”來匹配所有客戶端服務器,這里所謂的客戶端一般來說是前端的業務服務器,例如:Web服務。
  • [x] :權限參數集:對授權的NFS客戶端的訪問權限設置。參數具體說明見后文。
    • nfs權限(共享權限)
    • 本地文件系統權限,掛載目錄的權限
客戶端地址 具體地址 說明
授權單一客戶端訪問NFS 10.0.0.30 一般情況,生產環境中此配置不多
授權整個網段可訪問NFS 10.0.0.0/24 其中的24等同於255.255.255.0,指定網段生產環境中常見的配置。配置簡單,維護方便
授權整個網段可訪問NFS 10.0.0.* 指定網段的另外寫法(不推薦使用)
授權某個域名客戶端訪問 nfs.chensiqiedu.com 此方法生產環境中一般不常用
授權整個余名客戶端訪問 *.chensiqiedu.com 此方法生產環境中一般不常用

1.10 exports配置文件相關參數應用領域的詳細解釋 (NFS精華重點)

1)(rw,sync) :可讀可寫,同步傳輸
2)(ro,async):只讀,異步傳輸。

詳細說明
rw或者ro,主要控制的是所有客戶端用戶(包含root)的讀寫權限。如果設置成ro,就算root也只有讀權限。它是NFS權限設置的第一道總閘閥門。
sync:同步傳輸,實時進行。
async:異步傳輸:攢一會在傳輸。

3)root_squash:將root賬戶在共享目錄里的身份降低為匿名者(默認nfsnobody)身份
4)no_root_squash:不降低root賬戶在共享目錄的身份,身份還是root
5)all_squash:將所有訪問用戶在共享目錄里的身份都降低為匿名者(默認nfsnobody)身份

詳細說明:

  • 匿名者身份默認情況下就是NFS服務器端的虛擬賬戶角色,也就是nfsnobody。這是最低的身份,所有NFS客戶端共享目錄的訪問者都被附加了這個身份,這也就意味者,如果文件的屬主屬組是nfsnobody的話,所有訪問者對該文件都擁有全部所有權。
  • 所謂身份並不是訪問權限,而是用戶在共享目錄里創建的文件的屬主和屬組。
  • 一旦身份被降低那么在共享目錄里創建的文件的屬主和屬組就是變成了默認情況下的nfsnobody。這也就意味着,權限系統對你所創建的文件不做任何保護(任何訪問者都可以查看,修改,刪除)
  • [x] 所謂root_squash:
    • 使用這個參數意味着root在共享目錄里創建的任何文件都不受保護,任何人(所有用戶)都可以讀取,修改,刪除)。
    • 而非root用戶則不降低權限,在共享目錄里創建的文件的屬主和屬組統一為nobody(身份隱藏了),這種情況下,所有普通用戶之間只能互相查看文件,並不能任意修改和刪除並且你還無法知道是誰創建的文件,每個普通用戶只能修改或刪除自己創建的文件。
    • root用戶雖然被降低了身份,但是並沒有降低他的管理者權限,也就是說它仍舊能對所有共享目錄里的所有文件進行查看,修改,刪除操作。
    • 如果這類參數默認為空的話,那么NFS將默認使用這個參數。
  • [x] 所謂no_root_squash:
    • 使用這個參數意味着不對root進行降低身份的操作,也就是說root在共享目錄里創建的文件的屬主屬組仍舊為root(不能被普通用戶修改和刪除)。
    • 非root用戶同root_squash一樣,並不降低權限。
  • [x] 所謂all_squash:
    • 使用這個參數意味着對所有訪問NFS共享目錄的用戶進行降低身份的操作。也就是說,所有用戶只要在共享目錄里創建文件,那么文件的屬主屬組就是默認情況下的nfsnobody。
    • 在這個模式下,任何nfs客戶端的任何訪問用戶都可以對共享目錄里的任何文件進行查看,修改,刪除操作

6)anonuid和anongid:指定NFS虛擬賬戶的uid或gid

  • 這兩個參數主要用來修改NFS默認的虛擬賬戶nfsnobody。可以通過指定虛擬賬戶的uid和gid的方式修改默認的虛擬賬戶的賬戶名稱和所屬組。

第二章 NFS企業級優化

2.1 NFS配置文件優化

1)NFS客戶端掛載后,往共享目錄寫入數據時卡住了
2)NFS服務端,重啟restart服務,客戶端如果寫入數據卡住了。

解答:
1,nfs服務端重啟之后,共享文件夾進入grace time(無敵時間)
2,客戶端在服務端重啟后寫入數據大概要等90秒
3,nfs配置文件:/etc/sysconfig/nfs

[root@backup ~]# sed -n '45,55p' /etc/sysconfig/nfs # When there are no active clients, changing these values # can be done in a single server restart. # #NFSD_V4_GRACE=90 # 無敵時間 #NFSD_V4_LEASE=90 # 無敵時間 #NLM_GRACE_PERIOD=90 # 無敵時間 # # # # Optional arguments passed to rpc.mountd. See rpc.mountd(8) #RPCMOUNTDOPTS="" #說明: NFSD_V4_GRACE=90 <===>/proc/fs/nfsd/nfsv4gracetime NFSD_V4_LEASE=90 <===>/proc/fs/nfsd/nfsv4leasetime NLM_GRACE_PERIOD=90 <===>/proc/fs/nfsd/nfsv4recoverydir 這三條是控制無敵時間的,去掉#直接修改時間即可,改后別忘了重啟服務。一旦啟用了這三條,/proc臨時目錄下便會生成對應的臨時文件

2.2 NFS客戶端mount掛載深入

在NFS服務端可以通過cat /var/lib/nfs/etab 查看服務端配置參數的細節。在NFS客戶端可以通過cat /proc/mounts查看mount的掛載參數細節。

2.2.1 mount掛載說明

通過如下命令在NFS客戶端測試掛載獲取的默認掛載參數:

[root@backup ~]# grep mnt /proc/mounts nfs01:/data/ /mnt nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.41,minorversion=0,local_lock=none,addr=172.16.1.31 0 0

NFS Client mount 掛載參數列表

mount參數 參數功能 默認參數
fg;bg 當客戶端掛載時,可以選擇前台fg掛載或者后台bg掛載,后台掛載不影響前台其他操作,如果網絡不穩建議bg比較妥當 fg
soft;hard soft短掛載,當timeout出現時可能會造成資料丟失,不建議使用 hard
intr 當使用hard掛載的資源timeout后,若有指定intr參數,可以在timeout后把它中斷掉,這避免出問題時系統整個被NFS鎖死,建議使用intr
proto=udp 使用UDP協議來傳輸資料,在LAN中會有比較好的性能。若要跨越Internet的話,使用pro=tcp多傳輸的數據會有比較好的糾錯能力 proto=tcp

mount -o參數對應的選項:

|參數|參數意義|系統默認值|
|suid;nosuid|當掛載的文件系統上有任何SUID的程序時,只要使用nosuid就能夠取消設置SUID的功能。|suid|
|--|--|--|
|rw;ro|可以指定文件系統是只讀(ro)或可寫(rw)|rw|
|dev;nodev|是否可以保留裝置文件的特殊功能?一般來說只有/dev才會有特殊的裝置,因此可以選擇nodev|dev|
|exec;noexec|是否具有執行文件的權限?如果想要掛載的僅是普通資源數據區(例如:圖片,附件),那么可以選擇noexec|exec|
|user;nouser|是否允許用戶進行文件的掛載與卸載功能?如果要保護文件系統,最好不要提供用戶進行掛載與卸載|nouser|
|auto;noauto|這個auto指的是“mount -a”時會不會被卸載的項目,如果不需要這個分區隨時被掛載,可以設置為noauto|auto|

2.3 NFS 客戶端mount掛載優化

某網友問:在企業生產環境中,NFS客戶端掛載有沒有必須要加的參數,比如,加noexec,nosuid,nodev,bg,soft,rsize,wsize等參數。

解答:
這個問題屬於mount掛載優化內容(有些參數也適合其他文件系統),一般來說要適當加掛載參數,但是,最好是先做好測試,用數據來說話,才能更好的確定到底是掛載還是不掛載。

2.3.1 有關系統安全掛載參數選項

在企業工作場景,一般來說,NFS服務器共享的只是普通靜態數據(圖片,附件,視頻),不需要執行suid,exec等權限,掛載的這個文件系統只能作為數據存取之用,無法執行程序,對於客戶端來講增加了安全性,例如:很多木馬篡改站點文件都是由上傳入口上傳的程序到存儲目錄,然后執行的。

因此在掛載的時候,用下面的命令很有必要:

mount -t nfs -o nosuid,noexec,nodev,rw 172.16.1.31:/data /mnt

2.3.2 mount掛載性能優化參數選項

下面介紹幾個在企業生產環境下,NFS性能優化掛載的例子。
1)禁止更新目錄及文件時間戳掛載,命令如下:

mount -t nfs -o noatime,nodiratime 172.16.1.31:/data /mnt

2)安全加優化的掛載方式如下:

mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 172.16.1.31:/data /mnt

3)默認的掛載方式如下:

mount -t nfs 172.16.1.31:/data /mnt

如果是本地文件系統,使用如下命令:

mount /dev/sdb1 /mnt -o defaults,async,noatime,data=writeback,barrier=0

注意:
如果本地文件系統掛載時,如果加入nodiratime會報錯

2.3.3 NFS網絡文件系統優化掛載的參數建議

在CentOS6.5 6.6 6.8等服務器端和客戶端環境下,可使用如下命令參數:

mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev,rsize=131072 172.16.1.31:/data /mnt

經過實際測試,CentOS6.6 6.8默認的掛載參數性能還是不錯的。

mount -t nfs 172.16.1.31:/data /mnt

注意:非性能的參數越多,速度可能會變慢

2.3.4 NFS內核優化建議

下面是優化選項說明:

  • [x] /proc/sys/net/core/rmem_default:該文件指定了接收套接字緩沖區大小的默認值(以字節為單位),默認設置:124928 建議:8388608
  • [x] /proc/sys/net/core/rmem_max:該文件指定了接收套接字緩沖區大小的最大值(以字節為單位) 建議:16777216
  • [x] /proc/sys/net/core/wmem_default:該文件指定了發送套接字緩沖區大小的默認值(以字節為單位),默認設置:124928 建議:8388608
  • [x] /proc/sys/net/core/wmem_max:該文件指定了發送套接字緩沖區大小的最大值(以字節為單位)。默認設置:124928. 建議:16777216

2.4 NFS系統應用的優缺點說明

NFS服務可以讓不同的客戶端掛載使用同一個共享目錄,也就是將其作為共享存儲使用,這樣可以保證不同節點客戶端數據的一致性,在集群架構環境中經常會用到。如果是windows和Linux混合環境的集群系統,可以用samba來實現。

優點:

  • [x] 簡單,容易上手,容易掌握
  • [x] NFS 文件系統內數據是在文件系統之上的,即數據是能看得見的。
  • [x] 部署快速,維護簡單方便,且可控,滿足需求的就是最好的。
  • [x] 可靠,從軟件層面上看,數據可靠性高,經久耐用。數據是在文件系統之上的。
  • [x] 服務非常穩定

局限:

  • [ ] 存在單點故障,如果NFS Server宕機了,所有客戶端都不能訪問共享目錄。這個需要負載均衡及高可用來彌補
  • [ ] 在大數據高並發的場合,NFS效率,性能有限(2千萬/日以下PV(page view)的網站不是瓶頸,除非網站架構設計太差。)
  • [ ] 客戶端認證是基於IP和主機名的,權限要根據ID識別,安全性一般(用於內網則問題不大)。
  • [ ] NFS數據是明文的,NFS本身不對數據完整性做驗證。
  • [ ] 多台客戶機器掛載一個NFS服務器時,連接管理維護麻煩(耦合度高)。尤其NFS服務端出問題后,所有NFS客戶端都處於掛掉狀態(測試環境可使用autofs自動掛載解決,正式環境可修復NFS服務或強制卸載)
  • [ ] 涉及了同步(實時等待)和異步(解耦)的概念,NFS服務端和客戶端相對來說就是耦合度有些高。網站程序也是一樣,盡量不要耦合度太高,系統及程序架構師的重要職責就是為程序及架構解耦,讓網站的擴展性變得更好。

應用建議:

大中小型網站(參考點2000萬/日PV以下)線上應用,都有用武之地。門戶站也會有應用,生產場景應該多把數據的訪問往前推,即盡量把靜態存儲里的資源通過CDN或緩存服務器提供服務,如果沒有緩存服務或架構不好,存儲服務器數量再多也是扛不住壓力的,而且用戶體驗會很差。

附錄1 【nfs掛載加入fstab案例】

NFS客戶端實現fstab開機自啟動掛載

現象:nfs開機掛載卸載了/etc/fstab中,結果無法開機自動掛載nfs

解答:
1,nfs客戶對岸掛載命令放在/etc/rc.local實現自動掛載
2,開機自啟動netfs服務,然后才能實現fstab的開機自動掛載nfs文件系統(linux開機時在加載網絡之前就會加載/etc/fstab)

附錄2 fstab誤操作導致無法開機

1,fstab文件被錯誤修改,導致在開機啟動linux時候出現錯誤,提示讓你恢復系統設置。

1)開機時出現錯誤提示
QQ20170309-123612@2x.png-57.1kB

2)輸入root用戶密碼后,進入到用戶操作界面
屏幕快照 2017-03-09 下午12.37.37.png-25.7kB

3)打開vim /etc/fstab 文件,我們發現fstab文件是只讀的。也就是說目前只能看不能改。
QQ20170309-123946@2x.png-64.4kB

4)退出/etc/fstab。在命令行輸入命令

mount -o remount,rw / 的意思是將整個根目錄已可讀可寫rw的方式重新掛載一邊remount

5)我們再打開/etc/fstab 就會發現只讀模式沒了

屏幕快照 2017-03-09 下午12.42.37.png-73.1kB

6)趕緊修改fstab然后重啟服務器。

2,光盤救援模式恢復(用linux光盤修復系統)
1)調整開機bios設置光盤啟動,然后掛載光盤

屏幕快照 2017-03-09 下午12.52.20.png-23.7kB

2)重啟系統,進入光盤救援模式

屏幕快照 2017-03-09 下午12.52.28.png-437.3kB

3)一路回車,不加在網絡模式
屏幕快照 2017-03-09 下午12.55.41.png-20.9kB

4)一路回車,選擇第一個
屏幕快照 2017-03-09 下午1.02.02.png-21.4kB

進入這個頁面
屏幕快照 2017-03-09 下午1.02.16.png-10.7kB

5)輸入命令

QQ20170309-130540@2x.png-64.8kB

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM