1. 程式人生 > >NFS企業級網絡文件共享

NFS企業級網絡文件共享

nfs企業級文件共享 nfs服務端、nfs客戶端

企業級NFS網絡文件共享服務

1、NFS介紹
什麽是NFS?
NFS是network file system的縮寫,中文意思是網絡文件系統。它的主要功能是通過網絡(一般是局域網) 讓不同的主機系統之間可以共享文件或者目錄。NFS客戶端(一般為應用服務器,例如web)可以通過掛載的方式將nfs服務器共享的數據目錄掛載到nfs客戶端本地系統中(就是某一個掛載點下)。從nfs客戶端的的機器本地看,nfs服務器端共享的文件目錄就像客戶端自己的磁盤分區或者目錄一樣,而實際是遠端nfs服務器的目錄。
Nfs網絡文件系統就像windows系統的網絡共享、安全功能、網絡驅動器映射,這也和linux系統裏的samaba服務類似。只不過一把情況下,windows網絡共享服務或者samba服務用語局域網共享,互聯網中小型網站集群架構後端常用NFS作為數據共享,入大型網站還可能用到更復雜的分布式文件系統(moosefs(mfs)),glusterfs,fastdfs。網絡文件服務器,給網絡所有服務器提供文件共享服務。在web1上訪問/mnt文件目錄,相當於訪問nfs服務器的/data.

技術分享圖片

2、NFS在企業中的應用場景
在企業集群架構的工作場景中,NFS網絡文件系統一般被用來存儲共享視頻、圖片、附件靜態資源文件,一般是把網站用戶上傳的文件都放在NFS共享裏,例如bbs產品的圖片、附件、頭像,註意bbs網站程序不要放在NFS共享裏,然後前端所有的節點訪問這些靜態資源時都會讀取到NFS存儲上的資源。
發博文文字東西存放數據庫,用戶上傳的圖片視頻之類的存放在nfs共享服務器中。
NFS的歷史介紹
第一個網絡文件系統被稱為FILEJ ACCESS listener, 由DIGITAL enquipment corporation(DEC)1976年開發。Nfs是第一個構建於ip協議上的現代網絡文件系統。

Nfs系統已經成功歷盡30年的發展。它代表了一個非常穩定的(可移植)網絡文件系統,它具備可擴展、高性能等特性並達到企業級應用質量標準,由於網絡速度的增加,延遲降低,NFS系統一直是通過網絡提供文件系統服務的有競爭力的選擇,特別是中小互聯網企業,應用十分廣泛。
Nfs在企業中應用場景
在企業集群架構的工作場景中,nfs網絡文件系統一般用來存儲共享視頻、圖片、附件等靜態資源,一般是把網站用戶上傳的文件都放在nfs共享裏,例如;BBS產品的圖片、附件、頭像,註意網站BBS程序不要放NFS共享裏,然後前端所有節點訪問這些靜態資源都會讀取NFS存儲上的資源。NFS是當前互聯網系統架構中最常用的存儲服務之一,特別是中小型網站公司應用頻率更高。大公司或門戶除了用NFS外,還可能會使用更復雜的分布式文件系統(mfs),glusterfs,fastdfs等。
技術分享圖片
圖中後面虛線框裏就是NFS系統工作的位置,NFS作為所有前端WEB服務的共享存儲,存儲的內容一般有網站用戶上傳的圖片、附件、頭像等,註意網站的程序代碼不要放在NFS共享裏,網站程序是人工發布的,不存在延遲問題,直接批量發布到web節點提供訪問,這樣效率更高。
企業生產集群為什麽需要共享存儲角色
這裏通過圖解給大家展示集群架構需要共享存儲服務的理由。例如:A用戶傳圖片到web1服務器,然後讓B用戶訪問這張照片,結果B用戶的請求分發到web2因為web2上沒有這張照片,結果無法查看到A用戶傳的圖片,如果此時有一個共享存儲,A用戶上傳的照片無論分發到web1還是web2,最終都存到共享存儲上,此時,b用戶訪問圖片時,無論分發到web1或者web2,最終都存儲到共享存儲上,此時b用戶訪問到資源了。這個共享存儲的位置可以通過開源軟件和商業硬件實現,互聯網中小型集群架構會用普通pc服務器和nfs文件系統實現。
當集群中沒有NFS共享存儲,用戶訪問圖片的情況:
技術分享圖片
提示:中小型互聯網企業一般不會賣家硬件存儲,因為太貴,大公司如果業務發展很快的話,可能會臨時買硬件存儲頂一下網站的壓力,當網站並發繼續加大後,硬件存儲擴展就相對費勁了,且價格成幾何級數增加。例如:淘寶網就替換掉了很多硬件設備集群軟件,用lvs+haproxy替換了netscaler負載均衡設備,用fastDFS,TFS配合pc服務器替換了netapp、emc商業存儲,去IOE正在成為互聯網公司的主流。

