NFS儲存服務及部署

昨夜、星辰發表於2019-07-20

1 NFS簡介

1.1 什麼是NFS

NFS=Network File System=網路檔案系統。
主要功能是通過網路(一般是區域網)讓不同的主機系統之間可以共享檔案或目錄。
NFS客戶端(一般為應用伺服器,例如web)可以通過掛載(mount)的方式將NFS伺服器端共享的資料目錄掛載到NFS客戶端本地系統中(就是某一個掛載點下)。從客戶端本地看,NFS伺服器端共享的目錄就好像是客戶端自己的磁碟分割槽或者目錄一樣,而實際上卻是遠端的NFS伺服器的目錄。
分散式檔案系統:Moosefs(mfs)、GlusterFS、FastDFS(推薦)
NFS屬於本地檔案儲存服務。
NFS主要用於儲存web伺服器上使用者上傳的資料資訊,圖片 附件 頭像 視訊 音訊。

1.2 NFS儲存服務價值

(1)可以實現資料統一共享儲存
(2)節省架構服務運營成本

1.3 NFS儲存服務的優缺點

優點:配置 安裝簡單
缺點:沒有認證功能        分散式儲存/ftp/samba
         無法支援高併發儲存  日PV 2000萬
   無法實現高可用      分散式儲存/keepalived

1.4 實現Windows與linux檔案資料共享

(1)FTP服務部署
(2)samba服務部署(可以讓Windows與linux同時訪問)

1.5 NFS網路檔案共享系統由來

111.png
可以實現資料共享,資料統一一致,節省架構服務運營成本

1.6 NFS網路檔案系統工作方式(儲存原理)

(1)在nfs服務端建立共享目錄
(2)通過mount 網路掛載,將NFS服務端共享目錄掛載到NFS客戶端本地目錄上。
(3)NFS客戶端掛載目錄上建立、刪除、檢視資料操作,等價於在服務端進行建立、刪除、檢視資料操作。
1.png

1.7 NFS儲存檔案系統中兩個重要服務

1 RPC服務    2 NFS服務

1.7.1 RPC服務工作原理

nfs1.pngnfs2.png

因為NFS的各項功能都需要向RPC服務(rpcbind服務)註冊,所以只有RPC服務才能獲取到NFS服務的各項功能對應的埠號(port number)、PID、NFS在主機所監聽的IP等資訊,而NFS客戶端也只能通過向RPC服務詢問才能找到正確的端□。也就是說,NFS需要有RPC服務的協助才能成功對外提供服務。

1.7.2 NFS工作流程

NFS流程圖.jpg

1.7.3 NFS詳細訪問流程

NFS儲存服務及部署
當訪問程式通過NFS客戶端向NFS伺服器存取檔案時,其請求資料流程大致如下:
(1)首先使用者訪間網站程式,由程式在NFS客戶端上發出存取NFS檔案的請求,這時NFS客戶端(即執行程式的伺服器)的RPC服務(rpcbind服務)就會通過網路向NFS伺服器端的RPC服務(rpcbind服務)的111埠發出NFS檔案存取功能的詢間請求.
(2)NFS伺服器端的RPC服務(rpcbind服務)找到對應的已註冊的NFS埠後,通知NFS客戶端的RPC服務。l
(3)此時NFS客戶端獲取到正確的埠,並與NFS daemon聯機存取資料
(4)NFS客戶端把資料存取成功後,返回給前端訪間程式,告知使用者存取結果,作為網站使用者,就完成了一次存取操作。

2 NFS儲存服務部署

RPC 遠端過程呼叫程式。先啟動PRC服務,然後在啟動NFS。

2.1 服務端部署 

2.1.1 安裝軟體程式

yum install -y nfs-utils rpcbind
rpm -qa nfs-utils 
rpm -qa rpcbind

2.1.2 編寫配置檔案

vim /etc/exports    #進入配置檔案
/data 172.16.1.0/24(rw,sync)    #寫入命令
# /data 可以進行共享儲存目錄
# 172.16.1.0/24(rw,sync)    允許儲存資料網段資訊(儲存目錄許可權配置 儲存資料方式配置)

