今日內(nèi)容:
1.什么是nfs?
nfs是network file system縮寫。網(wǎng)絡(luò)文件系統(tǒng),NFS共享存儲
2.nfs能干什么?
通過局域網(wǎng)實現(xiàn)不同主機系統(tǒng)之間目錄共享
3.為什么要使用nfs
4.nfs能解決什么問題?
1.解決多臺web靜態(tài)資源的共享(所有客戶端都掛載服務(wù)端,看到的數(shù)據(jù)都一樣)
2.解決多臺web靜態(tài)資源一致性(如果客戶端A刪除NFS服務(wù)上的test文件,客戶端B也會看不見test文件)
3.解決多臺web磁盤空間的浪費
4.快速迭代web服務(wù)器的代碼
5.使用nfs的注意事項
5.1增加nfs會增加資源訪問的延時
5.2建議使用cdn對靜態(tài)資源加速
6.nfs實現(xiàn)的原理解析
本地文件操作方式
1.當(dāng)用戶執(zhí)行mkdir命令,BashShell無法完成該命令操作,會將其翻譯給內(nèi)核
2.Kernel 內(nèi)核解析完成后會驅(qū)動對應(yīng)的磁盤設(shè)備,完成創(chuàng)建目錄的操作
NFS實現(xiàn)原理(需要先了解程序進程線程)
1.NFS客戶端執(zhí)行增刪操作客戶端會使用不同的函數(shù)對該操作進行封裝
2.NFS客戶端會通過TCP/IP的方式傳遞給NFS服務(wù)端
3.NFS服務(wù)端收到請求后,先調(diào)用portmap 進程進行端口映射
4.nfsd進程用于判斷NFS客戶端是否擁有權(quán)限鏈接nfs 服務(wù)端
5.Rpc.mount進程判斷客戶端是否有對應(yīng)的權(quán)限進行驗證
6.idmap進程實現(xiàn)用戶映射和壓縮
7.最后NFS服務(wù)端會將客戶端的函數(shù)轉(zhuǎn)換為本地能執(zhí)行的命令,然后將命令傳遞至內(nèi)核有內(nèi)核驅(qū)動硬件
注意:rpc是一個遠程過程調(diào)用,那么使用nfs必須有rpc服務(wù)
7.安裝 配置 nfs 服務(wù)
0.環(huán)境準備
10.0.0.7 172.16.1.7 web01
10.0.0.31 172.16.1.31 nfs
NFS服務(wù)端
1.安裝
[root@nfs ~]# yum install rpcbind nfs-utils -y
2.配置
將nfs服務(wù)端的/data目錄共享給172.16.1.0/24網(wǎng)段內(nèi)的所有主機
2.1所有客戶端主機都擁有讀寫權(quán)限
2.2在將數(shù)據(jù)寫入到NFS服務(wù)器的硬盤中后才會結(jié)束操作,最大限度保證數(shù)據(jù)不丟失
2.3將所有用戶映射為本地的匿名用戶(nfsnobody)
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
3.根據(jù)配置創(chuàng)建對應(yīng)的目錄
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data/
4.啟動
[root@nfs ~]# systemctl enable nfs
[root@nfs ~]# systemctl start nfs
5.客戶端測試
1.先安裝軟件包
[root@web01 ~]#yum install nfs-utils -y
2.檢查172.16.1.31服務(wù)端的共享的目錄詳情
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31
/data 172.16.1.0 /24
3.客戶端執(zhí)行掛載操作
[root@web01 ~]#mount -t nfs 172.16.31:/data /mnt
4.檢查掛載是否OK
[root@web01 ~]df -h
NFS的參數(shù)
| nfs共享參數(shù) | 參數(shù)作用 |
|---|---|
| rw* | 讀寫權(quán)限 |
| ro | 只讀權(quán)限 |
| sync* | 同時將數(shù)據(jù)寫入到內(nèi)存與硬盤當(dāng)中保證不丟失數(shù)據(jù) |
| async | 優(yōu)先將數(shù)據(jù)保存到內(nèi)存,然后在寫入硬盤,這樣效率更高:但可能會丟失數(shù)據(jù) |
| root_squash | 當(dāng)NFS客戶端以root管理員訪問時,映射為NFS服務(wù)器的匿名用戶(不常用) |
| no_root_squash | 當(dāng)NFS客戶端以root管理員訪問時,映射為NFS服務(wù)器的root管理員(不常用) |
| no_all_squash | 無論NFS客戶端使用什么賬戶訪問,都不進行壓縮( kvm熱遷移 ) |
| all_squash | 無論NFS客戶端使用什么賬戶訪問,均映射為NFS服務(wù)器的匿名用戶(常用) |
| anonuid* | 配置all_squash使用,指定NFS的用戶UID,必須存在系統(tǒng) |
| anongid* | 配置all_squash使用,指定NFS的組的UID,必須存在系統(tǒng) |
1.驗證ro權(quán)限實踐
[root@nfs ~]# cat /etc/exports
/data1 172.16.1.0/24(ro,sync,all_squash)
[root@nfs ~]# mkdir /data1
[root@nfs ~]# chown nfsnobody.nfsnobody /data1/
[root@nfs ~]# systemctl restart nfs
[root@web01 ~]# mount -t nfs 172.16.1.31:/data1 /mnt
[root@web01 ~]# echo "123" >> /mnt/test
-bash: /mnt/test: 只讀文件系統(tǒng)
2.驗證all_squash 、anonuid、anongid權(quán)限
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@nfs ~]# mkdir -p /data
[root@nfs ~]# chown -R www.www /data
[root@nfs ~]# systemctl restart nfs-server
創(chuàng)建系統(tǒng)用戶
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -u666 -g666 www
客戶端掛載
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 ~]# echo "123" >> /mnt/test
檢查服務(wù)端:
[root@nfs ~]# ll /data
-rw-r--r-- 1 www www 4 4月 16 11:11 test
查看客戶端:
[root@web01 ~]# ll /mnt/
-rw-r--r-- 1 666 666 4 Apr 16 11:11 test
為了避免程序在操作NFS時。權(quán)限會出現(xiàn)錯誤,我們將進程運行的用戶,與nfs存儲壓縮的用戶保持一致。
[root@web01 ~]# groupadd -g 666 www
[root@web01 ~]# useradd -u 666 www -g www
[root@web01 ~]# ll /mnt/
-rw-r--r-- 1 www www 4 Apr 16 11:11 test
1.NFS存儲優(yōu)點
1.NFS簡單易用、方便部署、數(shù)據(jù)可靠、服務(wù)穩(wěn)定、滿足中小企業(yè)需求。
2.NFS的數(shù)據(jù)都在文件系統(tǒng)之上,所有數(shù)據(jù)都是能看得見。
2.NFS存儲局限
1.存在單點故障,他不支持集群模式。 如果構(gòu)建高可用維護麻煩web->nfs()->backup
2.NFS數(shù)據(jù)都是明文, 并不對數(shù)據(jù)做任何校驗,也沒有密碼驗證(強烈建議內(nèi)網(wǎng)使用)。
3.NFS應(yīng)用建議
1.生產(chǎn)場景應(yīng)將靜態(tài)數(shù)據(jù)(jpg\png\mp4\avi\css\js)盡可能放置CDN場景進行環(huán)境, 以此來減少后端存儲壓力
2.如果沒有緩存或架構(gòu)、代碼等,本身歷史遺留問題太大,在多存儲也沒意義
案例
準備3臺虛擬機服務(wù)器,并且請按照要求搭建配置NFS服務(wù)。
NFS服務(wù)端(A)
NFS客戶端(B)
NFS客戶端(C)
1.在NFS服務(wù)端(A)上共享/data/w(可寫)及/data/r(只讀)
2.在NFS客戶端(B/C)上進行掛載
環(huán)境準備
服務(wù)器系統(tǒng) 角色 IP
CentOS 7.6 NfsServer(A) 172.16.1.31
CentOS 7.6 NfsClient(B) 172.16.1.41
CentOS 7.6 NfsClient(C) 172.16.1.7
172.16.1.31作為服務(wù)端,需要共享 /data/w (rw) /data/r (ro)