技術分享圖片
NFS系統原理
技術分享圖片
當我們在NFS服務器端設置好一個共享目錄/video後,其他的有NFS服務器端的客戶端可以將這個共享目錄/video,掛載到客戶端本地某個掛載點,掛載點就是一個目錄,這個掛載點目錄可以自己隨意指定,上圖中的兩個NFS客戶端掛載點分別為/v/video和/video,不同客戶端的掛載點可以不相同。

使用我們的nfs肯定用到ip地址和端口號,測試而知NFS在數據傳輸時使用的端口隨機選擇。Nfs客戶端怎麽知道nfs服務端使用哪個端口呢?
答案:通過RPC(中文意思遠程過程調用,英文remote precede call)通過這個rpc服務的應用在門戶級的網站很多。什麽是rpc?
NFS工作原理流程
技術分享圖片
再次強調:NFS的rpc服務在centos5.x下名稱成為protmap,在centos6.x下名稱為rpcbind
NFS服務端部署環境準備
服務器系統 角色 ip
Centos6.6x86_64 NFS服務端(nfs-server) 10.0.0.5
Centos6.6x86_64 NFS客戶端(nfs-client1) 10.0.0.6
Centos6.6x86_64 NFS客戶端(nfs-client2) 10.0.0.7
查看系統及內核版本信息
cat /etc/redhat-release
uname -r uname -m
Centos6.6默認沒有安裝NFS軟件包,此時我們可以使用yum install nfs-utils rpcbind -y 命令來安裝nfs軟件
#yum install nfs-utils rpcbind -y
#rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-11.el6.x86_64
nfs-utils-1.2.3-54.el6.x86_64
出現上述兩個軟件包,表示NFS服務端軟件安裝完畢,最好在客戶端都安裝nfs和rpc包,客戶端不配置nfs服務就可以。
NFS3種安裝方法
方法1: yum install nfs-utils rpcbind -y
方法2:通過系統光盤裏的rpm包安裝,命令如下:rpm -ivh nfs-utils-1.2.3-36.el6.x86_64.rpm
方法3: LANG=en
yum grouplist|grep -i nfs
yum groupinstall “NFS file server” -y
啟動NFS相關服務
啟動rpcbind服務
因為NFS及輔助程序都是基於rpc協議的,所以首先要確保系統中運行了rpcbind服務,相關啟動操作如下:
#/etc/init.d/rpcbind start
查看運行情況
#/etc/init.d/rpcbind status
已知某個端口號,查看服務名,或者已知服務名查看端口號的方法
[root@nfsserver ~]# lsof -i :111
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 1420 rpc 6u IPv4 10826 0t0 UDP :sunrpc
rpcbind 1420 rpc 8u IPv4 10829 0t0 TCP
:sunrpc (LISTEN)
rpcbind 1420 rpc 9u IPv6 10831 0t0 UDP :sunrpc
rpcbind 1420 rpc 11u IPv6 10834 0t0 TCP
:sunrpc (LISTEN)
[root@nfsserver ~]# netstat -lntup|grep rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0: LISTEN 1420/rpcbind
tcp 0 0 :::111 :::
LISTEN 1420/rpcbind
udp 0 0 0.0.0.0:747 0.0.0.0: 1420/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:
1420/rpcbind
udp 0 0 :::747 ::: 1420/rpcbind
udp 0 0 :::111 :::
1420/rpcbind
[root@nfsserver ~]# chkconfig --list rpcbind
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
查看nfs狀態和啟動nfs,主端口2049
[root@nfsserver ~]# /etc/init.d/nfs status
rpc.svcgssd is stopped
rpc.mountd is stopped
nfsd is stopped
rpc.rquotad is stopped
[root@nfsserver ~]# /etc/init.d/nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
[root@nfsserver ~]# netstat -lntup|grep 2049
tcp 0 0 0.0.0.0:2049 0.0.0.0: LISTEN -
tcp 0 0 :::2049 :::
LISTEN -
udp 0 0 0.0.0.0:2049 0.0.0.0: -
udp 0 0 :::2049 :::
-
我們要求rpcbind服務要先啟動於nfs,怎麽保證這個順序?
#less /etc/init.d/rpcbind
#! /bin/sh
#