sync=同步方式儲存資料:使用者有資料儲存  ----  儲存伺服器(磁碟中)           儲存安全性高
async=非同步方式儲存資料:使用者有資料儲存  ----  記憶體 --- 儲存伺服器(磁碟中)  儲存效率高

2.1.3 建立目錄,對目錄進行授權

mkdir /data
chown nfsnobody.nfsnobody /data

2.1.4 啟動服務程式

systemctl start rpcbind
systemctl reload rpcbind    #重啟rpcbind  平滑重啟
systemctl enable rpcbind
systemctl start nfs
systemctl reload nfs            #重啟nfs
systemctl enable nfs
### restart:將所有連線會話都會直接斷開
### reload:  只會將沒有資料傳輸連結斷開,重新建立連線,讓使用者訪問感受更好

2.2 客戶端部署

2.2.1 安裝相關軟體

yum install -y nfs-utils

2.2.2 進行儲存目錄掛載

mount -t nfs  172.16.1.31:/data  /mnt

2.2.3 進行測試

客戶端建立檔案:
[root@web01 mnt]#ls
[root@web01 mnt]#touch test.txt
[root@web01 mnt]#ls
test.txt
服務端同步檔案:
[root@nfs01 data]#ls
[root@nfs01 data]#ls
test.txt
服務端與客戶端檔案同步,則測試成功。

3 儲存服務配置檔案編寫格式

3.1 配置檔案exports引數

ro 只讀配置,使儲存目錄許可權位只讀,使開發人員只能看
rw 讀寫許可權
sync 同步儲存資料
async 非同步儲存資料
all_squash 不論什麼使用者包括root,都對映為指定nfsnobody使用者
no_all_squash  對普通使用者不做對映,無許可權。root使用者對映為nfsnobody
root_squash  將root使用者對映為指定nfsnobody使用者,普通使用者無許可權
no_root_squash 將root使用者不做對映,普通使用者無許可權
anonuid 指定uid,指定對映成什麼使用者
anongid 指定gid,指定對映成什麼使用者

在企業中,一般選用no_all_squash,root_squash。

3.1.1 all_squash對映實踐

第一步:服務端修改服務配置檔案

vim /etc/exports
/data  172.16.1.0/24(rw,sync,all_squash)
systemctl reload nfs 

第二步:客戶端上傳資料測試

[root@web01 mnt]#touch test.txt
[root@web01 mnt]#ll test.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Jul 16 20:57 test.txt

3.1.2 no_all_squash對映實踐

第一步:服務端修改服務配置檔案

vim /etc/exports
/data  172.16.1.0/24(rw,sync,no_all_squash)
systemctl reload nfs 

第二步:客戶端上傳資料測試

[root@web01 mnt]# touch aaa.txt
[root@web01 mnt]# ll
-rw-rw-r-- 1     1017     1017  0 Jul 16 12:08 aaa.txt
### 使用者傳輸資料身份沒有變化,看使用者uid資訊

3.1.3 root_squash對映實踐

第一步:服務端修改服務配置檔案

vim /etc/exports
/data  172.16.1.0/24(rw,sync,root_squash)
systemctl reload nfs 

第二步:客戶端上傳資料測試

[root@web01 mnt]# touch bbb.txt
[root@web01 mnt]# ll
-rw-r--r-- 1 nfsnobody nfsnobody  0 Jul 16 12:19 bbb.txt
### root使用者會對映為指定的nfsnobody使用者

3.1.4 no_root_squash對映實踐

第一步:服務端修改服務配置檔案

vim /etc/exports
/data  172.16.1.0/24(rw,sync,no_root_squash)
systemctl reload nfs 

第二步:客戶端上傳資料測試

[root@web01 mnt]# touch ccc.txt
[root@web01 mnt]# ll
-rw-r--r-- 1 root      root       0 Jul 16 12:22 ccc.txt
### 將root使用者不做對映

3.2 NFS客戶端對映原理圖

