四、nfs(存儲服務器)

1.NFS基本概述

NFS是Network File System的縮寫及網絡文件系統。NFS的主要功能是經過局域網絡讓不一樣的主機系統之間能夠共享文件或目錄。
一般中小企業首選NFS做爲集羣架構的存儲,但若是是大型網站, 會用到複雜的分佈式文件系統,如FastDFS,glusterfs等等css

那麼咱們爲何要使用數據存儲共享服務?
1.實現多臺服務器之間數據共享
2.實現多臺服務器之間數據一致前端

2.NFS應用場景

下面我將經過圖解給你們展現集羣須要共享存儲服務的理由。
1.A用戶上傳圖片通過負載均衡,負載均衡將上傳請求調度至WEB1服務器上。
2.B用戶訪問A用戶上傳的圖片,此時B用戶被負載均衡調度至WEB2上,由於WEB2上沒有這張圖片,因此B用戶沒法看到A用戶傳的圖片。

若是有共享存儲的狀況
1.A用戶上傳圖片不管被負載均衡調度至WEB1仍是WEB2, 最終數據都被寫入至共享存儲
2.B用戶訪問A用戶上傳圖片時,不管調度至WEB1仍是WEB2,最終都會上共享存儲訪問對應的文件,這樣就能夠訪問到資源了
node

3.NFS實現原理


本地文件操做方式linux

1.當用戶執行mkdir命令, 該命令會調用shell解釋器翻譯給內核。
2.內核解析完成後會驅動對應的硬件設備,完成相應的操做。

NFS實現原理(須要先了解[程序|進程|線程])web

1.用戶進程訪問NFS客戶端,使用不一樣的函數對數據進行處理
2.NFS客戶端經過TCP/IP的方式傳遞給NFS服務端。
3.NFS服務端接收到請求後,會先調用portmap進程進行端口映射。
4.nfsd進程用於判斷NFS客戶端是否擁有權限鏈接NFS服務端。
5.Rpc.mount進程判斷客戶端是否有對應的權限進行驗證。
6.idmap進程實現用戶映射和壓縮
7.最後NFS服務端會將對應請求的函數轉換爲本地能識別的命令,傳遞至內核,由內核驅動硬件。
注意: rpc是一個遠程過程調用,那麼使用nfs必須有rpc服務

4.NFS服務安裝(服務端)

4.0環境準備

服務器系統 角色 外網IP 內網IP
CentOS 7.5 NFS服務端(nfs) eth0:10.0.0.31 eth1:172.16.1.31
CentOS 7.5 NFS客戶端(backup) eth0:10.0.0.41 eth1:172.16.1.41

注意: 不要忘記關閉防火牆, 以避免默認的防火牆策略禁止正常的NFS共享服務shell

4.1.關閉防火牆

#1.關閉Firewalld防火牆
[root@nfs ~]# systemctl disable firewalld
[root@nfs ~]# systemctl stop firewalld

#2.關閉selinux防火牆
[root@nfs ~]# sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config
[root@nfs ~]# setenforce 0

4.2.安裝nfs-server服務

[root@nfs ~]# yum -y install nfs-utils

4.3.配置nfs服務

nfs服務程序的配置文件爲/etc/exports,須要嚴格按照共享目錄的路徑 容許訪問的NFS客戶端(共享權限參數)格式書寫,定義要共享的目錄與相應的權限,具體書寫方式以下圖所示。
vim

4.4.配置場景,將nfs服務端的/data目錄共享給172.16.1.0/24網段內的全部主機

1) 全部客戶端主機都擁有讀寫權限
2) 在將數據寫入到NFS服務器的硬盤中後纔會結束操做,最大限度保證數據不丟失
3) 將全部用戶映射爲本地的匿名用戶(nfsnobody)後端

#NFS客戶端地址與權限之間沒有空格
[root@nfs ~]# vim /etc/exports   
/data   172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

#在nfs服務器建立用戶
groupadd -g666 www
useradd www -u666 -g www

#在NFS服務器上創建用於NFS文件共享的目錄,並設置對應權限
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R www.www /data

#NFS共享目錄會記錄至/var/lib/nfs/etab,若是該目錄不存在共享信息,請檢查/etc/exports是否配置錯誤

