Linux系統——NFS網路檔案系統
在企業叢集架構的工作場景中,NFS網路檔案系統一般被用來儲存共享視訊,圖片,附件等靜態資原始檔,通常網站使用者上傳的檔案都會放到NFS共享裡,然後前端所有的節點訪問這些靜態資源時都會讀取NFS儲存上的資源。NFS是當前網際網路系統架構中最常用的資料儲存服務之一。
叢集:多臺普通伺服器,多臺之間共同作用,達到分散壓力的作用
負載均衡器:將使用者的訪問壓力平均給後方的多個Web伺服器,由多個Web伺服器承擔網民帶來的訪問壓力
根據圖片所示,Web伺服器(服務員)有兩塊網絡卡,一塊連線外網,一塊連線內網
文字型別資料存放在MySQL資料庫上
圖片,視訊,附件(靜態資源)存放在儲存伺服器NFS上
Web程式中,網頁目錄存在static目錄和upload目錄
NFS連線的只是網頁目錄其中的子目錄(通過掛載到子目錄,掛載時是通過TCP協議進行通訊);網頁目錄下要存放網頁程式碼,而非NFS中。使用者上傳是上傳到upload再到NFS中,使用者檢視網頁是將資料傳到static再到NFS中
運維人員用過VPN連線到跳板機,通過跳板機批量管理ssh key、ansible,監控zabbix
企業生產群集為什麼要共享儲存角色
A使用者上傳圖片到Web1伺服器,然後讓B
NFS系統原理
NFS伺服器端/video共享目錄掛載到兩臺NFS客戶端上。
NFS服務端先將其本身的一個目錄進行共享,eg/video目錄,在客戶端檢視時,NFS服務端的/video目錄就相當於客戶端本地的磁碟分割槽或目錄,根據
其他客戶端通過IP與服務端進行遠端掛載
客戶端掛載NFS後,本地掛在資訊查詢:
# df -h
Filesystem處顯示:ip地址:共享目錄
遠端掛載命令
# mount IP地址:/對方源目錄 目標目錄(本機)
# mount 10.0.0.7:/video /video
RPC服務
NFS的RPC服務最主要的功能就是記錄每個NFS功能所對應的埠號,並且在NFS客戶端請求時將該埠和功能對應的資訊傳遞給請求資料的NFS客戶端,從而確保客戶端可以連線到正確的NFS埠上去,達到實現資料傳輸互動資料目的。這個RPC服務類似NFS服務端和NFS客戶端之間的一箇中介。
服務端需要先安裝rpcbind軟體包(rpc的服務端),再安裝nfs-utils軟體包(包括了rpc的客戶端)
客戶端需要安裝一個外掛包(最小化裝機模式)
NFS啟動流程
(1)啟動RPC服務(中介)
首先使用者訪問網站程式,由程式在NFS客戶端上發出存取NFS檔案的請求,這時NFS客戶端(即執行程式的伺服器)的RPC服務(rpcbind服務)就會通過網路向NFS伺服器端的RPC服務(rpcbind服務)的111埠發出NFS檔案存取功能的詢問請求。
(2)啟動NFS服務(房源),向RPC服務註冊啟動的埠
NFS服務端的RPC服務(rpcbind服務)找到對應的已註冊的NFS埠後,通知NFS客戶端的RPC服務(rpcbind服務)
(3)客戶端(租客)掛載,先向RPC服務請求NFS服務 (因為RPC是一個socket守護程序,監聽固定埠),並與NFS daemon聯機存取資料
(4)RPC服務把NFS提供的埠返回給客戶端,此時客戶端才知道是服務端哪個埠提供資料傳輸
(5)客戶端與服務端進行TCP三次握手,連線到NFS服務
因為NFS的各項功能都需要向RPC服務(rpcbind服務)註冊,所以只有RPC服務(rpcbind服務)才能獲取到NFS服務的各項功能對應的埠號(port number),PID,NFS在主機所監聽的IP等資訊,而NFS客戶端也只能通過向RPC服務(rpcbind服務)詢問才能找到正確的埠。也就是說,NFS需要有RPC服務(rpcbind服務)的協助才能成功對外提供服務。從上面的描述,我們不難推斷,無論是NFS客戶端還是NFS伺服器端,當要使用NFS時,都需要首先啟動RPC服務(rpcbind服務),NFS服務必須在RPC服務啟動之後啟動,客戶端無需啟動NFS服務,但需要啟動RPC服務。
服務端的RPC服務是一個socket程序,而客戶端的RPC服務是一個命令
NFS server端的設定
# mount /dev/sr0 /media/cdrom
# yum -y install rpcbind nfs-utils
啟動NFS相關服務
可以觀察到沒有服務端資訊,因為NFS沒啟動
再檢視rpc資訊,提供掛載的埠已註冊,可以進行掛載
配置NFS服務端(必須安裝rpcbind、nfs-utils軟體)
(1)NFS服務端配置檔案路徑
(2)exports配置檔案格式
(3)給共享目錄更改屬主屬組為nfsnobody
(4)進行本地掛載測試
(5)進行檔案寫入測試
NFS服務端配置檔案路徑
# vim /etc/exports
exports配置檔案格式
修改配置檔案後,必須重啟NFS服務
#showmount命令
檢視網路檔案能否掛載
# showmount -e 檢視生效的NFS配置檔案規則
檢視本地共享資訊
# showmount -e localhost
# showmount -e 127.0.0.1
給共享目錄更改屬主屬組為nfsnobaby
# mkdir /data
# chown nfsnobody.nfsnobody /data
進行本地掛載測試
# mount 192.168.214.134:/data /tmp
若出現此類情況,對/etc/ssh/sshd_config進行修改
(1)# vim /etc/ssh/sshd_config
(2)# service sshd reload
# rm -rf /tmp/*
# mount 192.168.214.134:/data /tmp
再進行本地掛載測試!
本地測試成功!
進行檔案寫入測試
# showmount -e 192.168.214.134
檢視這個IP地址是否有網路檔案系統NFS提供掛載
服務端也需要在指令碼中配置mount開機自動掛載
配置NFS客戶端(必須安裝nfs-utils軟體)
(1)檢查遠端showmount
(2)客戶端掛載
(3)進行檔案讀寫及同步測試
(4)配置開機自動掛載nfs共享目錄
檢查遠端showmount
# showmount -e 192.168.214.134
客戶端掛載
# mount 192.168.214.134:/data /www
進行檔案讀寫及同步測試
測試成功!
配置開機自動掛載nfs共享目錄
方法一:將掛載命令放在/etc/rc.local裡
缺點:偶爾開機掛載不上,工作中除了開機自啟動配置,還要對是否掛載做監控(network檔案在/etc/rc.local之前啟動,若在/etc/rc.local之後啟動會沒有網路,掛載不上)
# echo "mount -t nfs 1923168.214.134:/data /www"(-t nfs可以不寫)
方法二:將掛載命令在在/etc/fstab裡
(/etc/fstab在開啟系統時啟動,此時network還未啟動,所以在使用/etc/fstab掛載該命令時,必須保證netfs在3模式下為啟動狀態,否則會出現掛載不上的情況)
# chkconfig | grep netfs
3模式下必須為開機啟動狀態
因此,nfs網路檔案系統最好不要放到fstab裡實現開機掛載。但如果是在開機自啟動服務裡設定並啟動了netfs服務,放入fstab裡也是可以開機掛載的。
NFS配置許可權設定常用引數說明
rw |
Read-write,表示可讀寫許可權 |
ro |
Read-only,表示只讀許可權 |
sync |
(同步,實時)請求或吸入資料時,資料同步寫入到NFS Server的硬碟後才返回 |
async |
(非同步)寫入時資料會先寫到記憶體緩衝區,只到硬碟有空檔才會寫入磁碟,這樣可以提升寫入速率!風險為若伺服器掛掉或不正常關機,會損失緩衝區中未寫入磁碟的資料 |
no_root_squash |
訪問NFS Server共享目錄的使用者如果是root,它對該共享目錄具有root許可權。 |
root_squash |
如果訪問目錄的是root,則它的許可權將被壓縮成匿名使用者(普通使用者不降權)。 |
all_squash |
不管訪問共享目錄的使用者身份如何,它的許可權都被壓縮成匿名使用者。 |
anonuid |
指定共享資料夾裡檔案所有者的uid號:例如:(rw,squash,anonuid=12306,anongid=12306) |
anongid |
指定共享資料夾裡檔案所有者的gid號:例如:(rw,squash,anonuid=12306,anongid=12306) |
若想將屬主、屬組從nfsnobody改為其他名字,需要使用引數anonuid、anongid(雖被降權,但可以修改)
exports配置檔案相關引數的說明
(1)(rw,sync) :可讀可寫,同步傳輸
(2)(ro,async):只讀,非同步傳輸
(3)root_squash:將root賬戶在共享目錄裡的身份降低為匿名者(預設nfsnobody)身份,root在共享目錄裡建立的任何檔案都不受保護,任何人(所有使用者)都可以讀取,修改,刪除;而非root使用者則不降低許可權,在共享目錄裡建立的檔案的屬主和屬組統一為nobody(身份隱藏了),這種情況下,所有普通使用者之間只能互相檢視檔案,並不能任意修改和刪除並且你還無法知道是誰建立的檔案,每個普通使用者只能修改或刪除自己建立的檔案。root使用者雖然被降低了身份,但是並沒有降低他的管理者許可權,也就是說它仍舊能對所有共享目錄裡的所有檔案進行檢視,修改,刪除操作。
(4)no_root_squash:不降低root賬戶在共享目錄的身份,身份還是root
(5)all_squash:將所有訪問使用者在共享目錄裡的身份都降低為匿名者(預設nfsnobody)身份
(6)anonuid和anongid:指定NFS虛擬賬戶的uid或gid
NFS企業級優化
(1)NFS配置檔案優化
- NFS客戶端掛載後,往共享目錄寫入資料時卡住了
- NFS服務端,重啟restart服務,客戶端如果寫入資料卡住了。
解決方法:
- NFS服務端重啟之後,共享資料夾進入grace time(無敵時間)
- 客戶端在服務端重啟後寫入資料大概要等90秒
- NFS配置檔案:/etc/sysconfig/nfs
(2)NFS客戶端mount掛載深入
在NFS客戶端可以通過cat /proc/mounts檢視mount的掛載引數細節
NFS Client mount 掛載引數列表
mount引數 |
引數功能 |
預設引數 |
fg;bg |
當客戶端掛載時,可以選擇前臺fg掛載或者後臺bg掛載,後臺掛載不影響前臺其他操作,如果網路不穩建議bg比較妥當 |
fg |
soft;hard |
soft短掛載,當timeout出現時可能會造成資料丟失,不建議使用 |
hard |
intr |
當使用hard掛載的資源timeout後,若有指定intr引數,可以在timeout後把它中斷掉,這避免出問題時系統整個被NFS鎖死,建議使用intr |
無 |
proto=udp |
使用UDP協議來傳輸資料,在LAN中會有比較好的效能。若要跨越Internet的話,使用pro=tcp多傳輸的資料會有比較好的糾錯能力 |
proto=tcp |
mount -o引數對應的選項:
|引數|引數意義|系統預設值|
suid;nosuid |
當掛載的檔案系統上有任何SUID的程式時,只要使用nosuid就能夠取消設定SUID的功能。 |
suid |
rw;ro |
可以指定檔案系統是隻讀(ro)或可寫(rw) |
rw |
dev;nodev |
是否可以保留裝置檔案的特殊功能?一般來說只有/dev才會有特殊的裝置,因此可以選擇nodev |
dev |
exec;noexec |
是否具有執行檔案的許可權?如果想要掛載的僅是普通資源資料區(例如:圖片,附件),那麼可以選擇noexec |
exec |
user;nouser |
是否允許使用者進行檔案的掛載與解除安裝功能?如果要保護檔案系統,最好不要提供使用者進行掛載與解除安裝 |
nouser |
auto;noauto |
這個auto指的是“mount -a”時會不會被解除安裝的專案,如果不需要這個分割槽隨時被掛載,可以設定為noauto |
auto |
(1)NFS客戶端mount掛在優化
掛載時常用命令
# mount -t nfs -o nosuid,noexec,nodev,rw 192.168.214.134:/data /www
Mount效能優化引數選項
1)禁止更新目錄及檔案時間戳掛載
# mount -t nfs -o noatime,nodiratime 192.168.214.134:/data /www
2)安全加優化的掛載方式
# mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072 192.168.21.4134:/data /www
3)預設的掛載方式
# mount -t nfs 192.168.214.134:/data /www
如果是本地檔案系統,使用如下命令
# mount /dev/sdb1 /www -o defaults,async,noatime,data=writeback,barrier=0
NFS核心優化建議
(1)/proc/sys/net/core/rmem_default:該檔案指定了接收套接字緩衝區大小的預設值(以位元組為單位),預設設定:124928 建議:8388608
(2)/proc/sys/net/core/rmem_max:該檔案指定了接收套接字緩衝區大小的最大值(以位元組為單位) 建議:16777216
(3)/proc/sys/net/core/wmem_default:該檔案指定了傳送套接字緩衝區大小的預設值(以位元組為單位),預設設定:124928 建議:8388608
(4)/proc/sys/net/core/wmem_max:該檔案指定了傳送套接字緩衝區大小的最大值(以位元組為單位)。預設設定:124928. 建議:16777216
NFS系統應用的優缺點說明
優點:
(1)簡單,容易上手,容易掌握
(2)NFS 檔案系統內資料是在檔案系統之上的,即資料是能看得見的。
(3)部署快速,維護簡單方便,且可控,滿足需求的就是最好的。
(4)可靠,從軟體層面上看,資料可靠性高,經久耐用。資料是在檔案系統之上的。
(5)服務非常穩定
缺點:
(1)存在單點故障,如果NFS Server宕機了,所有客戶端都不能訪問共享目錄。這個需要負載均衡及高可用來彌補
(2)在大資料高併發的場合,NFS效率,效能有限(2千萬/日以下PV(page view)的網站不是瓶頸,除非網站架構設計太差。)
(3)客戶端認證是基於IP和主機名的,許可權要根據ID識別,安全性一般(用於內網則問題不大)。
(4)NFS資料是明文的,NFS本身不對資料完整性做驗證。
(5)多臺客戶機器掛載一個NFS伺服器時,連線管理維護麻煩(耦合度高)。尤其NFS服務端出問題後,所有NFS客戶端都處於掛掉狀態(測試環境可使用autofs自動掛載解決,正式環境可修復NFS服務或強制解除安裝)
(6)涉及了同步(實時等待)和非同步(解耦)的概念,NFS服務端和客戶端相對來說就是耦合度有些高。網站程式也是一樣,儘量不要耦合度太高,系統及程式架構師的重要職責就是為程式及架構解耦,讓網站的擴充套件性變得更好。