NFS是Network File System的縮寫,中文意思是網絡文件系統html
它的主要功能是經過網絡(通常是局域網)讓不一樣的主機系統之間能夠共享文件或目錄前端
NFS==網絡共享文件系統linux
互聯網中小型網站集羣架構後端經常使用NFS進行數據共享web
若是大型網站,那麼有可能還會用到更復雜的分佈式文件系統,例如:Moosefs(mfs)、GlusterFS、FastDFS vim
擴展:NFS網絡文件系統很像Windows系統的網絡共享,可是沒法部署在windows系統上,NFS服務windows
只能應用在Linux系統上,FTP 、Samba服務均都支持Linux和window後端
實現web集羣中服務器數據一致性安全
a. 實現數據信息的共享服務器
b. 實現數據信息的一致網絡
NFS在網絡文件共享服務做用總結:
1. 負載均衡設備會將訪問流量,進行分流,但不便於文件和數據的互相訪問;
2. 利用服務器間的數據同步可使用戶之間數據互訪,但同步管理操做過於複雜;
3. 利用NFS服務器能夠統一管理數據,使用戶之間能夠順利互訪
硬件存儲:IBM oracle(sun)EMC(去IOE)
軟件存儲:NFS mfs ftp samba
簡單描述NFS工做原理:
1. 部署好NFS服務,在NFS服務端建立一個video共享目錄
2. web服務器(NFS客戶端)建立一個本地video目錄,做爲一個掛載點
3. web服務器經過mount命令實現網絡掛載,將nfs服務器上video目錄掛載到本地video目錄掛載點上
4. web服務器(NFS客戶端)上在video目錄中,增長 刪除 修改數據的操做,都等價於在NFS服務端
video 目錄中的操做
根據上圖能夠簡單理解RPC至關於中介服務:
默認NFS服務啓動會產生多個進程,多個端口號信息,而且產生的多個端口號信息會在服務重啓時,發生變化,所以不便於nfs客戶端進行鏈接訪問
在擁有rpc服務端以後,可讓nfs客戶端直接訪問rpc服務,提供中介服務,便於nfs客戶端進行鏈接訪問
因每一個服務進程對應的端口號不一樣,而且是隨機的,全部對於客戶端來說不知道該訪問哪一個端口。
NFS服務端的每一個服務進程都會向RPC服務進程註冊,客戶端也只需訪問RPC服務的111端口便可,由RPC服務來告訴客戶端訪問服務的端口號。
NFS服務工做流程圖:
01. 啓動rpc服務,創建中介服務
02. 啓動nfs服務,開啓進程信息(房源信息),向rpc服務進行註冊
03. rpc服務接收到nfs服務進程信息(房源信息)
04. nfs客戶端向rpc服務發出請求(訪問共享目錄)
05. rpc服務響應nfs客戶端請求
06. nfs客戶端與nfs服務端共享目錄創建網絡鏈接,實現數據網絡存儲
當訪問程序經過NFS客戶端向NFS服務器存取文件時,其請求數據流程大體以下:
1. 首先用戶訪問網站程序,由程序在NFS客戶端上發出存取NFS文件的請求,這時NFS客戶端(即執行程序的服務器)的RPC服務(rpcbind服務)就會經過網絡向NFS服務器端的RPC服務(rpcbind服務)的111端口發出NFS文件存取功能的詢問請求。
2. NFS服務器端的RPC服務(rpcbind服務)找到對應的已註冊的NFS端口後,通知NFS客戶端的RPC服務(rpcbind服務)。
3. 此時NFS客戶端獲取到正確的端口,並與NFS daemon聯機存取數據。
4. NFS客戶端把數據存取成功後,返回給前端訪問程序,告知用戶存取結果,做爲網站用戶,就完成了一次存取操做。
更多的NFS相關信息能夠參考:
http://www.citi.umich.edu/projects/nfsv4/linux/
http://www.vanemery.com/Linux/NFSv4/NFSv4-no-rpcsec.html
http://www.ibm.com/developerworks/cn/linux/l-network-filesystems/
http://www.tldp.org/HOWTO/NFS-HOWTO/index.html
rpm -qa|grep -E "nfs-utils|rpcbind"
yum install -y nfs-utils rpcbind
[root@nfs01 ~]# rpm -qa|grep -E "nfs-utils|rpcbind" [root@nfs01 ~]# yum install -y nfs-utils rpcbind [root@nfs01 ~]# rpm -qa|grep -E "nfs-utils|rpcbind" nfs-utils-lib-1.1.5-13.el6.x86_64 rpcbind-0.2.0-13.el6_9.1.x86_64 nfs-utils-1.2.3-75.el6_9.x86_64 |
3.1.2 第二個里程:編寫nfs服務配置文件
NFS服務的默認配置文件/etc/exports是安裝完軟件就有的,而且默認是空的,須要用戶自行配置。
vim /etc/exports
1. 定義共享目錄 ---------> /data
2. 定於容許使用共享目錄的主機或網段地址信息
3. 定義共享目錄權限信息(注意:「24和(」之間沒有空格)
/data 172.16.1.0/24(rw,sync,all_squash)
[root@nfs01 ~]# vim /etc/exports # 01.定義共享目錄 02.定於容許使用共享目錄的主機或網段地址信息(03.定義共享目錄權限信息) /data 172.16.1.0/24(rw,sync,all_squash) |
3.1.3 第三個里程:建立共享目錄
mkdir /data
chown -R nfsnobody.nfsnobody /data/
[root@nfs01 ~]# mkdir /data [root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data/ [root@nfs01 ~]# ll /data/ -d drwxr-xr-x 2 nfsnobody nfsnobody 4096 Jan 24 12:11 /data/ |
nfsnobody是默認用戶
/etc/init.d/rpcbind start
/etc/init.d/nfs start
[root@nfs01 wuhuang]# /etc/init.d/rpcbind start Starting rpcbind: [ OK ] [root@nfs01 wuhuang]# /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 ] |
注意:要先啓動rpcbind ,後啓動 nfs
rpcinfo -p 172.16.1.31 ---檢查rpc服務中是否有註冊的進程服務和對應端口號信息
showmount -e 172.16.1.31 ---檢查是否有能夠共享的目錄
[root@nfs01 wuhuang]# rpcinfo -p 172.16.1.31 program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100011 1 udp 875 rquotad 100011 2 udp 875 rquotad 100011 1 tcp 875 rquotad 100011 2 tcp 875 rquotad 100005 1 udp 62058 mountd 100005 1 tcp 53154 mountd 100005 2 udp 22521 mountd 100005 2 tcp 30878 mountd 100005 3 udp 56674 mountd 100005 3 tcp 12281 mountd 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 2 tcp 2049 nfs_acl 100227 3 tcp 2049 nfs_acl 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 2 udp 2049 nfs_acl 100227 3 udp 2049 nfs_acl 100021 1 udp 9976 nlockmgr 100021 3 udp 9976 nlockmgr 100021 4 udp 9976 nlockmgr 100021 1 tcp 24261 nlockmgr 100021 3 tcp 24261 nlockmgr 100021 4 tcp 24261 nlockmgr [root@nfs01 wuhuang]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 |
3.2 NFS客戶端部署流程
rpm -qa|grep -E "nfs-utils|rpcbind"
yum install nfs-utils rpcbind -y
[root@backup ~]# rpm -qa|grep -E "nfs-utils|rpcbind" nfs-utils-lib-1.1.5-13.el6.x86_64 rpcbind-0.2.0-13.el6_9.1.x86_64 nfs-utils-1.2.3-75.el6_9.x86_64 |
3.2.2 第二個里程碑:檢查局域網中是否存在共享存儲服務(目錄)
rpcinfo -p 172.16.1.31 ---rpcinfo命令須要安裝rpcbind軟件才能擁有
showmount -e 172.16.1.31
[root@backup ~]# rpm -qf `which rpcinfo` rpcbind-0.2.0-13.el6_9.1.x86_64 [root@backup ~]# rpm -qf `which showmount` nfs-utils-1.2.3-75.el6_9.x86_64 [root@backup ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24 |
3.2.3 第三個里程碑:實現共享目錄應用(網絡掛載應用)
當客戶端沒有安裝nfs相關軟件
掛載失敗:沒有安裝nfs相關軟件
[root@wuhuang ~]# mount -t nfs 172.16.1.31:/data/ /mnt/ mount: wrong fs type, bad option, bad superblock on 172.16.1.31:/data/, missing codepage or helper program, or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program) In some cases useful info is found in syslog - try dmesg | tail or so |
當客戶端安裝了nfs相關軟件
掛載成功:安裝好nfs先關軟件
[root@backup ~]# mount -t nfs 172.16.1.31:/data/ /mnt/ [root@backup ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 20G 1.5G 17G 9% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot 172.16.1.31:/data/ 20G 1.5G 17G 9% /mnt |
第4章 NFS服務常見進程詳解
[root@nfs01 ~]# ps -ef |egrep "rpc|nfs" rpc 1833 1 0 10:41 ? 00:00:00 rpcbind root 1869 2 0 10:41 ? 00:00:00 [rpciod/0] root 1878 1 0 10:41 ? 00:00:00 rpc.rquotad < -磁盤配額進程(remote quote server) root 1883 1 0 10:41 ? 00:00:00 rpc.mountd < - 權限管理驗證等(NFS mount daemon) root 1890 2 0 10:41 ? 00:00:00 [nfsd4] root 1891 2 0 10:41 ? 00:00:00 [nfsd4_callbacks] root 1892 2 0 10:41 ? 00:00:00 [nfsd] < - NFS主進程 root 1893 2 0 10:41 ? 00:00:00 [nfsd] < - NFS主進程,管理登陸, ID身份判別 root 1894 2 0 10:41 ? 00:00:00 [nfsd] root 1895 2 0 10:41 ? 00:00:00 [nfsd] root 1896 2 0 10:41 ? 00:00:00 [nfsd] root 1897 2 0 10:41 ? 00:00:00 [nfsd] root 1898 2 0 10:41 ? 00:00:00 [nfsd] < - NFS主進程 root 1899 2 0 10:41 ? 00:00:00 [nfsd] root 1930 1 0 10:41 ? 00:00:00 rpc.idmapd < - name mapping daemon 用戶壓縮/用戶映射(記錄) root 2509 1231 0 17:42 pts/0 00:00:00 egrep rpc|nfs |
服務或進程名 |
用途說明 |
nfsd(rpc.nfsd) |
rpc.nfsd的主要功能是管理NFS客戶端是否可以登入NFS服務器端主機,其中還包括登入者的ID判別等 |
mountd (rpc mountd) |
注意:這個/etc/exports文件也是咱們用來管理NFS共享目錄的使用權限與安全設置的地方,特別強調,NFS自己設置的是網絡共享權限,整個共享目錄的權限還和目錄自身的系統權限有關
|
rpc.lockd (非必要) |
用來鎖定文件,用於多客戶端同時寫入 |
rpc.statd(非必要) |
檢查文件的一致性,與rpc.lockd有關。c 、d 兩個服務須要客戶端,服務器端同時開啓才能夠;rpc.statd監聽來自其餘主機重啓的通知,而且管理當本地系統重啓時主機列表 |
rpc.idmapd |
名字映射後臺進程 |
重點掌握:
rpc.statd主要做用:檢查數據存儲的一致性
rpc.rquotad主要做用:控制磁盤配額
rpc.mountd主要做用:覈對/etc/exports配置文件中的權限,和NFS服務器端本地文件系統權限
rpc.idpamd主要做用:實現用戶壓縮/映射(經用戶壓縮後,身份轉換爲nfsnobody)
/etc/exports文件配置格式爲:
NFS共享目錄 NFS客戶端地址1(參數1,參數2,...) 客戶端地址2(參數1,參數2,...)
或
NFS 共享目錄 NFS客戶端地址(參數1,參數2,...)
查看exports語法文件格式幫助的方法爲:
執行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) |
爲NFS服務器端要共享的實際目錄,要用絕對路徑,如(/data)。注意共享目錄的本地權限,若是須要讀寫共享,必定要讓本地目錄能夠被NFS客戶端的用戶(nfsnobody)讀寫。
爲NFS服務器端受權的可訪問共享目錄的NFS客戶端地址,能夠爲單獨的IP地址或主機名、域名等,也能夠爲整個網段地址。還能夠用「*」來匹配全部客戶端服務器,這裏所謂的客戶端通常來講是前端的業務的業務服務器,例如:web服務。
對受權的NFS客戶端的訪問權限設置。
nfs權限(共享目錄) nfs配置的/etc/exports /data 172.16.1.0/24(rw)
本地文件系統權限, 掛載目錄的權限rwxr-xr-x root root /data
參數名稱 |
參數用途 |
rw < -重點掌握 |
read-write,表示可讀可寫模式---設置共享目錄讀寫模式 |
ro |
read-only,表示只讀權限---設置共享目錄只讀模式 |
sync < -重點掌握 |
請求或寫入數據時,數據同步寫入到NFS Server的硬盤後才返回。 優勢:數據安全不會丟;缺點:性能比不啓動該參數要差 ---採用同步方式存儲數據,存儲數據到硬盤中 |
async < -重點掌握 |
寫入時數據會先寫到內存緩衝區,直到硬盤有空擋纔會寫人磁盤,這樣能夠提高寫入效率!風險爲若服務器宕機或不正常關機,會損失緩衝區中未寫入磁盤的數據(解決辦法:服務器主板電池或加UPS,AB(雙路電源)不間斷電源)! 停電---ups---發電機 ---採用異步方式存儲數據,存儲數據到內存中 |
no_root_squash |
保持root用戶不進行壓縮 訪問NFS Server共享目錄的用戶若是是root的話,它對該共享目錄具備root權限,這個配置本來是爲無盤客戶端準備的,用戶應避免使用。 |
root_squash |
若是訪問NFS Server共享目錄的用戶是root,則它的權限將被壓縮成匿名用戶,同時,它的UID和GID一般會變爲nfsnobody帳號身份 |
all_squash < -重點掌握 |
無論訪問NFS Server共享目錄的用戶身份如何,它的權限都將被壓縮成匿名用戶,同時它的UID和GID都會變成nfsnobody帳號身份。在早期多個NFS客戶端同時讀寫NFS Server數據時,這個參數頗有用 在生產中配置NFS的重要技巧 1. 確保全部客戶端服務器對NFS共享目錄具有相同的用戶訪問權限。 a. all_squash把全部客戶端都壓縮成固定的匿名用戶(UID相同) b. 就是anonuid,anongid指定的UID和GID的用戶 2. 全部的客戶端和服務器端都須要有一個相同的UID和GID的用戶,即nfsnobody(UID必須相同) |
總結:
1. rw參數:可讀寫
2. ro參數:只讀
/data 172.16.1.0(ro,sync,all_squash) :ro權限給開發人員用於讀取配置文件,而不能修改
3. sync參數的做用:同步,保證數據的可靠性
4. async參數:ups AB雙路電源
1. no_all_squash參數:全部用戶都不映射(什麼身份過來就是什麼身份)
2. all_squash參數:全部用戶都映射(成指定nfsnobody)
3. root_squash參數:root用戶映射(成指定nfsnobody)
4. no _root_squash參數:不對root用戶映射(進來NFS服務器後是root身份,權限 很大)
注意:
/etc/init.d/nfs reload ---平滑重啓(只是從新加載了配置文件,已有的鏈接不會斷開)
/etc/init.d/nfs restart ---重啓(從新將服務關閉再開啓,已有的鏈接會斷開)
1. /data/共享目錄權限固定爲www用戶管理
2. 在nfs配置文件中,設置all_squash所有用戶都映射參數
3. 讓nfs客戶端能夠向共享目錄存儲數據
chown -R www.www /data/
[root@nfs01 ~]# chown -R www.www /data/ [root@nfs01 ~]# ll -d /data/ drwxr-xr-x 2 www www 4096 Jan 25 21:04 /data/ |
5.5.2 第二個里程:編寫nfs配置文件
1. 查看www用戶的UID,GID信息
id www
[root@nfs01 ~]# useradd -s /sbin/nologin -M www -u 502 [root@nfs01 ~]# id www uid=502(www) gid=502(www) groups=502(www) |
2. 編輯配置文件:vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=502,anongid=502) |
3. 平滑重啓:
/etc/init.d/nfs reload |
anonuid和anongid參數做用說明:
將客戶端全部用戶,映射爲指定用戶,而再也不是默認nfsnobody用戶了
ps:兩點注意
01. 客戶端要有nfs配置文件anonuid或者anongid指定用戶,此處是www
02. 客戶端和服務端建立默認映射用戶,uid和gid信息須要保持一致,即客戶端的www用戶的UID和
GID也要是502
(1) 先卸載 umount /mnt
(2) 再掛載 mount -t nfs 172.16.1.31:/data /mnt
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt [root@backup ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 20G 1.5G 17G 9% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot 172.16.1.31:/data 20G 1.5G 17G 9% /mnt |
5.5.4 第四個里程:進行數據存儲測試
建立測試文件查看屬主信息是否爲www
[root@backup mnt]# touch /mnt/wuhuang.txt [root@backup mnt]# ll /mnt/wuhuang.txt -rw-r--r-- 1 www www 0 Jan 25 21:04 /mnt/wuhuang.txt 服務端 [root@nfs01 ~]# ll /data/wuhuang.txt -rw-r--r-- 1 www www 0 Jan 25 21:04 /data/wuhuang.txt |