1. 程式人生 > >Linux系統——NFS網路檔案系統

Linux系統——NFS網路檔案系統

在企業叢集架構的工作場景中,NFS網路檔案系統一般被用來儲存共享視訊,圖片,附件等靜態資原始檔,通常網站使用者上傳的檔案都會放到NFS共享裡,然後前端所有的節點訪問這些靜態資源時都會讀取NFS儲存上的資源。NFS是當前網際網路系統架構中最常用的資料儲存服務之一。

 

叢集:多臺普通伺服器,多臺之間共同作用,達到分散壓力的作用

 

負載均衡器:將使用者的訪問壓力平均給後方的多個Web伺服器,由多個Web伺服器承擔網民帶來的訪問壓力

 

根據圖片所示,Web伺服器(服務員)有兩塊網絡卡,一塊連線外網,一塊連線內網

 

文字型別資料存放在MySQL資料庫上

+

 

圖片,視訊,附件(靜態資源)存放在儲存伺服器NFS

 

Web程式中,網頁目錄存在static目錄和upload目錄

NFS連線的只是網頁目錄其中的子目錄(通過掛載到子目錄,掛載時是通過TCP協議進行通訊);網頁目錄下要存放網頁程式碼,而非NFS中。使用者上傳是上傳到upload再到NFS中,使用者檢視網頁是將資料傳到static再到NFS

 

運維人員用過VPN連線到跳板機,通過跳板機批量管理ssh keyansible,監控zabbix

 

企業生產群集為什麼要共享儲存角色

A使用者上傳圖片到Web1伺服器,然後讓B

使用者訪問這張圖片,結果B使用者訪問的請求分發到了Web2,因為Web2上沒有這張圖片,這就導致它無法看到A使用者上傳的圖片,如果此時有一個共享儲存,A使用者上傳圖片的請求無論是分發到Web1還是Web2上,最終都會儲存到共享儲存上,而在B使用者訪問圖片時,無論請求分發到Web1還是Web2上,最終也都會去共享儲存上找,這樣就可以訪問到需要的資源了。

 

NFS系統原理

NFS伺服器端/video共享目錄掛載到兩臺NFS客戶端上。

 

NFS服務端先將其本身的一個目錄進行共享,eg/video目錄,在客戶端檢視時,NFS服務端的/video目錄就相當於客戶端本地的磁碟分割槽或目錄,根據

NFS服務端授予的NFS共享許可權以及共享目錄的本地系統許可權,只要在指定的NFS客戶端操作掛載/v/video或者/video的目錄,就可以將資料輕鬆地存取到NFS伺服器端上的/video目錄中。

 

其他客戶端通過IP與服務端進行遠端掛載

 

客戶端掛載NFS後,本地掛在資訊查詢:

# df -h

Filesystem處顯示:ip地址:共享目錄

 

遠端掛載命令

# mount IP地址:/對方源目錄 目標目錄(本機)

# mount 10.0.0.7:/video  /video

 

 

RPC服務

NFSRPC服務最主要的功能就是記錄每個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聯機存取資料

4RPC服務把NFS提供的埠返回給客戶端,此時客戶端才知道是服務端哪個埠提供資料傳輸

5)客戶端與服務端進行TCP三次握手,連線到NFS服務

 

因為NFS的各項功能都需要向RPC服務(rpcbind服務)註冊,所以只有RPC服務(rpcbind服務)才能獲取到NFS服務的各項功能對應的埠號(port number),PIDNFS在主機所監聽的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服務端(必須安裝rpcbindnfs-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掛載該命令時,必須保證netfs3模式下為啟動狀態,否則會出現掛載不上的情況)

# 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改為其他名字,需要使用引數anonuidanongid(雖被降權,但可以修改)

 

 

 

exports配置檔案相關引數的說明

 

