第1章 NFS介紹 1.1 NFS的概念 NFS是Network File System的縮寫,即網路文件系統,它的主要功能是通過網路(一般是區域網)讓不同的主機系統之間可以共用文件或目錄。NFS客戶端(一般為應用伺服器如web)可以通過mount掛載的方式將NFS伺服器端共用的數據目錄掛載到NFS ...
第1章 NFS介紹
1.1 NFS的概念
NFS是Network File System的縮寫,即網路文件系統,它的主要功能是通過網路(一般是區域網)讓不同的主機系統之間可以共用文件或目錄。NFS客戶端(一般為應用伺服器如web)可以通過mount掛載的方式將NFS伺服器端共用的數據目錄掛載到NFS客戶端本地系統中(就是某一個掛載點下)
1.2 NFS在企業中的應用場景
在企業集群架構的工作場景中,NFS網路文件系統一般被用來存儲共用視頻、圖片、附件等靜態資源文件,通常網站用戶上傳的文件都會放到NFS共用里,然後前端所有的節點訪問這些靜態資源時都會讀取NFS存儲上的資源
1.2.1 NFS文件系統存在的作用
01. 實現數據信息的共用
02. 實現數據信息的一致
1.2.2 共用存儲的實現方式
1.硬體實現共用存儲
IBM(伺服器 小型機 大型機 存儲 DS V7000 V5000) Oracle EMC ==>去IOE
2.軟體實現共用存儲
本地文件系統NFS 分散式文件系統mfs FTP samba
說明:互聯網領域發展過程詳細瞭解(浪潮之巔)
1.3 NFS共用系統原理
01. 在NFS伺服器端創建一個共用目錄/video
02. 通過mount網路掛載,將這個共用目錄/video掛載到客戶端本地掛載點(不同客戶端的掛載點可以不相同)
03. 客戶端掛載完畢後,進入NFS客戶端掛載點所在的目錄就可以看到NFS伺服器端/video共用出來的目錄下的所有數據。在客戶端的掛載目錄上進行創建/刪除/查看數據操作時,就相當於在伺服器進行的創建/刪除/查看操作
顯示本地共用伺服器掛載的基本信息
1 [root@nfs01 ~]# df -h 2 3 Filesystem Size Used Avail Use% Mounted on 4 5 /dev/sda3 6.9G 1.6G 5.0G 24% / 6 7 tmpfs 491M 0 491M 0% /dev/shm 8 9 /dev/sda1 190M 33M 147M 19% /boot 10 11 172.16.1.31:/data 6.9G 1.6G 5.0G 24% /mnt #使用率到達99%時擴容對端NFS
說明:mount -t 指定掛載類型 源 目標
mount -t nfs 172.16.1.31:/data /mnt
1.4 RPC遠程過程調用
1.4.2 NFS工作流程原理
1.4.2.1 服務端三部曲
01.啟動RPC服務/etc/init.d/rpcbind start
02.啟動NFS服務/etc/init.d/nfs start
03.NFS服務會向RPC服務註冊啟動的埠信息(只能註冊一次,要想註冊第二次要重啟NFS服務)
1.4.2.2 客戶端三部曲
01.啟動RPC服務/etc/init.d/rpcbind start,通過TCP/IP和服務端的RPC服務建立連接
02.通過mount進行掛載,將遠程磁碟目錄掛載到本地
03.通過客戶端RPC服務向服務端RPC服務請求NFS服務埠信息,根據不同的進程和埠進行應用NFS服務
1.5 NFS服務網路文件共用RPC服務
由於NFS支持的功能很多,當NFS啟動時會出現多個進程,網路服務又會自動生成一些隨機的埠信息。NFS的隨機埠造成了客戶端與服務端的通信障礙,因為NFS客戶端必須要知道NFS伺服器端的數據傳輸埠才能進行通信,這時就生成了RPC遠程調用服務
當RPC啟動時會記錄每個NFS功能所對應的埠信息,由RPC服務提供用戶訪問,並且在NFS客戶端請求時將該埠和功能對應的信息傳遞給請求數據的NFS客戶端,從而確保客戶端可以連接到正確的NFS埠,達到實現數據傳輸交互數據目的
第2章 NFS伺服器端部署環境準備
2.1 NFS服務端部署
伺服器系統 |
角色 |
IP |
Centos6.9x86_64 |
NFS客戶端(web-client) |
10.0.0.7 |
Centos6.9x86_64 |
NFS伺服器端(nfs-server) |
10.0.0.8 |
Centos6.9x86_64 |
NFS客戶端(web-client) |
10.0.0.9 |
2.1.1 centos6.x x86_64模擬環境信息
NFS伺服器端操作系統信息及內核版本信息
1 [root@nfs01 ~]# cat /etc/redhat-release 2 3 CentOS release 6.9 (Final) 4 5 [root@nfs01 ~]# uname -r 6 7 2.6.32-696.el6.x86_64 8 9 [root@nfs01 ~]# uname -m 10 11 x86_64
NFS客戶端操作系統信息及內核版本信息如下:
1 [root@web01 ~]# cat /etc/redhat-release 2 3 CentOS release 6.9 (Final) 4 5 [root@web01 ~]# uname -r 6 7 2.6.32-696.el6.x86_64 8 9 [root@web01 ~]# uname -m 10 11 x86_64
2.1.2 檢查NFS RPC服務軟體是否安裝
1 rpm -qa |grep nfs 2 3 rpm -qa |grep rpc
說明:當不知道軟體名字時候,可以用rpm -qa|grep -E "nfs-|rpcbind"來過濾包含在引號內的字元串;預設centos6.x系統沒有安裝nfs和rpc軟體包(centos5預設會安裝)
2.1.3 進行yum安裝nfs與rpc服務軟體
註意:這裡安裝的rpc軟體是rpcbind,centos5.x安裝portmap
1 yum install -y nfs-utils rpcbind
查看已安裝的軟體包里的內容
1 [root@nfs01 ~]# rpm -ql nfs-utils 2 3 /etc/rc.d/init.d/nfs #啟動腳本命令 4 5 /usr/sbin/exportfs #NFS共用服務的管理命令 6 7 /usr/sbin/showmount #查看NFS共用列表信息 8 9 [root@nfs01 ~]# rpm -ql rpcbind 10 11 /etc/rc.d/init.d/rpcbind #啟動腳本命令 12 13 /usr/sbin/rpcinfo #查看NFS註冊信息
查看某個命令/文件屬於哪個大禮包
1 rpm -qf `which ssh`
2.1.4 進行NFS配置文件/etc/exports編寫
NFS服務的預設配置文件路徑為/etc/exports且預設為空
說明:NFS預設配置文件是存在的,但是沒有內容,需要用戶自行配置
1 vim /etc/exports 2 3 #share /data by shine for share at 20171013 4 5 /data 172.16.1.0/24(rw,sync)
第一部分:/data <=指定共用目錄信息
第二部分:172.16.1.0/24 <=指定目標網段,表示允許指定網段主機掛載到本地的共用目錄上
第二部分:(rw,sync) <=定義共用服務相關參數信息
rw表示讀寫,對共用目錄設置的許可權;
sync同步,數據先寫入NFS伺服器記憶體,立刻同步到磁碟中==>即直接寫入到磁碟中
說明:修改/etc/exports後,需執行/etc/init.d/nfs reload平滑重啟或exportfs -rv重新載入NFS配置,不進行重啟NFS
2.1.5 創建共用目錄並更改許可權
1 mkdir -p /data 2 3 chown -R nfsnobody.nfsnobody /data 4 5 ll -d /data
在NFS伺服器端把要共用的NFS目錄賦予NFS預設用戶nfsnobody用戶和用戶組許可權,如果不設置則會導致NFS客戶端無法通過NFS本地共用目錄許可權寫入;當然也可以給NFS伺服器端本地共用目錄777的許可權,但工作中最好不要用,因為777的許可權太大
說明:NFS共用目錄管理用戶這裡為nfsnobody,服務端(個人)沒有創建nfsnobody用戶但仍可以賦予用戶許可權,是由於nfsnobody用戶是在進行nfs軟體的yum安裝時自動創建的
2.1.6 啟動NFS服務
1.首先啟動rpc服務(檢查狀態/etc/init.d/rpcbind status)
1 /etc/init.d/rpcbind start
2.查看NFS向rpc服務註冊的本地埠信息
1 ps -ef |grep rpcbind 2 3 netstat rpcbind 4 5 rpcinfo -p 10.0.0.31 #這時由於NFS還未啟動,所以沒有過多註冊的埠映射信息
3.其次啟動NFS服務
1 /etc/init.d/nfs start 2 3 rpcinfo -p 10.0.0.31 #NFS服務啟動會有很多埠和功能的對應,每次啟動時除了873和2049其他埠均隨機
說明:如果rpcbind服務未啟動,執行命令rpcinfo -p localhost檢查時,會報如下錯誤
rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused
解決辦法:執行/etc/init.d/rpcbind start啟動rpcbind服務即可
2.1.7 檢查NFS服務配置及本地測試掛載
測試掛載結果
1 mount -t nfs 172.16.1.31:/data /mnt #mount -t 掛載類型 要掛載的伺服器:共用目錄 客戶端的掛載點 2 3 df -h #查看掛載後的結果 4 5 #172.16.1.31:/data 8.8G 1.7G 6.7G 20% /mnt 6 7 mount
2.2 NFS客戶端部署(以下步驟均在backup和web01伺服器中執行)
2.2.1 檢查NFS RPC服務軟體是否安裝
1 rpm -qa |grep nfs 2 3 rpm -qa |grep rpcbind
2.2.2 進行yum安裝nfs與rpc服務軟體
1 yum install -y nfs-utils rpcbind
說明:進行同時安裝的操作:在命令行界面右鍵→"發送鍵輸入到所有會話"
nfs-utils和rpcbind軟體安裝後,均不是必須要啟動的,也可以不啟動。但是,軟體必須要安裝
如果nfs/rpc軟體不安裝會造成的問題:
a 客戶端無法使用showmount/rpcinfo命令
b 掛載時客戶端無法識別nfs/rpc文件系統類型
2.2.3 檢查nfs客戶端是否有可以進行共用掛載目錄的包
1 rpm -qf `which showmount`
說明:showmount使用,需要安裝nfs-utils軟體
2.2.4 進行nfs客戶端共用目錄掛載
進行共用目錄掛載
1 mount -t nfs 172.16.1.31:/data /mnt
說明:只要nfs服務端進行修改配置文件重新掛載,客戶端也必須重新進行掛載
2.2.5 進行文件創建/刪除測試檢查
在備份伺服器中,新建oldboy文件
1 [root@web01 ~]# touch /mnt/oldboy.txt 2 3 [root@web01 ~]# rm -f /mnt/oldboy.txt
此時,nfs和web客戶端均能共用到oldboy文件
註意:客戶端測試如果有異常,可以把測試過程轉移到服務端,通過服務端進行測試,便可確認異常問題原因
第3章 NFS深入擴展知識
3.1 NFS服務相關進程說明
1 [root@nfs01 ~]# ps -ef |egrep "rpc|nfs" 2 3 rpc 1185 1 0 20:17 ? 00:00:00 rpcbind <-RPC主進程 4 rpcuser 1207 1 0 20:17 ? 00:00:00 rpc.statd <-檢查數據存儲一致性 5 root 1367 2 0 20:19 ? 00:00:00 [rpciod/0] 6 root 1376 1 0 20:19 ? 00:00:00 rpc.rquotad <-磁碟配額進程(remote quota server) 7 root 1381 1 0 20:19 ? 00:00:00 rpc.mountd <-服務端掛載許可權管理驗證等(NFS mount daemon) 8 root 1388 2 0 20:19 ? 00:00:00 [nfsd4] 9 root 1389 2 0 20:19 ? 00:00:00 [nfsd4_callbacks] 10 root 1390 2 0 20:19 ? 00:00:00 [nfsd] <-NFS主進程daemon 11 root 1391 2 0 20:19 ? 00:00:00 [nfsd] <-NFS主進程 12 root 1392 2 0 20:19 ? 00:00:00 [nfsd] <-NFS主進程,管理登入,ID身份判別等 13 root 1393 2 0 20:19 ? 00:00:00 [nfsd] 14 root 1394 2 0 20:19 ? 00:00:00 [nfsd] 15 root 1395 2 0 20:19 ? 00:00:00 [nfsd] 16 root 1396 2 0 20:19 ? 00:00:00 [nfsd] 17 root 1397 2 0 20:19 ? 00:00:00 [nfsd] <-NFS主進程 18 root 1428 1 0 20:19 ? 00:00:00 rpc.idmapd <-name mapping daemon用戶壓縮/用戶映射 19 root 1432 1305 0 20:19 pts/0 00:00:00 egrep --color=auto rpc|nfs
NFS查看以上進程,可以通過man進程名命令,如man rpcidmapd
3.2 配置NFS服務端開機自啟動
1 [root@nfs01 ~]# chkconfig rpcbind on 2 3 [root@nfs01 ~]# chkconfig nfs on
3.3 NFS服務端配置文件路徑
NFS服務的預設配置文件路徑為/etc/exports且預設為空
1 [root@nfs01 ~]# ls -l /etc/exports 2 3 -rw-r--r-- 1 root root 29 Oct 11 11:13 /etc/exports 4 5 [root@nfs01 ~]# cat /etc/exports
說明:NFS預設配置文件是存在的,但是沒有內容,需要用戶自配
第4章 NFS配置參數許可權說明
4.1 squash參數詳解
rpc.idmapd 名字映射後臺進程
4.2 anonuid、anongid參數詳解
作用:修改映射後的預設用戶信息,預設映射用戶為65534-nfsnobody
4.2.1 實踐操作配置1:修改NFS預設映射用戶(nfsnobody->www)
4.2.1.1 服務端配置
第一個裡程碑-創建映射用戶(服務端與客戶端都創建,且uid和gid保持一致)
說明:因為兩端識別用戶身份並不是依靠用戶名識別的,而是識別uid和gid信息,需要 uid和gid信息來判斷用戶是否一致,不一致則出現拒絕訪問錯誤!
#客戶端和服務端創建用戶www
1 useradd www -u 666 2 3 id www
第二個裡程碑-服務端進行nfs文件配置,修改共用目錄許可權(客戶端不進行修改)
1 [root@nfs01 ~]# vim /etc/exports 2 3 #share /data by root for www at 20171015 4 5 /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
說明:不指定anon參數這裡就以uid為65534的nfsnobody用戶作為預設映射用戶
提示:用戶預設的映射參數為root_squash、no_all_squash,所以配置文件中一定要進行參數設置
第三個裡程碑-修改上級目錄許可權
1 [root@nfs01 ~]# chown -R www.www /data
第四個裡程碑-重啟伺服器
1 [root@nfs01 ~]# /etc/init.d/nfs reload
4.2.1.2 客戶端配置
第一個裡程碑-進行掛載/重新掛載
1 [root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt 2 3 [root@backup ~]# df -h 4 5 Filesystem Size Used Avail Use% Mounted on 6 7 /dev/sda3 8.8G 1.7G 6.7G 20% / 8 9 tmpfs 238M 0 238M 0% /dev/shm 10 11 /dev/sda1 190M 40M 141M 22% /boot 12 13 172.16.1.31:/data 8.8G 1.7G 6.7G 20% /mnt
第二個裡程碑-創建指定www用戶
1 useradd www -u 666 2 3 id www 4 5 uid=666(www) gid=666(www) groups=666(www)
第三個裡程碑-客戶端進行測試
01.測試root用戶映射
1 [root@backup mnt]# touch user_root.txt 2 3 [root@backup mnt]# ll 4 5 total 0 6 7 -rw-r--r-- 1 www www 0 Oct 15 16:25 user_root.txt
02.測試普通用戶映射
#www用戶映射
1 [www@backup mnt]$ touch user_www.txt 2 3 [www@backup mnt]$ ll 4 5 total 0 6 7 -rw-r--r-- 1 www www 0 Oct 15 16:25 user_root.txt 8 9 -rw-rw-r-- 1 www www 0 Oct 15 16:26 user_www.txt
註意:當服務端創建用戶而客戶端不存在此用戶時,客戶端在掛載點下創建目錄,文件用戶屬性出現nobody信息
4.2.2 實踐操作配置2:修改客戶端配置文件進行測試
no_all_squash
1 [oldboy@backup mnt]$ touch user_oldboy.txt 2 3 touch: cannot touch `user_oldboy.txt': Permission denied
root_squash(服務端掛載目錄/data屬主為www,故www用戶仍能掛載)
1 [oldboy@backup mnt]$ touch user_oldboy.txt 2 3 touch: cannot touch `user_oldboy.txt': Permission denied
no_root_squash(root用戶不進行映射,其許可權能創建文件且屬主依然為root)
1 [root@backup mnt]# touch user_root.txt 2 3 [root@backup mnt]# ll 4 5 -rw-r--r-- 1 root root 0 Oct 15 17:06 user_root.txt 6 7 [oldboy@backup mnt]$ touch user_oldboy.txt 8 9 touch: cannot touch `user_oldboy.txt': Permission denied
NFS服務umount命令參數
-l 表示不用離開當前掛載目錄,進行懶惰卸載
-f 表示對掛載的目錄進行強制卸載
第5章 NFS服務企業案例配置實踐
5.1 實例:共用不同的兩個目錄,分別賦予讀和寫的許可權
5.1.1 具體要求
服務端上面要求:nfs伺服器172.16.1.31,共用下麵兩個目錄
/data/w 要求的許可權可讀寫,同步數據,所有用戶都壓縮為匿名用戶
/data/r 要求的許可權為只讀,同步數據,所有用戶都壓縮為匿名用戶
客戶端上面要求 :
backup伺服器 把NFS伺服器的/data/r掛載到backup的/data/r
web01伺服器 把NFS伺服器的/data/w掛載到web01的/data/w
5.1.2 部署過程
5.1.3 第一個裡程碑-卸載並創建目錄環境
1 umount -lf /data
① 服務端創建
1 mkdir /data/{r,w} 2 3 chown -R nfsnobody.nfsnobody /data 4 5 ll -d /data/{r,w}
② 客戶端創建(這裡無需修改許可權)
1 [root@backup ~]# mkdir -p /data/r 2 3 [root@web01 ~]# mkdir -p /data/w
5.1.4 第二個裡程碑-編輯nfs服務端配置文件
1 [root@nfs01 ~]# vim /etc/exports 2 3 #share /data by root at 20171015 4 5 #/data 172.16.1.0/24(rw,sync) 6 7 /data/w 172.16.1.0/24(rw,sync,all_squash) 8 9 /data/r 172.16.1.0/24(ro,sync,all_squash)
5.1.5 第三個裡程碑-重啟nfs
1 [root@nfs01 ~]# /etc/init.d/nfs reload
說明:在配置共用目錄時,需要考慮到子目錄會繼承上一級目錄的許可權,即上一級目錄/data若有rw許可權,/data/r將仍被繼承(ro許可權不起作用),因此應儘量讓共用目錄之間沒有繼承關係,這裡採用註釋/data目錄方法
5.1.6 第四個裡程碑-客戶端進行重新掛載
1 umount -lf /mnt #卸載已掛載目錄 2 3 backup 4 5 [root@backup ~]# mount -t nfs 172.16.1.31:/data/r /data/r/ 6 [root@backup ~]# df -h 7 Filesystem Size Used Avail Use% Mounted on 8 /dev/sda3 8.8G 1.7G 6.7G 20% / 9 tmpfs 238M 0 238M 0% /dev/shm 10 /dev/sda1 190M 40M 141M 22% /boot 11 172.16.1.31:/data/r 8.8G 1.7G 6.7G 20% /data/r 12 13 web01 14 15 [root@web01 ~]# mount -t nfs 172.16.1.31:/data/w /data/w/ 16 [root@web01 ~]# df -h 17 Filesystem Size Used Avail Use% Mounted on 18 /dev/sda3 8.8G 1.7G 6.8G 20% / 19 tmpfs 238M 0 238M 0% /dev/shm 20 /dev/sda1 190M 40M 141M 22% /boot 21 172.16.1.31:/data/w 8.8G 1.7G 6.7G 20% /data/w
5.1.7 第五個裡程碑-進行測試
① 測試讀寫功能
1 [root@web01 ~]# cd /data/w 2 3 [root@web01 w]# touch test01.txt 4 5 [root@web01 w]# ll 6 7 total 0 8 9 -rw-r--r-- 1 nfsnobody nfsnobody 0 Oct 15 2017 test01.txt
② 測試只讀功能
1 [root@backup ~]# cd /data/r 2 3 [root@backup r]# touch test02.txt #創建文件進行測試 4 5 touch: cannot touch ` test02.txt': Read-only file system #提示:不能創建文件,該文件為只讀文件系統
提示:在任何情況下,服務端重啟之後客戶端都必須進行重新掛載,否則就出現如下錯誤
1 [root@backup r]# ll 2 3 ls: cannot open directory .: Stale file handle
第6章 NFS服務的重點知識梳理
6.1 多個NFS客戶端訪問服務端的讀寫文件要具有的許可權
01.NFS伺服器/etc/exports設置需要開放可寫入的許可權,即服務端的共用許可權
02.NFS伺服器實際要共用的NFS目錄許可權具有可寫入w的許可權,即服務端本地目錄的安全許可權
03.每台機器對應存在和NFS預設配置UID的相同UID 65534的nfsnobody用戶(確保所有客戶端的訪問許可權統一,否則每個機器都需要同時建立相同UID的用戶,並覆蓋NFS的預設用戶配置)
只有滿足上述三個條件,多個NFS客戶端才能具有查看/修改/刪除其它任意NFS客戶端上傳文件的許可權,這在大規模的集群環境中作為集群共用存儲時尤為重要
6.2 NFS客戶端掛載命令格式
掛載命令 |
掛載的類型格式 |
指定掛載參數 |
NFS伺服器端提供的共用目錄 |
NFS客戶端的掛載點 |
mount |
-t nfs |
-o ro |
172.16.1.31:/data |
/mnt(必須存在) |
完整版的掛載命令:mount -t nfs 172.16.1.31:/data /mnt,此命令需在客戶端執行 |
6.2.1 NFS共用目錄自動掛載方法
01.將掛載命令放在/etc/rc.local里
偶爾開機掛載不上,工作中除了開機自啟動配置,還要對是否掛載做監控
02.將掛載命令放在/etc/fstab里
1 [root@nfs01 data]# chkconfig netfs on 2 3 [root@nfs01 data]# chkconfig --list netfs 4 5 netfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
註意:生產環境中一般不將其掛載信息寫入fstab中,因為開機啟動時,網路連接不上nfs server的話,可能會導致客戶端主機無法啟動過不了fstab這項,可以將其放到/etc/rc.local中來實現開機自動掛載,但也有可能重啟nfs客戶端後掛載不成功
6.3 NFS服務的優缺點及應用建議
A.優點:
01.簡單,容易上手,容易管理
02.NFS文件系統內數據是在文件系統之上的,即數據是可見的
03.部署快速,維護簡單方便且可控,滿足需求就是最好的
04.可靠,從軟體層面上看,數據可靠性高,經久耐用。數據是在文件系統之上的
05.服務非常穩定
B.局限:
01.存在單點故障,如果NFS Server宕機了,所有客戶端都不能訪問共用目錄,這個在後期會通過負載均衡及高可用方案彌補
02.在大數據高併發的場合,NFS效率、性能有限(2 千萬/日以下PV的網站不是瓶頸,除非網站架構設計太差)
03.客戶端認證是基於IP 和主機名的,許可權要根據ID 識別,無安全認證機制(用於內網則問題不大)
04.NFS數據是明文的,NFS本身不對數據完整性進行驗證
05.多台客戶機掛載一個NFS伺服器時,連接管理維護麻煩(耦合度高)。尤其當NFS伺服器端出問題後所有NFS客戶端都處於掛掉狀態測試環境可使用autofs自動掛載解決,正式環境可修複NFS服務或強制卸載)。
06.涉及了同步(實時等待)和非同步(解耦)的概念,NFS伺服器端和客戶端相對來說就是耦合度有些高。網站程式也是一樣,儘量不要耦合度太高,系統及程式架構師的重要職責就是為程式及架構解耦,讓網站的擴展性變的更好。
C.應用建議:
對於大中小網站(參考點2000萬舊PV以下)線上應用,都有用武之地,門戶網站也會有應用,生產場景應該多將數據的訪問往前推,即儘量將靜態存情里的資源通過CDN 或緩存伺服器提供服務,如果沒有緩存服務或架構不好,存儲伺服器數量再多也是扛不住壓力的,而且用戶體驗會很差。