一、什么是NFS
共享存盤,檔案服務器
1.1 基本概述
NFS是Network File System的縮寫及網路檔案系統,NFS主要功能是通過局域網路讓不同的主機系統之間可以共享檔案或目錄,
NFS系統和Windows網路共享、網路驅動器類似, 只不過windows用于局域網, NFS用于企業集群架構中, 如果是大型網站, 會用到更復雜的分布式檔案系統FastDFS,glusterfs,HDFS,ceph
2.2 為什么使用NFS
- 實作多臺服務器之間資料共享
- 實作多臺服務器之間資料一致
二、NFS應用
2.1 沒有NFS時
- A用戶上傳圖片經過負載均衡,負載均衡將上傳請求調度至WEB1服務器上;
- B用戶訪問A用戶上傳的圖片,此時B用戶被負載均衡調度至WEB2上,因為WEB2上沒有這張圖片,所以B用戶無法看到A用戶傳的圖片;

2.2 如果有NFS
- A用戶上傳圖片無論被負載均衡調度至WEB1還是WEB2, 最終資料都被寫入至共享存盤;
- B用戶訪問A用戶上傳圖片時,無論調度至WEB1還是WEB2,最終都會上共享存盤訪問對應的檔案,這樣就可以訪問到資源;

2.3 NFS原理