3_看圖王.png

3.2.1 對映原理練習題

要求服務端:
/data/w   可讀可寫許可權,所有使用者都做對映,  採用同步傳輸資料
/data/r   只能讀取資料,只有root使用者組對映,採用非同步傳輸資料
要求客戶端:
backup   /data/w  --掛載點 /data/w   可以儲存資料  
web01    /data/r  --掛載點 /data/r   不能儲存資料
解決服務端:
(1)編寫配置檔案

vi /etc/exports
/data/w  172.16.1.0/24(rw,sync,all_squash)
/data/r  172.16.1.0/24(ro,async,root_squash)

(2)建立共享儲存目錄

web01:
mkdir /data/r
chown nfsnobody.nfsnobody /data/r
backup:
mkdir /data/w
chown nfsnobody.nfsnobody /data/w

(3)重啟儲存服務

systemctl reload nfs

解決客戶端:
(1)建立掛載點目錄

web01:mkdir /data/r
backup:mkdir /data/w

(2)進行掛載

web01
mount -t nfs 172.16.1.31:/data/r  /data/r
backup
mount -t nfs 172.16.1.31:/data/w  /data/w

(3)驗證成功

[root@web01 r]#touch hh.txt
touch: cannot touch ‘hh.txt’: Read-only file system ### 只讀許可權,所以出現這種情況才是正常
[root@backup w]#touch kk.txt        ### 讀寫許可權,所以能建立
[root@backup w]#ls
kk.txt

3.3 影響NFS服務儲存許可權原因

(1)服務端配置檔案引數    exports檔案裡ro/rw引數
(2)服務端本身目錄許可權  
(3)服務端共享目錄許可權存在繼承關係    例如:/data,/data/r
   PS:建議設定共享目錄時,不要存在父級與子級關係
(4)客戶端掛載引數是否為 ro

4 NFS掛載常見問題

4.1 異常問題一

ls: cannot open directory .: Stale file handle  (檔案控制程式碼錯誤)
出現原因: 當父級和子級目錄同時進行掛載時,一旦父級目錄取消共享,但是客戶端還是處於掛載狀態
問題解決: 將和父級目錄有關的所有掛載點全部解除安裝,重新掛載

4.2 異常問題二

Cannot register service: RPC: Unable to receive;
出現原因: 服務啟動順序不正確
問題解決: 關閉所有服務,按順序進行啟動

4.3 異常問題三

出現掛載卡死情況
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
出現原因: 服務端開啟防火牆,阻止客戶端訪問
問題解決: 關閉防火牆

4.4 異常問題四

服務端採用restart情況,會有一個90s延遲;造成客戶端掛載好共享目錄,90s內無法儲存資料
出現原因:
cat /etc/sysconfig/nfs|grep 90
#NFSD_V4_GRACE=90
#NFSD_V4_LEASE=90

4.5 NFS儲存排錯原理

4.5.1 檢查服務端服務是否啟動

4.5.2 檢查NFS服務是否向RPC服務註冊

 未註冊情況

[root@nfs01 ~]# rpcinfo -p localhost
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

已經進行註冊

[root@nfs01 ~]# rpcinfo -p localhost
program vers proto   port  service     
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
100005    1   udp  20048  mountd
100005    1   tcp  20048  mountd
100005    2   udp  20048  mountd
100005    2   tcp  20048  mountd
100005    3   udp  20048  mountd
100005    3   tcp  20048  mountd
100003    3   tcp   2049  nfs
100003    4   tcp   2049  nfs
100227    3   tcp   2049  nfs_acl
100003    3   udp   2049  nfs
100003    4   udp   2049  nfs
100227    3   udp   2049  nfs_acl
服務關閉在開啟,有些埠會發生改變
100021    1   udp  60318  nlockmgr
100021    3   udp  60318  nlockmgr
100021    4   udp  60318  nlockmgr
100021    1   tcp  32828  nlockmgr
100021    3   tcp  32828  nlockmgr
100021    4   tcp  32828  nlockmgr

