寫在前面的話
事情是醬嬸兒的,前兩天實在是幫他們查日志查的心里交瘁了,而且有些時候下班了,也就不想再接到這樣的需求,於是想基於 Nginx 做一個文件下載中心,在這個文件下載中心里面存有各個服務的日志。用戶認證采用 Nginx 自己的用戶認證方式。所以想到了將服務器多個日志目錄都采用 NFS 掛載的方式交予 Nginx 的機器,但是在這個時候,驚喜發生了。
以前用 NFS 的時候都是每個服務器都只有一個目錄需要掛載,這一次多個,於是美滋滋的掛載上去,在網上隨便搜了一個參數。然后愉快的掛載上了。結果過了幾天他們在使用的時候,突然給我反饋,所有目錄的日志是一樣的,於是瞬間懵逼,完全不相信,登錄上去一看,我x,還真是。然后問了幾個老哥,終於有人遇到這個問題,推薦我使用 NFS4 協議,然后愉快實現了需求,在這里做個分享~
談談 NFS 和 NFS4 協議
NFS(Network File System)即網絡文件系統,它允許網絡中的計算機之間通過TCP/IP網絡共享資源,分為服務端(Server)和客戶端(Client)。最早由 sun 公司開發,是類 unix 系統間實現磁盤共享的一種方法。
這是網上到處都可以看到的一個概念,我這里可以加一些個人理解:NFS,及 Network File Share,文件共享。我們需要記住一個很重要的概念,服務端和客戶端的區別,這是很多人至始至終都沒有弄清楚的一個東西。
服務端:文件在我這里,由我共享出去,所以我是老大,我是服務端。
客戶端:我去網絡中找服務端,將他共享的文件掛載我的系統下,從而實現訪問。
至於 NFS4,及 NFS 協議的 version 4,在原有的基礎上對多目錄文件共享做了優化~
安裝部署 NFS
閑話少說,直接開干,具體拓撲圖如下:
我們以兩台測試機器為例,系統都為 CENTOS 7.5~
我們要共享的目錄結構如下圖,我們想把 node1 上面的三個目錄都剛想出去給 node2 掛載:
【1】在 node1 上面部署配置 NFS 服務端:
# 安裝需要的包 yum -y install nfs-utils rpcbind # 添加共享配置 vim /etc/exports
內容如下:
/nfsdata 192.168.100.101(rw,fsid=0,sync,no_wdelay,insecure_locks,no_root_squash)
簡單的說一下配置:
1. 這是一個通用的配置,幾乎對掛載目錄沒做什么限制,參數后續會就行補充說明。
2. 三個目錄,但是我們只做了 1 條規則,這個規則是下面需要共享目錄的頂層目錄。
3. 在規則的后面有個 fsid=0 的配置,這是 NFS4 不可缺少的。
啟動服務:
# 啟動 rpcbind 和配置開機自啟動
systemctl start rpcbind
systemctl enable rpcbind
# 啟動 nfs 和配置開機自啟動
systemctl start nfs
systemctl enable nfs
查看本機共享目錄情況:
showmount -e
如圖:
注意:在我們修改 exports 文件的添加其他目錄的時候,我們需要重啟 rpcbind 和 nfs 服務端服務,再度查看才會存在!
【2】在 node2 上面部署 nfs 客戶端:
yum -y install nfs-utils rpcbind
啟動服務,和服務端不同的是,我們只需要啟動 rpcbind 服務即可~
# 啟動 rpcbind 和配置開機自啟動 systemctl start rpcbind systemctl enable rpcbind
查看指定服務器授權給我們的目錄:
showmount -e 192.168.100.100
結果如圖:
本地的目錄結構:
我們依次想把 node1 上面的 test123 掛載到 node2 上面的 data123 ~
mount -t nfs4 192.168.100.100:/test1 /nfsdata/data1 mount -t nfs4 192.168.100.100:/test2 /nfsdata/data2 mount -t nfs4 192.168.100.100:/test3 /nfsdata/data3
和傳統的 nfs 不一樣,這里我們指定協議為 nfs4~
查看掛載結果:
nfsstat -m
結果如圖:
查看目錄效果:
至此,NFS 同主機多目錄 NFS4 協議掛載完成~
參數說明
【1】掛載授權 IP 說明:
配置 | 說明 |
---|---|
授權某個IP | 192.168.1.1 |
授權某個網段 | 192.168.1.0/24 |
授權某個域名 | www.baidu.com |
授權某個域 | *.baidu.com |
授權所有 | * |
【2】授權參數:
參數 | 說明 |
---|---|
ro | 目錄只讀 |
rw | 目錄可讀寫 |
all_squash | 將遠程訪問的所有普通用戶和組都映射為匿名(nfsnobody) |
no_all_squash | 與 all_squash 取反(默認設置) |
root_squash | 將 root 用戶及所屬組都映射為匿名用戶或用戶組(默認設置) |
no_root_squash | 與 root_squash 取反 |
anonuid=xxx | 將遠程訪問的所有用戶都映射為匿名用戶,並指定該用戶為本地用戶(UID=xxx) |
anongid=xxx | 將遠程訪問的所有用戶組都映射為匿名用戶組,並指定該匿名用戶組為本地用戶組(GID=xxx) |
secure | 限制客戶端只能從小於 1024 的 tcp/ip 端口連接 nfs 服務器(默認設置) |
insecure | 允許客戶端從大於 1024 的 tcp/ip 端口連接服務器 |
sync | 將數據同步寫入內存緩沖區與磁盤中,效率低,但可以保證數據的一致性 |
async | 將數據先保存在內存緩沖區中,必要時才寫入磁盤 |
wdelay | 檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率(默認設置) |
no_wdelay | 若有寫操作則立即執行,應與 sync 配合使用 |
subtree_check | 若目錄是一個子目錄,則 nfs 服務器將檢查其父目錄的權限(默認設置) |
no_subtree_check | 即使目錄是一個子目錄,nfs 服務器也不檢查其父目錄的權限,這樣可以提高效率 |
小結
目前就這些內容,如果出現問題可以聯系我,當然,如果你覺得這個文章對你有幫助,請點擊 推薦~