rpcbind Start/Stop RPCbind

#

chkconfig: 2345 13 87

........
13表示啟動的順序,87表示結束的順序,和nfs對比下就知道了。

在日常企業管理中我們不用chkconfig來管理軟件的啟動,就是不會把服務做成chkconfig管理,統一將啟動命令放到rc.local,把這個文件作為服務器的檔案。這樣的好處是,一旦管理服務器人員離職,或者業務遷移時都可以通過/etc/rc.local很容易看到服務器的相關服務
NFS服務常見進程詳細說明
從上面NFS服務啟動過程的提示,可以看出NFS服務默認需要啟動,服務進程至少有:NFS quotas(rpc.rquotad)、NFS daemon(nfsd)、NFS mountd(rpc.mount)可以通過執行如下命令查看啟動NFS後,系統中運行的NFS相關進程。
#ps -ef|egrep “rpc|nfs”
如何知道進程的意思呢?#man 進程名
實戰配置NFS服務端
Nfs服務端的默認配置文件路徑為:/etc/exports,並且默認是空的
[root@nfsserver ~]# ls -l /etc/exports
-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports
[root@nfsserver ~]# cat /etc/exports
[root@nfsserver ~]#
Nfs默認配置文件是存在的,但是默認是沒有內容的,需要重新配置,有些linux版本可能不提供/etc/exports配置文件,這是就需要手動創建。
Exports配置文件的格式
NFS共享目錄 NFS 客戶端地址(參1,參2.....)客戶端地址2(參1,參2......)
Nfs 共享目錄 NFS客戶端地址(參1,參2......)
查看例子#man exports
EXAMPLE

sample /etc/exports file

   /               master(rw) trusty(rw,no_root_squash)
   /projects       proj*.local.domain(rw)
   /usr            *.local.domain(ro) @trusted(rw)
   /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
   /pub            *(ro,insecure,all_squash)
   /srv/www        -sync,rw server @trusted @external(ro)
   /foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
   /build          buildhost[0-9].local.domain(rw)

   The  first  line  exports  the entire filesystem to machines master and
   trusty.  In addition to write access, all uid squashing is  turned  off
   for  host trusty. The second and third entry show examples 

其中上述參數的含義如下:
1、nfs共享的目錄為:nfs服務端要共享的實際目錄,要用絕對路徑,註意共享目錄的本地權限,如果需要讀寫共享,一定要讓本地目錄被用戶讀寫。
常用配置格式說明 要共享的目錄 客戶端ip或ip段(參1,參2)
指定客戶端地址配置說明:
授權單一客戶端訪問NFS 具體地址10.0.0.30
授權整個網段可訪問NFS 10.0.0.0/24其中的24等同於255。255.255.0此配置為生產中最常見的配置
授權整個網段可訪問NFS 10.0.0.* 指定網段的另外寫法

實例共享/data目錄給192.168.154整個網段的主機讀寫即實現將nfs server上的/data目錄共享給192.168.154整個網段主機可讀寫。
[root@nfsserver ~]# cat /etc/exports
/data 192.168.154(rw,sync)
[root@nfsserver ~]# mkdir /data
[root@nfsserver ~]# /etc/init.d/nfs reload
[root@nfsserver ~]# exportfs -rv
最後兩條命令等價,平滑重啟nfs效果一樣。
[root@nfsserver ~]# showmount -e 127.0.0.1
Export list for 127.0.0.1:
/data 192.168.154