- 用戶訪問NFS客戶端,將請求轉化為函式;
- NFS通過TCP/IP連接服務端;
- NFS服務端接收請求,會先呼叫portmap行程進行埠映射;
- Rpc.nfsd行程用于判斷NFS客戶端能否連接服務端;
- Rpc.mount行程用于判斷客戶端對服務端的操作權限;
- 如果通過權限驗證,可以對服務端進行操作,修改或讀取;
rpc.nfsd:它是基本的NFS守護行程,主要功能是管理客戶端是否能夠登錄服務器;
rpc.mount:主要功能是管理NFS的檔案系統,當客戶端順利通過nfsd登錄NFS服務器后,在使用NFS服務器所提供的檔案前,還必須通過檔案使用權限的驗證,它會讀取NFS的組態檔:/etc/exports來對比客戶端權限,
portmap:主要功能是進行埠映射作業,
三、NFS實踐
3.1 環境準備
| 主機 | IP | 角色 |
|---|---|---|
| web01 | 172.16.1.7 | NFS客戶端 |
| NFS | 172.16.1.31 | NFS服務端 |
3.2 服務端(172.16.1.31)
-
關閉防火墻和selinux
[root@nfs ~]# setenforce 0 [root@nfs ~]# systemctl disable --now firewalld -
安裝NFS和rpcbind
[root@nfs ~]# yum install nfs-utils rpcbind -y注意:
Centos6 需要安裝rpcbind
Centos7 默認已經安裝好了rpcbind,并且默認是開機自啟 -
創建共享目錄
[root@nfs ~]# mkdir /data -
配置NFS
#NFS默認的組態檔是:/etc/exports #配置NFS [root@nfs ~]# vim /etc/exports /data 172.16.1.0/24(rw,sync,all_squash)語法 /data 172.16.1.0/24 (rw,sync,all_squash) 含義 NFS服務端共享的目錄 NFS允許連接的客戶端IP網段 允許操作的權限 -
啟動服務(Centos7中啟動)
[root@nfs ~]# systemctl start nfs-server rpcbind -
驗證NFS配置
showmount -e [服務端的地址,默認是本機地址] eg: [root@nfs ~]# showmount -e Export list for nfs: /web/nfsv1 172.16.1.0/20 cat /var/lib/nfs/etab eg: [root@nfs ~]# cat /var/lib/nfs/etab /data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash) -
給掛載點授權
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data
3.3 客戶端(172.16.1.7)
-
關閉防火墻和selinux
[root@nfs ~]# setenforce 0 [root@nfs ~]# systemctl disable --now firewalld -
安裝NFS服務
[root@web01 ~]# yum install -y rpcbind nfs-utils -
查看掛載點
[root@web01 ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 -
創建掛載目錄
[root@web01 opt]# mkdir /backup -
掛載NFS
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /backup/ #驗證掛載 [root@web01 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 18G 1.6G 17G 9% / devtmpfs 476M 0 476M 0% /dev tmpfs 487M 0 487M 0% /dev/shm tmpfs 487M 14M 473M 3% /run tmpfs 487M 0 487M 0% /sys/fs/cgroup /dev/sda1 1014M 127M 888M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 172.16.1.31:/data 18G 1.6G 17G 9% /backup -
測驗NFS檔案同步功能
#創建測驗 [root@web01 backup]# touch 123.txt [root@web01 backup]# ll total 0 -rw-r--r--. 1 nfsnobody nfsnobody 0 Nov 20 09:26 123.txt #服務端查看 [root@nfs ~]# ll /data/ total 0 -rw-r--r-- 1 nfsnobody nfsnobody 0 Nov 20 09:26 123.txt
四、NFS掛載與卸載
NFS客戶端的配置步驟也十分簡單,先使用showmount命令,查詢NFS服務器的遠程共享資訊,其輸出格式為“共享的目錄名稱 允許使用客戶端地址(權限)”,
NFS掛載:客戶端的目錄僅僅是服務端共享目錄的一個入口,可以簡單理解為軟連接,真正的資料全都是存盤在服務端的目錄,客戶端寫入的資料也是在服務端存盤的
4.1 注意事項
- 掛載目錄后,原來檔案下的內容不會丟失,僅僅是被遮蓋住,取消掛載后仍然存在;
- 取消掛載時不要在掛載的目錄下面操作,否則會提示忙碌,切換到其他目錄再進行卸載;
- 掛載時如果在掛載的目錄下,還是可以看到掛載前目錄下的檔案,需要重新進入目錄才會顯示掛載后目錄的內容;
4.2 掛載
-
客戶端安裝
- rpcbind:為了連接服務端的行程
- nfs-utils:為了使用showmount命令
-
客戶端查看掛載點
[root@web01 ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 -
掛載命令
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /backup mount #掛載命令 -t #指定掛載的檔案型別 nfs #nfs檔案型別 172.16.1.31 #服務端的IP地址 :/data #服務端提供的可掛載目錄 /backup #本地要掛載到服務端的目錄 #掛載后查看掛載 [root@web01 ~]# df -h | grep /backup 172.16.1.31:/data 18G 1.6G 17G 9% /backup
4.3 卸載
#卸載的兩種方式
[root@web01 ~]# umount /backup
[root@web01 ~]# umount 172.16.1.31:/data
#強制取消掛載
[root@web01 ~]# umount -lf /backup
4.4 開機掛載(客戶端)
#編輯fstab檔案
[root@web01 ~]# vim /etc/fstab
172.16.1.31:/data /backup nfs defaults 0 0
#驗證fstab是否寫正確
[root@web01 ~]# mount -a
五、NFS配置詳解
| nfs共享引數 | 引數作用 |
|---|---|
| rw | 讀寫權限 (常用) |
| ro | 只讀權限 (不常用) |
| root_squash | 當NFS客戶端以root管理員訪問時,映射為NFS服務器的匿名用戶 (不常用) |
| no_root_squash | 當NFS客戶端以root管理員訪問時,映射為NFS服務器的root管理員 (不常用) |
| all_squash | 無論NFS客戶端使用什么賬戶訪問,均映射為NFS服務器的匿名用戶 (常用) |
| no_all_squash | 無論NFS客戶端使用什么賬戶訪問,都不進行映射 (不常用) |
| sync | 同時將資料寫入到記憶體與硬碟中,保證不丟失資料 (常用) |
| async | 優先將資料保存到記憶體,然后再寫入硬碟;這樣效率更高,但可能會丟失資料 (不常用) |
| anonuid | 配合all_squash使用,指定NFS的用戶UID,必須存在系統 (常用) |
| anongid | 配合all_squash使用,指定NFS的用戶GID,必須存在系統 (常用) |
六、NFS案例
-
環境準備
主機 IP 身份 web01 172.16.1.7 NFS客戶端 web02 172.16.1.8 NFS客戶端 NFS 172.16.1.31 NFS服務端 -
web端安裝http和php
[root@web01 ~]# yum install httpd php php-devel -y [root@web02 ~]# yum install httpd php php-devel -y -
上傳代碼(web02照做)
[root@web01 ~]# rz [root@web01 ~]# ll -rw-r--r-- 1 root root 26995 Aug 23 10:35 kaoshi.zip -
解壓代碼(web02照做)
#找到httpd服務的站點目錄 [root@web01 ~]# rpm -ql httpd | grep html /var/www/html #解壓代碼至站點目錄(根目錄) [root@web01 ~]# unzip kaoshi.zip -d /var/www/html/ -
授權(web02照做)
[root@web01 ~]# chown -R www.www /var/www/html -
關閉selinux和防火墻(web02照做)
[root@web01 ~]# setenforce 0 [root@web01 ~]# systemctl disable --now firewalld -
修改web軟體的用戶(web02照做)
將檔案內User和Group指定為www: [root@web01 html]# vim /etc/httpd/conf/httpd.conf User www Group www -
啟動web軟體(web02照做)
[root@web01 html]# systemctl start httpd -
訪問頁面測驗
-
訪問
瀏覽器輸入以下網址: http://172.16.1.7/ http://172.16.1.8/ -
測驗上傳圖片

驗證:
上傳成功后訪問:http://172.16.1.7/upload/1_linux.jpg
-
測驗共享(沒有掛載)
在172.16.1.7服務器上傳 1_test_nfs.gif 在172.16.1.8服務器上傳 2_nfs.jpg #訪問 http://172.16.1.7/upload/1_test_nfs.gif 訪問成功 http://172.16.1.8/upload/1_test_nfs.gif 訪問失敗 http://172.16.1.8/upload/2_nfs.jpg 訪問成功 http://172.16.1.7/upload/2_nfs.jpg 訪問失敗 #在沒有掛載的情況下,檔案無法實作共享,在哪臺機器上傳就只能在哪臺機器訪問
-
-
掛載
-
服務端
1、修改NFS組態檔: [root@nfs nfs1]# vim /etc/exports /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666) 2、重新授權掛載點 [root@nfs ~]# chown -R www.www /data 3、重啟NFS [root@nfs nfs1]# systemctl restart nfs-server rpcbind -
web端掛載目錄
1、找到需要掛載的目錄 /var/www/html/upload 2、掛載 [root@web01 html]# mount -t nfs 172.16.1.31:/data /var/www/html/upload [root@web02 html]# mount -t nfs 172.16.1.31:/data /var/www/html/upload注:服務端修改配置后,客戶端需要重新掛載一次,需要先卸載之前的掛載點,再重新執行上述命令
-
再次測驗檔案共享
#瀏覽器上訪問: http://172.16.1.7/upload/1_test_nfs.gif 訪問成功 http://172.16.1.8/upload/1_test_nfs.gif 訪問成功 http://172.16.1.8/upload/2_nfs.jpg 訪問成功 http://172.16.1.7/upload/2_nfs.jpg 訪問成功
-
七、統一用戶
7.1 服務器創建統一用戶(前面已做)
[root@web01 ~]# groupadd www -g 666
[root@web01 ~]# useradd www -u 666 -g 666
[root@web02 ~]# groupadd www -g 666
[root@web02 ~]# useradd www -u 666 -g 666
[root@nfs ~]# groupadd www -g 666
[root@nfs ~]# useradd www -u 666 -g 666
[root@backup ~]# groupadd www -g 666
[root@backup ~]# useradd www -u 666 -g 666
7.2 需要修改用戶的服務
- httpd
- nfs
- rsync
7.3 修改httpd的用戶(前面已做)
#找到組態檔
[root@web01 ~]# rpm -qc httpd
/etc/httpd/conf/httpd.conf
#修改組態檔
[root@web01 ~]# vim /etc/httpd/conf/httpd.conf
User www
Group www
#重啟服務
[root@web01 ~]# systemctl restart httpd
#確認啟動用戶
[root@web01 ~]# ps -ef | grep httpd
root 7768 1 1 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 7769 7768 0 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 7770 7768 0 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 7771 7768 0 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 7772 7768 0 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 7773 7768 0 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
7.4 修改nfs服務的用戶(前面已做)
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
#授權/data目錄
[root@nfs ~]# chown -R www.www /data/
#重啟服務
[root@nfs ~]# systemctl restart nfs
#驗證啟動用戶
[root@nfs ~]# cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
7.5 修改rsync用戶
#修改配置
[root@backup ~]# vim /etc/rsyncd.conf
uid = www
gid = www
#重啟服務
[root@backup ~]# systemctl restart rsyncd
#目錄重新授權
[root@backup ~]# chown -R www.www /backup/
7.6 測驗架構
- 兩臺web服務器(或更多)
- 一臺nfs服務器掛載web服務器的檔案目錄
- 一臺backup服務器實時同步nfs掛載目錄下的內容
八、NFS小結
8.1 NFS存盤優點
- NFS檔案系統簡單易用、方便部署、資料可靠、服務穩定、滿足中小企業需求
- NFS檔案系統記憶體放的資料都在檔案系統之上,所有資料都是能看得見的
8.2 NFS存盤局限
- 存在單點故障, 如果構建高可用維護麻煩 web -> nfs -> backup
- NFS資料明文, 并不對資料做任何校驗
- 客戶端掛載NFS服務沒有密碼驗證, 安全性一般(內網使用)
8.3 .NFS應用建議
- 生產場景應將靜態資料盡可能往前端推, 減少后端存盤壓力
- 必須將存盤里的靜態資源通過CDN快取 jpg\png\mp4\avi\css\js
- 如果沒有快取或架構本身歷史遺留問題太大, 再多存盤也無用
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/398372.html
標籤:其他
上一篇:良許跌宕起伏的2021年
下一篇:Django模型欄位值回傳空白?
