NFS 共享存儲實戰
一、NFS概述
共享存儲,文件服務器
NFS是Network File System的縮寫及網絡文件系統。NFS主要功能是通過局域網絡讓不同的主機系統之間可以共享文件或目錄。NFS系統和Windows網絡共享、網絡驅動器類似, 只不過windows用於局域網, NFS用於企業集群架構中, 如果是大型網站, 會用到更復雜的分布式文件系統FastDFS,glusterfs,HDFS,ceph
1.為什么要使用共享存儲
-
1.實現多台服務器之間數據共享*
-
2.實現多台服務器之間數據一致*
2.集群沒有共享存儲的情況
-
1.A用戶上傳圖片經過負載均衡,負載均衡將上傳請求調度至WEB1服務器上。*
-
2.B用戶訪問A用戶上傳的圖片,此時B用戶被負載均衡調度至WEB2上,因為WEB2上沒有這張圖片,所以B用戶無法看到A用戶傳的圖片。*
** 2.集群有共享存儲***
-
1.A用戶上傳圖片無論被負載均衡調度至WEB1還是WEB2, 最終數據都被寫入至共享存儲*
-
2.B用戶訪問A用戶上傳圖片時,無論調度至WEB1還是WEB2,最終都會上共享存儲訪問對應的文件,這樣就可以訪問到資源了*
3.NFS的工作原理
-
1.用戶進程訪問NFS客戶端,使用不同的函數對數據進行處理*
-
2.NFS客戶端通過TCP/IP的方式傳遞給NFS服務端。*
-
3.NFS服務端接收到請求后,會先調用portmap進程進行端口映射。*
-
4.nfsd進程用於判斷NFS客戶端是否擁有權限連接NFS服務端。*
-
5.Rpc.mount進程判斷客戶端是否有對應的權限進行驗證。*
-
6.idmap進程實現用戶映射和壓縮7.最后NFS服務端會將對應請求的函數轉換為本地能識別的命令,傳遞至內核,由內核驅動硬件。*
二、NFS部署
環境准備
主機名 | 角色 | 外網IP | 內網IP |
---|---|---|---|
backup | nfs的客戶端 | 10.0.0.41 | 172.16.1.41 |
nfs | nfs的服務端 | 10.0.0.31 | 172.16.1.31 |
web01 | nfs的客戶端 | 10.0.0.7 | 172.16.1.7 |
關閉防火牆和selinux
#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
1.部署nfs服務端
yum -y install nfs-utils rpcbind
2.啟動rpcbind
#啟動rpcbind
[root@nfs01 ~]# systemctl start rpcbind
#添加開機自啟
[root@nfs01 ~]# systemctl enable rpcbind (系統默認開機自啟)
3.測端口和進程
[root@nfs01 ~]# ps -ef|grep rpc
rpc 11746 1 0 01:12 ? 00:00:00 /sbin/rpcbind -w
root 11750 11421 0 01:15 pts/1 00:00:00 grep --color=auto rpc
[root@nfs01 ~]# netstat -lntup|grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
udp6 0 0 :::111 :::* 1/systemd
4.編輯配置文件
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666) (統一修改uid為666,gid為666)
目錄 共享目錄 讀寫,參數
配置場景
將nfs服務端的/data
目錄共享給172.16.1.0/24
網段內的所有主機
- 所有客戶端主機都擁有讀寫權限
- 在將數據寫入到NFS服務器的硬盤中后才會結束操作,最大限度保證數據不丟失
- 將所有用戶映射為本地的匿名用戶(nfsnobody)
#NFS客戶端地址與權限之間沒有空格
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
5.設置開機自啟
在使用NFS
服務進行文件共享之前,需要使用RPC(Remote Procedure Call
遠程過程調用服務將NFS
服務器的IP
地址和端口號信息發送給客戶端。因此,在啟動NFS
服務之前,需要先重啟並啟用rpcbind
服務程序,同時都加入開機自啟動
#加入開機自啟
[root@nfs ~]# systemctl enable rpcbind nfs-server
#啟動服務
[root@nfs ~]# systemctl restart rpcbind nfs-server
#檢測端口
[root@nfs ~]# netstat -lntup
#檢測文件
[root@nfs ~]# cat /var/lib/nfs/etab
6.創建/data目錄
[root@nfs01 html]# groupadd www -g 666
[root@nfs01 html]# useradd www -u 666 -g 666
[root@nfs01 data]# mkdir /data
[root@nfs01 data]# chown -R www.www /data
#NFS共享目錄會記錄至/var/lib/nfs/etab,如果該目錄不存在共享信息,請檢查/etc/exports是否配置錯誤
7.啟動NFS
[root@nfs01 ~]# systemctl start nfs-server
部署NFS客戶端backup和web01
yum install -y rpcbind nfs-utils
1.啟動rpcbind
#只啟動rpcbind
[root@web01 ~]# systemctl start rpcbind
[root@backup ~]# systemctl start rpcbind
2.查看可掛載點
[root@backup ~]# showmount -e 172.16.1.31 (要用到showmount所以要安裝nfs)
3.掛載目錄
[root@backup ~]# mount -t nfs 172.16.1.31:/data /backup
掛載的是nfs類型的
df -h 可查看,多出來18G
cd /backup (可查看目錄,但里面沒內容,這個是遠端的目錄)
4.掛載拓展:
如果希望NFS
文件共享服務能一直有效,則需要將其寫入到fstab
文件中
#編輯fstab文件
[root@nfs-client ~]# vim /etc/fstab
172.16.1.31:/data /nfsdir nfs defaults 0 0
#驗證fstab是否寫正確
[root@nfs-client ~]# mount -a
如果不希望使用NFS
共享, 可進行卸載
[root@nfs-client ~]# umount /nfsdir
#注意:卸載的時候如果提示”umount.nfs: /nfsdir: device is busy”
#1.切換至其他目錄, 然后在進行卸載。
#2.NFS Server宕機, 強制卸載umount -lf /nfsdir
在企業工作場景,通常情況NFS服務器共享的只是普通靜態數據(圖片、附件、視頻),不需要執行suid、exec
等權限,掛載的這個文件系統只能作為數據存取之用,無法執行程序,對於客戶端來講增加了安全性。例如: 很多木馬篡改站點文件都是由上傳入口上傳的程序到存儲目錄。然后執行的。
#通過mount -o指定掛載參數,禁止使用suid,exec,增加安全性能
[root@nfs-client ~]# mount -t nfs -o nosuid,noexec,nodev 172.16.1.31:/data /mnt
有時也需要考慮性能相關參數[可選]
#通過mount -o指定掛載參數,禁止更新目錄及文件時間戳掛載
[root@nfs-client ~]# mount -t nfs -o noatime,nodiratime 172.16.1.31:/data /mnt
統一web、nfs、backup的用戶權限
---------------------------------修改WEB和backup一樣的-----------------------------------
#創建www用戶和組
[root@backup html]# groupadd www -g 666
[root@backup html]# useradd www -u 666 -g 666
yum install -y httpd php
#修改httpd的配置文件
vim /etc/httpd/conf/httpd.conf
User www
Group www
[root@backup html]# systemctl restart httpd (重啟)
代碼部署步驟
1.安裝服務,httpd(apache)和php
yum install -y httpd php
2.查找httpd的站點目錄
[root@web01 html]# rpm -ql httpd|grep html (查找站點目錄)
[root@web01 html]# rz windows-提交作業代碼.zip
[root@web01 html]# yum install -y unzip
[root@web01 html]# unzip windows-提交作業代碼.zip
3.修改上傳目錄
[root@backup ~]# vim /var/www/html/upload_file.php
$wen="/var/www/html/tupian";
共享掛載
[root@backup ~]# df -h
[root@backup ~]# mount -t nfs 172.16.1.31:/data /var/www/html/
4.啟動服務
systemctl restart httpd
三、NFS配置詳解
執行man exports命令,然后切換到文件結尾,可以快速查看如下樣例格式:
nfs共享參數 | 參數作用 |
---|---|
rw* | 讀寫權限 |
ro | 只讀權限 |
root_squash | 當NFS客戶端以root管理員訪問時,映射為NFS服務器的匿名用戶(不常用) |
no_root_squash | 當NFS客戶端以root管理員訪問時,映射為NFS服務器的root管理員(不常用) |
all_squash | 無論NFS客戶端使用什么賬戶訪問,均映射為NFS服務器的匿名用戶(常用) |
no_all_squash | 無論NFS客戶端使用什么賬戶訪問,都不進行壓縮 |
sync* | 同時將數據寫入到內存與硬盤中,保證不丟失數據 |
async | 優先將數據保存到內存,然后再寫入硬盤;這樣效率更高,但可能會丟失數據 |
anonuid* | 配置all_squash使用,指定NFS的用戶UID,必須存在系統 |
anongid* | 配置all_squash使用,指定NFS的用戶UID,必須存在系統 |
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
3.NFS服務端配置
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
4.服務端需要創建對應的用戶
[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)
5重載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)
6.授權共享目錄為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/
7.客戶端驗證
[root@backup ~]# umount /mnt/
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
8.客戶端查看到的文件,身份是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
9.客戶端依舊能往/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
10.建議:將客戶端也創建一個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)
11.最后檢查文件的身份
[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
NFS存儲小結
1.NFS存儲優點
1)NFS文件系統簡單易用、方便部署、數據可靠、服務穩定、滿足中小企業需求。2)NFS文件系統內存放的數據都在文件系統之上,所有數據都是能看得見。
2.NFS存儲局限
1)存在單點故障, 如果構建高可用維護麻煩web->nfs()->backup2)NFS數據明文, 並不對數據做任何校驗。3)客戶端掛載NFS服務沒有密碼驗證, 安全性一般(內網使用)
3.NFS應用建議
1)生產場景應將靜態數據盡可能往前端推, 減少后端存儲壓力2)必須將存儲里的靜態資源通過CDN緩存jpg\png\mp4\avi\css\js3)如果沒有緩存或架構本身歷史遺留問題太大, 在多存儲也無用
四、NFS案例實踐
准備3台虛擬機服務器,並且請按照要求搭建配置NFS服務。NFS服務端(A)NFS客戶端(B)NFS客戶端(C)1.在NFS服務端(A)上共享/data/w(可寫)及/data/r(只讀)2.在NFS客戶端(B/C)上進行掛載
環境准備
服務器系統 | 角色 | IP |
---|---|---|
CentOS 7.5 | NfsServer(A) | 172.16.1.31 |
CentOS 7.5 | NfsClient(B) | 172.16.1.41 |
CentOS 7.5 | NfsClient(C) | 172.16.1.7 |
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
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/
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