把自己作為客戶端查看下掛載情況
[root@nfsserver ~]# mount -t nfs 192.168.154.136:/data /mnt
[root@nfsserver ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_nfsserver-lv_root
18G 3.4G 13G 21% /
tmpfs 491M 76K 491M 1% /dev/shm
/dev/sda1 477M 29M 424M 7% /boot
/dev/sr0 4.4G 4.4G 0 100% /media/CentOS_6.6_Final
192.168.154.136:/data 18G 3.4G 13G 21% /mnt

NFS客戶端的配置:
啟動客戶端的rpcbind服務,設置開機自啟動
測試與nfs服務端的192.168.154.136是否聯通
[root@lamp01 ~]# /etc/init.d/rpcbind status
rpcbind (pid 27184) is running...
[root@lamp01 ~]# showmount -e 192.168.154.136
Export list for 192.168.154.136:
/data 192.168.154
這個showmount命令是客戶端裝了nfs才有的命令,建議客戶端也裝。如果連不上出現(no route to host)多數原因是防火墻沒關導致的。
A.ping 192.168.154.136
B.Telnet 192.168.154.136 111 排查端口
Showmount沒問題把共享目錄掛載到客戶端本地
[root@lamp01 ~]# mount -t nfs 192.168.154.136:/data /mnt
[root@lamp01 ~]# /etc/init.d/rpcbind status
rpcbind (pid 27184) is running...
[root@lamp01 ~]# showmount -e 192.168.154.136
Export list for 192.168.154.136:
/data 192.168.154

[root@lamp01 ~]# mount -t nfs 192.168.154.136:/data /mnt
[root@lamp01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_nfsserver-lv_root
18G 3.4G 13G 21% /
tmpfs 491M 224K 491M 1% /dev/shm
/dev/sda1 477M 29M 424M 7% /boot
/dev/sr0 4.4G 4.4G 0 100% /media/CentOS_6.6_Final
192.168.154.136:/data 18G 3.4G 13G 21% /mnt
然後我們在137/mnt目錄下創建個文件,提示被拒絕。
在服務端我們做調整查看cat /var/lib/nfs/estab,內容為nfs服務端所有參數信息。
Nfs服務端默認把讀寫權限給uid為65534這個用戶,我們找一下uid為65534這個用戶,grep 65534 /etc/passwd.我麽查看了/data目錄的用戶和屬組,發現root用戶對此目錄擁有讀寫權限。所以我們修改用戶屬組。
[root@nfsserver data]# cat /var/lib/nfs/etab
/data 192.168.154*(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
[root@nfsserver data]# grep 65534 /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfsserver data]# ls -ld /data
drwxr-xr-x 2 root root 4096 Jan 21 14:20 /data
[root@nfsserver data]# chown -R nfsnobody /data
最後為了讓我們重啟客戶端後掛載信息存在,將掛載命令寫入rc.local文件中。
技術分享圖片
工作中多臺客戶端同時讀寫管理共享目錄的文件,我們另外一臺139的客戶機做了和137一樣的 配置,實現了此功能,所以我們的客戶端在管理共享服務器的目錄時都被映射為一個用戶nfsnobody用戶。
NFS客戶端掛載拍錯思路
1、首先確認NFS服務配置和服務是ok。
#showmount -e localhost
最好在服務端掛載自己試試。
2、確認nfs客戶端showmount是否ok。
3、如果出現rpc program not registed懷疑是rpc服務啟動順序
4、the stale file handle error原因服務器上資源移動位置了,在客戶端使用unmout和mount重新掛載就可以了。
5、Nfs mount:dbserver retrying :/mntpoint
當前級別不是3,mounted守護進程沒喲啟動,用/etc/init.d/nfs.server腳本啟動nfs守護進程。

Showmount 命令說明
Showmount命令一般用於從NFS客戶端檢查NFS服務器共享目錄的情況。
-e參數顯示服務器輸出的目錄列表 showmount -e 10.0.0.7
-d參數顯示nfs服務器提供的共享的目錄
-a參數以ip;/dir 格式顯示nfs服務器的ip地址和可被掛載的目錄

Exportfs命令參數可以使用這個命令臨時共享
Exports -o rw,sync,all_squash,10.0.0.0/24:data
NFS server 端防火墻控制
真正企業生產環境的存儲服務器都屬於內網環境,都無需防火墻,因此,此處要配置的話就有兩種方法任選其一:
(1)僅允許內網ip訪問
iptalbes -A INPUT -s 10.0.0.0/24 --dport 111 -j ACCEPT
(2)允許ip端加端口訪問
iptabels -A INPUT -i eth1 -p udp -s 10.0.0.0/24 --dport 111 -j ACCEPT
iptabels -A INPUT -i eth1 -p udp -s 10.0.0.0/24 --dport 2049 -j ACCEPT
iptalbes -A INPUT -i eth1 -p udp -s 10.0.0.0/24 -j ACCEPT

NFS章節重點
1、NFS服務的訪問原理流程
2、NFS作為集群共享存儲角色的排障,高級優化
3、NFS作為集群共享存儲角色的排障,高級優化
4、Mount命令的知識及參數,-o(noatime,nodirtime,noexec,nosuid,rsize,wsize)等
5、Fstab文件知識
6、常用命令showmount,exportfs,umount(-lf),rpcinfo
7、NFS的有點、缺點、適合的應用場景,替代產品(mfs,glusterfs,fastdf)
8、了解autofs。
NFS參考文獻:http://www.tldp.org/HOWTO/NFS-HOWTO/intro.html
預習:
Rsync數據同步、備份
定時:rsync+cron定時任務
實時:rsync+sersync(inotify)
Nfs上級實戰及文件系統修復
NFS配置參數權限
NFS配置參數權限參數說明
NFS服務器端的權限設置,即/etc/exports文件配置格式中小括號裏面的參數,詳細參數說明
參數名稱 參數用途
Rw read-write表示可讀寫權限
Ro read-only,表示只讀權限
Sync 請求或寫入數據時,數據同步寫入到NFSSEVER 硬盤
Async 請求或寫入數據時,先返回請求,再將數據寫入內存或硬盤中即異步寫入數據。此參數可以提升NFS性能,
all_squash 不管訪問NFSserver 共享目錄的用戶身份如何,它的權限都會壓縮成匿名用戶,同時它的uid和gid都會變成nfsnobody賬戶
NFS服務重點知識梳理總結
使得NFS CLIENT 端可寫的服務端配置條件
當多個NFS客戶端以NFSF方式寫入修改服務器端文件系統時,需要具有以下個權限:
(a)NFS服務器/etc/exports 設置需要開放可寫入的權限,即服務端的共享權限
(b)NFS服務器實際要共享的NFS目錄權限具有可寫入w的權限,即服務端本地目錄的安全權限。
(c)每臺機器都對應存在和nfs默認配置uid65534的nfsnobody用戶確保所欲客戶端訪問權限統一,否則每個機器需要同時建立相同uid的用戶,並覆蓋NFS的默認配置)
當滿足上述三個條件,多個nfs客戶端才能具有互相寫入,互相修改其他主機寫入文件的權限,這在開篇講過的大規模集群環境,作為集群共享存儲時尤為註意。
到這步為止,NFS服務端一個nfs共享目錄、data共享給10.0.0.0/24內主機可讀寫就配置完了。下面還需要在客戶端主機掛載服務端共享的/data,才可以在客戶端真正讀寫到該共享目錄。
NFS客戶端掛載命令
(1)這裏先強調下客戶端掛載的命令格式
掛載命令 掛載格式類型 nfs共享服務器目錄 nfs客戶端掛載目錄
Mount -t nfs 10.0.0.7:/data /mnt(必須存在)
完整掛載命令為:mount -t nfs 10.0.0.7:/data /mnt 此命令在客戶端執行
NFS客戶端開機自啟動掛載
配置mount掛載命令使開機自動配置,兩種方法其中一種是無效
A./etc/rc.local裏
偶爾開機掛載不上,工作中除了開機自啟動配置,還要對是否掛載上監控。
b./etc/fstab
問題nfs網絡文件系統不要放在fstab裏實現開機掛載,原因如下:
1、fstab優先於網絡被linux系統加載。網絡沒有啟動執行fstab會導致連不上NFS服務器無法實現開機掛載。
2、即使是本地的文件系統,也要註意,fstab最後兩列要設置0 0,否則可能導致服務啟動服務器問題
NFS客戶端掛載深入
在nfs服務端可以通過cat /etc/var/lib/nfs/etab 查看服務端的參數細節。
在nfs客戶端可以通過cat /proc/mounts 查看mount掛載參數細節。
(1)mount 掛載及fstab 文件的參數表格
通過nfs客戶端測試掛載獲取的默認掛載參數:
#grep mnt / proc/mounts
技術分享圖片
2使用linux rescue(救援模式)修復/etc/fstab(改錯配置然後重啟系統)
3、root密碼忘記了,想重新獲取root密碼怎麽做?
重要問題:
1、有關NFS客戶端普通用戶寫NFS的問題
A.為什麽要普通用戶寫NFS?
B. exports 加all_squash普通用戶才能壓縮成匿名用戶
/data 10.0.0.0/24(rw,sync,all_squash),
如果不加all_squash這個參數的話,切換到普通用戶將沒有權限創建文件在共享目錄,無法管理。

NFS企業級網絡文件共享