4.5.3 檢查NFS服務是否存在共享目錄

命令:showmount -e  172.16.1.31    NFS沒有安裝,不能使用showmount

[root@nfs01 data]#showmount -e  172.16.1.31
Export list for 172.16.1.31:
/data/r 172.16.1.0/24
/data/w 172.16.1.0/24

4.6 NFS服務相關重要檔案命令

/etc/exports    #配置檔案
/var/lib/nfs/etab   #記錄nfs服務預設配置引數資訊
rpcinfo -p 172.16.1.31  #檢查nfs是否向rpc註冊
showmount -e 172.16.1.31    #檢查nfs服務是否存在共享目錄
/usr/sbin/exportfs  #可以平滑重啟nfs服務,可以臨時設定共享儲存目錄
平滑重啟服務:exportfs -rv
臨時建立目錄:exportfs -o rw,sync  192.168.232.0/24:/data01

4.7 NFS服務客戶端掛載

4.7.1 如何進行掛載

mount -t nfs 172.16.1.31:/data  /mnt

4.7.2 如何開機掛載

方法一:vi /etc/rc.local 
mount -t nfs 172.16.1.31:/data  /mnt
方法二:vi /etc/fstab檔案
172.16.1.31:/data   /mnt    nfs  defaults   0 0

centos6  
啟動系統 -- 載入fstab -- 啟動network網路服務 -- netfs(在系統啟動完畢之後,再次載入fstab)
centos7
啟動系統 -- 載入fstab -- 啟動network網路服務 -- remote-fs.target(在系統啟動完畢之後,再次載入fstab)

4.7.3 啟動nfs服務客戶端很慢

出現原因:在客戶端上配置自動nfs服務掛載   --- 耦合度太高
解決問題:
(1)取消自動掛載
(2)啟動順序 先開啟後端服務(nfs mysql backup 快取服務)  在開啟前端服務(web服務 負載均衡服務)

4.7.4 掛載引數說明

rw 讓掛載點目錄具有可讀可寫許可權   相反ro
suid=setuid 讓掛載點目錄中的檔案特殊許可權位生效    相反nosuid  安全
dev 讓掛載點目錄儲存裝置檔案保持屬性不變
exec 讓掛載點目錄中的執行檔案可以執行   相反noexec
auto(mount -a) 讓掛載點目錄實現快速自動掛載  相反noauto
nouser 讓普通使用者是否可以解除安裝和掛載目錄   相反user
async 資料非同步儲存概念,相反sync同步儲存
noatime 訪問檔案時不更新檔案的inode時間戳,高併發環境下,推薦顯示應用該選項,可以提高系統I/O效能。效能優化
nodiratime 不更新檔案系統上的directory inode時間戳,高併發環境,推薦顯式應用該選項,可以提高系統I/O效能。效能優化
remount 在不進行解除安裝掛載點時,直接重新掛載修改掛載引數
檔案系統只讀:mount -o remount,rw / 解決
rsize=262144 設定一個快取區 262144位元組  設定大小和記憶體有關  
使用者 (讀取) --- web01 /data  2M --- nfs /data 10M 壓力大   
wsize=262144 設定一個緩衝區 262144位元組
使用者(儲存)  --- web01 /data 10M --- nfs /data 10M 壓力大
hard  當服務端處於關閉狀態,客戶端會處於一直掛載
soft  當服務端處於關閉狀態,不會一直掛載 
proto=tcp  掛載協議

客戶端重要檔案:/proc/mounts  --- 檢視到mount掛載命令預設引數資訊
強行進行解除安裝:umount -lf

4 補充:下載軟體出現異常

(1)更新yum源
(2)利用rpm安裝軟體 獲得rpcbind軟體包

vim /etc/yum.conf  
cachedir=/var/cache/yum/$basearch/$releasever   --- 下載軟體儲存路徑
keepcache=1                                     --- 下載軟體保留下來,不要被刪除
rpm -ivh  rpcbind-0.2.0-47.el7.x86_64.rpm.rpm       --- 安裝rpcbind

相關文章