(1)rw,sync:可讀可寫,同步傳輸
2)(ro,async:只讀,非同步傳輸

3root_squash:root賬戶在共享目錄裡的身份降低為匿名者(預設nfsnobody)身份,root在共享目錄裡建立的任何檔案都不受保護,任何人(所有使用者)都可以讀取,修改,刪除;而非root使用者則不降低許可權,在共享目錄裡建立的檔案的屬主和屬組統一為nobody(身份隱藏了),這種情況下,所有普通使用者之間只能互相檢視檔案,並不能任意修改和刪除並且你還無法知道是誰建立的檔案,每個普通使用者只能修改或刪除自己建立的檔案。root使用者雖然被降低了身份,但是並沒有降低他的管理者許可權,也就是說它仍舊能對所有共享目錄裡的所有檔案進行檢視,修改,刪除操作。
4no_root_squash:不降低root賬戶在共享目錄的身份,身份還是root
5all_squash:將所有訪問使用者在共享目錄裡的身份都降低為匿名者(預設nfsnobody)身份

6anonuidanongid:指定NFS虛擬賬戶的uidgid

 

 

NFS企業級優化

(1)NFS配置檔案優化

  1. NFS客戶端掛載後,往共享目錄寫入資料時卡住了
  2. NFS服務端,重啟restart服務,客戶端如果寫入資料卡住了。

解決方法:

    1. NFS服務端重啟之後,共享資料夾進入grace time(無敵時間)
    2. 客戶端在服務端重啟後寫入資料大概要等90
    3. NFS配置檔案:/etc/sysconfig/nfs

2NFS客戶端mount掛載深入

NFS客戶端可以通過cat /proc/mounts檢視mount的掛載引數細節

NFS Client mount 掛載引數列表

mount引數

引數功能

預設引數

fgbg

當客戶端掛載時,可以選擇前臺fg掛載或者後臺bg掛載,後臺掛載不影響前臺其他操作,如果網路不穩建議bg比較妥當

fg

softhard

soft短掛載,當timeout出現時可能會造成資料丟失,不建議使用

hard

intr

當使用hard掛載的資源timeout後,若有指定intr引數,可以在timeout後把它中斷掉,這避免出問題時系統整個被NFS鎖死,建議使用intr

proto=udp

使用UDP協議來傳輸資料,在LAN中會有比較好的效能。若要跨越Internet的話,使用pro=tcp多傳輸的資料會有比較好的糾錯能力

proto=tcp

mount -o引數對應的選項:

|引數|引數意義|系統預設值|

suidnosuid

當掛載的檔案系統上有任何SUID的程式時,只要使用nosuid就能夠取消設定SUID的功能。

suid

rw;ro

可以指定檔案系統是隻讀(ro)或可寫(rw

rw

dev;nodev

是否可以保留裝置檔案的特殊功能?一般來說只有/dev才會有特殊的裝置,因此可以選擇nodev

dev

execnoexec

是否具有執行檔案的許可權?如果想要掛載的僅是普通資源資料區(例如:圖片,附件),那麼可以選擇noexec

exec

usernouser

是否允許使用者進行檔案的掛載與解除安裝功能?如果要保護檔案系統,最好不要提供使用者進行掛載與解除安裝

nouser

autonoauto

這個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)簡單,容易上手,容易掌握

2NFS 檔案系統內資料是在檔案系統之上的,即資料是能看得見的。

3)部署快速,維護簡單方便,且可控,滿足需求的就是最好的。

4)可靠,從軟體層面上看,資料可靠性高,經久耐用。資料是在檔案系統之上的。

5)服務非常穩定

 

缺點:

1)存在單點故障,如果NFS Server宕機了,所有客戶端都不能訪問共享目錄。這個需要負載均衡及高可用來彌補

2)在大資料高併發的場合,NFS效率,效能有限(2千萬/日以下PV(page view)的網站不是瓶頸,除非網站架構設計太差。)

3)客戶端認證是基於IP和主機名的,許可權要根據ID識別,安全性一般(用於內網則問題不大)。

4NFS資料是明文的,NFS本身不對資料完整性做驗證。

5)多臺客戶機器掛載一個NFS伺服器時,連線管理維護麻煩(耦合度高)。尤其NFS服務端出問題後,所有NFS客戶端都處於掛掉狀態(測試環境可使用autofs自動掛載解決,正式環境可修復NFS服務或強制解除安裝)

6)涉及了同步(實時等待)和非同步(解耦)的概念,NFS服務端和客戶端相對來說就是耦合度有些高。網站程式也是一樣,儘量不要耦合度太高,系統及程式架構師的重要職責就是為程式及架構解耦,讓網站的擴充套件性變得更好。