4)在使用NFS服務進行文件共享以前,須要使用RPC(Remote Procedure Call遠程過程調用服務將NFS服務器的IP地址和端口號信息發送給客戶端。所以,在啓動NFS服務以前,須要先重啓並啓用rpcbind服務程序,同時都加入開機自啓動緩存

#加入開機自啓
[root@nfs ~]# systemctl enable rpcbind nfs-server

#啓動服務
[root@nfs ~]# systemctl restart rpcbind nfs-server

5.NFS掛載卸載

(web/backup)NFS客戶端的配置步驟也十分簡單。先使用showmount命令,查詢NFS服務器的遠程共享信息,其輸出格式爲「共享的目錄名稱 容許使用客戶端地址」。安全

1.安裝客戶端工具,僅啓動rpcbind服務
[root@nfs-client ~]# yum -y install nfs-utils rpcbind
[root@nfs-client ~]# systemctl restart rpcbind

2.客戶端使用showmount -e查看遠程服務器rpc提供的可掛載nfs信息
[root@nfs-client ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

3.在NFS客戶端建立一個掛載目錄, 使用mount命令並結合-t參數, 指定要掛載的文件系統的類型, 並在命令後面寫上服務器的IP地址, 以及服務器上的共享目錄, 最後須要寫上要掛載到本地系統(客戶端)的目錄。
[root@nfs-client ~]# mkdir /nfsdir
[root@nfs-client ~]# mount -t nfs 172.16.1.31:/data /nfsdir 

#查看掛載信息(mount也能夠查看)
[root@nfs-client ~]# df –h
Filesystem           Size  Used Avail Use% Mounted on
/dev/sda3             62G  845M   58G   2% /
tmpfs                244M     0  244M   0% /dev/shm
/dev/sda1            190M   26M  155M  14% /boot
172.16.1.31:/data   62G  880M   58G   2% /nfsdir

4.掛載成功後能夠進行增刪改操做
#使用客戶端往nfs存儲寫入
[root@nfs-client ~]# echo "nfs-client" >> /nfsdir/test.txt 

#檢查nfs服務端是否存在客戶端建立的新文件
[root@nfs-client ~]# cat /data/test.txt
nfs-client

5.若是但願NFS文件共享服務能一直有效,則須要將其寫入到fstab文件中
[root@nfs-client ~]# vim /etc/fstab
172.16.1.31:/data /nfsdir nfs defaults 0 0

6.若是不但願使用NFS共享, 可進行卸載
[root@nfs-client ~]# umount /nfsdir 

#注意:卸載的時候若是提示」umount.nfs: /nfsdir: device is busy」  
#1.切換至其餘目錄, 而後在進行卸載。
#2.NFS Server宕機, 強制卸載umount -lf /nfsdir

7.在企業工做場景,一般狀況NFS服務器共享的只是普通靜態數據(圖片、附件、視頻),不須要執行suid、exec等權限,掛載的這個文件系統只能做爲數據存取之用,沒法執行程序,對於客戶端來說增長了安全性。例如: 不少木馬篡改站點文件都是由上傳入口上傳的程序到存儲目錄。而後執行的。
#經過mount -o指定掛載參數,禁止使用suid,exec,增長安全性能
[root@nfs-client ~]# mount -t nfs -o nosuid,noexec,nodev 172.16.1.31:/data /mnt

8.有時也須要考慮性能相關參數[可選]
#經過mount -o指定掛載參數,禁止更新目錄及文件時間戳掛載
[root@nfs-client ~]# mount -t nfs -o noatime,nodiratime 172.16.1.31:/data /mnt

6.NFS配置詳解

執行man exports命令,而後切換到文件結尾,能夠快速查看以下樣例格式:

nfs共享參數 參數做用
rw* 讀寫權限
sync* 同時將數據寫入到內存與硬盤中,保證不丟失數據
all_squash 不管NFS客戶端使用什麼帳戶訪問,均映射爲NFS服務器的匿名用戶(經常使用)
anonuid* 配置all_squash使用,指定NFS的用戶UID,必須存在系統
anongid* 配置all_squash使用,指定NFS的用戶UID,必須存在系統
ro 只讀權限
root_squash 當NFS客戶端以root管理員訪問時,映射爲NFS服務器的匿名用戶(不經常使用)
no_root_squash 當NFS客戶端以root管理員訪問時,映射爲NFS服務器的root管理員(不經常使用)
no_all_squash 不管NFS客戶端使用什麼帳戶訪問,都不進行壓縮
async 優先將數據保存到內存,而後再寫入硬盤;這樣效率更高,但可能會丟失數據

6.1.驗證ro權限實踐

1) 服務端修改rw爲ro參數
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)
[root@nfs ~]# systemctl restart nfs-server

