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.3 NFS儲存服務的優缺點
優點:配置 安裝簡單
缺點:沒有認證功能 分散式儲存/ftp/samba
無法支援高併發儲存 日PV 2000萬
無法實現高可用 分散式儲存/keepalived
1.4 實現Windows與linux檔案資料共享
(1)FTP服務部署
(2)samba服務部署(可以讓Windows與linux同時訪問)
1.5 NFS網路檔案共享系統由來
1.6 NFS網路檔案系統工作方式(儲存原理)
(1)在nfs服務端建立共享目錄
(2)通過mount 網路掛載,將NFS服務端共享目錄掛載到NFS客戶端本地目錄上。
(3)NFS客戶端掛載目錄上建立、刪除、檢視資料操作,等價於在服務端進行建立、刪除、檢視資料操作。
1.7 NFS儲存檔案系統中兩個重要服務
1.7.1 RPC服務工作原理
因為NFS的各項功能都需要向RPC服務(rpcbind服務)註冊,所以只有RPC服務才能獲取到NFS服務的各項功能對應的埠號(port number)、PID、NFS在主機所監聽的IP等資訊,而NFS客戶端也只能通過向RPC服務詢問才能找到正確的端□。也就是說,NFS需要有RPC服務的協助才能成功對外提供服務。
1.7.2 NFS工作流程
1.7.3 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.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