2) 客戶端驗證
[root@nfs-client ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@nfs-client ~]# df -h
Filesystem         Size  Used Avail Use% Mounted on
172.16.1.31:/data   98G  1.7G   97G   2% /mnt

# 發現沒法正常寫入文件
[root@backup mnt]# touch file
touch: cannot touch ‘file’: Read-only file system

6.2.驗證all_squash、anonuid、anongid權限

1) NFS服務端配置
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

2) 服務端須要建立對應的用戶
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -u 666 -g 666 www
[root@nfs ~]# id www
uid=666(www) gid=666(www) groups=666(www)

3) 重載nfs-server
[root@nfs ~]# systemctl restart nfs-server
[root@nfs ~]# cat /var/lib/nfs/etab 
/data   172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,secure,root_squash,all_squash)

4) 受權共享目錄爲www
[root@nfs ~]# chown -R www.www /data/
[root@nfs ~]# ll -d /data/
drwxr-xr-x 3 www www 53 Sep  3 02:08 /data/

5) 客戶端驗證
[root@backup ~]# umount /mnt/
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt

6) 客戶端查看到的文件,身份是666
[root@backup ~]# ll /mnt/
drwxr-xr-x 2 666 666 6 Sep  3 02:08 rsync_dir
-rw-r--r-- 1 666 666 0 Sep  3 02:08 rsync_file

7) 客戶端依舊能往/mnt目錄下寫文件
[root@backup mnt]# touch fff
[root@backup mnt]# mkdir 111
[root@backup mnt]# ll
drwxr-xr-x 2 666 666 6 Sep  3 03:05 111
-rw-r--r-- 1 666 666 0 Sep  3 03:05 fff

8) 建議:將客戶端也建立一個uid爲666,gid爲666,統一身份,避免後續出現權限不足的狀況
[root@backup mnt]# groupadd -g 666 www
[root@backup mnt]# useradd -g 666 -u 666 www
[root@backup mnt]# id www
uid=666(www) gid=666(www) groups=666(www)

9) 最後檢查文件的身份
[root@backup mnt]# ll /mnt/
total 4
drwxr-xr-x 2 www www 6 Sep  3 03:05 111
-rw-r--r-- 1 www www 0 Sep  3 03:05 fff

7.NFS存儲小結

7.1.NFS存儲優勢

1.NFS文件系統簡單易用、方便部署、數據可靠、服務穩定、知足中小企業需求。
2.NFS文件系統內存放的數據都在文件系統之上,全部數據都是能看得見。

7.2.NFS存儲侷限

1.存在單點故障, 若是構建高可用維護麻煩web->nfs()->backup
2.NFS數據明文, 並不對數據作任何校驗。
3.客戶端掛載NFS服務沒有密碼驗證, 安全性通常(內網使用)

7.3.NFS應用建議

1.生產場景應將靜態數據儘量往前端推, 減小後端存儲壓力
2.必須將存儲裏的靜態資源經過CDN緩存jpg\png\mp4\avi\css\js
3.若是沒有緩存或架構自己歷史遺留問題太大, 在多存儲也無用

8.NFS案例實踐

準備3臺虛擬機服務器,而且請按照要求搭建配置NFS服務。
NFS服務端(A)
NFS客戶端(B)
NFS客戶端(C)
1.在NFS服務端(A)上共享/data/w(可寫)及/data/r(只讀)
2.在NFS客戶端(B/C)上進行掛載
環境準備

服務器系統 角色 IP
CentOS 7.6 NfsServer(nfs) 172.16.1.31
CentOS 7.6 NfsClient(backup) 172.16.1.41
CentOS 7.6 NfsClient(web01) 172.16.1.7

8.1.NFS服務端配置

#1.安裝nfs
[root@nfs01 ~]# yum install -y nfs-utils

#2.配置nfs
[root@nfs01 ~]# cat /etc/exports
/data/r 172.16.1.0/24(ro,sync,all_squash,anonuid=666,anongid=666)
/data/w 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

#3.建立對應用戶
[root@web01 ~]# groupadd -g 666 www
[root@web01 ~]# useradd -u 666 -g www www
[root@nfs01 ~]# id www
uid=666(www) gid=666(www) groups=666(www)

#4.建立共享目錄
[root@nfs01 ~]# mkdir /data/{r,w} -p
[root@nfs01 ~]# chown -R www.www /data/
//5.重啓NFS
[root@nfs01 ~]# systemctl restart rpcbind nfs-server

8.2.NFS-客戶端配置

#1.安裝nfs工具
[root@backup-41 ~]# yum install nfs-utils -y
[root@backup-41 ~]# systemctl restart rpcbind

#2.準備本地掛載點目錄
[root@backup-41 ~]# mkdir /data/{r,w} -p

#3.準備對應用戶
[root@backup-41 ~]# groupadd -g 666 www
[root@backup-41 ~]# useradd -u 666 -g www www
[root@backup-41 ~]# id www
uid=666(www) gid=666(www) groups=666(www)

#4.查看遠端共享的nfs目錄
[root@backup-41 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/w 172.16.1.0/24
/data/r 172.16.1.0/24

#5.掛載對應目錄站點
[root@backup-41 ~]# mount -t nfs  172.16.1.31:/data/w /data/w/
[root@backup-41 ~]# mount -t nfs 172.16.1.31:/data/r /data/r/
[root@backup-41 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
172.16.1.31:/data/w       50G  1.6G   49G   4% /data/w
172.16.1.31:/data/r       50G  1.6G   49G   4% /data/r

#6.測試/data/r讀權限
[www@backup-41 r]$ pwd
/data/r
[www@backup-41 r]$ cat edu.com
This is Nfs to Oldboy
[www@backup-41 r]$ touch edu
touch: cannot touch ‘edu’: Read-only file system

#7.測試/data/w寫權限
[root@backup-41 r]# cd /data/w/
[root@backup-41 w]# pwd
/data/w
[root@backup-41 w]# touch bbbback
[root@backup-41 w]# ll
total 0
-rw-r--r-- 1 www www 0 Jul 26 09:22 backup_w
-rw-r--r-- 1 www www 0 Jul 26 09:26 bbbback

#8.實現開機自動掛載
[root@backup-41 ~]# echo "172.16.1.31:/data/r /data/r nfs defaults 0 0" >>/etc/fstab
[root@backup-41 ~]# echo "172.16.1.31:/data/w /data/w nfs defaults 0 0" >>/etc/fstab

#注意: 當將遠程掛載設備寫入/etc/fstab文件後,必定要執行mount -a
[root@backup-41 ~]# mount -a
[root@backup-41 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
172.16.1.31:/data/r       50G  1.6G   49G   4% /data/r
172.16.1.31:/data/w       50G  1.6G   49G   4% /data/w
#若是編寫錯誤會有以下提示
[root@backup-41 ~]# mount -a
mount.nfs: access denied by server while mounting 172.16.1.31:/dataa/w

#9.卸載nfs
    #1.正常卸載
[root@backup-41 ~]# umount /data/w/
    #2.強制卸載
[root@backup-41 ~]# umount -lf /data/w/

8.3.NFS擴展項

#1.擴展:無需重啓NFS服務平滑加載配置文件
[root@nfs01 r]# cat /etc/exports
/data/r 172.16.1.0/24(ro)
/data/p 172.16.1.0/24(ro)
/data/w 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

[root@nfs01 r]# exportfs -rv
exporting 172.16.1.0/24:/data/w
exporting 172.16.1.0/24:/data/p
exporting 172.16.1.0/24:/data/r

#2.擴展:nfs客戶端掛載參數
[root@backup-41 ~]# mount.nfs4 -o noatime,nodiratime,noexec,nodev,nosuid 172.16.1.31:/data/r /data/r/

#3.擴展:nfs客戶端永久掛載參數
[root@backup-41 ~]# tail -2 /etc/fstab
172.16.1.31:/data/r /data/r nfs defaults,noatime,nodiratime,noexec,nodev,nosuid 0 0
172.16.1.31:/data/w /data/w nfs defaults,noatime,nodiratime,noexec,nodev,nosuid 0 0

#4.擴展:客戶端檢查掛載參數是否生效
[root@backup-41 ~]# mount
#等價於
[root@backup-41 ~]# cat /proc/mounts
相關文章
相關標籤/搜索