一、NFS的應用與概述
# 1.為什么用共享存儲
# 2.存儲有哪些工具
# 3.共享存儲應用場景有哪些
# 4.部署nfs共享存儲
# 5.客戶端嘗試連接共享存儲
什么是NFS?
NFS 是 Network File System 的縮寫及網絡文件系統。 NFS 主要功能是通過
局域網絡讓不同的主機系統之間可以共享文件或目錄。
NFS 系統和 Windows 網絡共享、網絡驅動器類似, 只不過 windows 用於局域
網, NFS 用於企業集群架構中, 如果是大型網站, 會用到更復雜的分布式文件系統
FastDFS,glusterfs,HDFS
那么我們為什么要使用數據存儲共享服務?
1.實現多台服務器之間數據共享
2.實現多台服務器之間數據一致
1.1 NFS應用場景
-
下面我將通過圖解給大家展示集群需要共享存儲服務的理由。
-
1.A 用戶上傳圖片經過負載均衡,負載均衡將上傳請求調度至 WEB1 服務器上。
-
2.B 用戶訪問 A 用戶上傳的圖片,此時 B 用戶被負載均衡調度至 WEB2 上,因為 WEB2 上沒有這張圖片,所以 B用戶無法看到 A 用戶傳的圖片
-
-
如果有共享存儲的情況
-
1.A 用戶上傳圖片無論被負載均衡調度至 WEB1 還是 WEB2, 最終數據都被寫入至共享存儲
-
2.B 用戶訪問 A 用戶上傳圖片時,無論調度至 WEB1 還是 WEB2,最終都會上共享存儲訪問對應的文件,這樣就可以訪問到資源了
-
1.2 nfs存儲工作原理實現
-
NFS工作原理
# 1.用戶進程訪問 NFS 客戶端,使用不同的函數對數據進行處理
# 2.NFS 客戶端通過 TCP/IP 的方式傳遞給 NFS 服務端
# 3.NFS 服務端接收到請求后,會先調用 portmap 進程進行端口映射。
# 4.nfsd 進程用於判斷 NFS 客戶端是否擁有權限連接 NFS 服務端。
# 5.Rpc.mount 進程判斷客戶端是否有對應的權限進行驗證。
# 6.idmap 進程實現用戶映射和壓縮
# 7.最后 NFS 服務端會將對應請求的函數轉換為本地能識別的命令,傳遞至內核,由
# 內核驅動硬件。
# 注意: rpc 是一個遠程過程調用,那么使用 nfs 必須有 rpc 服務
1.3 前提條件
# 1.nfs依賴於RPC服務來傳遞消息
# 2.NFS服務啟動的端口號是隨機的,啟動之后會向本地的RCP注冊
# 3.先啟動RPC服務,再啟動NFS服務
# 4.NFS和RPC之間的通訊是他們自己內部完成的,對於用戶來說無感知
# 5.NFS客戶端和服務端不會直接溝通,必須通過RPC服務傳遞消息
# 6.防火牆要開放RPC服務的端口
二、NFS服務端部署實踐
2.1 安裝nfs
yum install nfs-utils -y
2.2 配置參數
-
nfs 服務程序的配置文件為/etc/exports,需要嚴格按照共享目錄的路徑 允許訪問的 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的用戶GID,必須存在系統 (常用) |
2.3 配置NFS服務端
-
寫入配置文件:注意!IP地址和后面的小括號沒有空格
[root@nfs01 ~]# cat > /etc/exports <<EOF
/data 172.16.1.0/24(rw,sync,all_squash)
EOF
-
創建數據目錄和授權:
[root@nfs01 ~]# mkdir /data -p
[root@nfs01 ~]# chown -R nfsnobody:nfsnobody /data/
2.4 啟動nfs
[root@nfs01 ~]# systemctl start nfs-server.service
2.5 檢查命令
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
2.6 加入開機自啟動
在使用 NFS 服務進行文件共享之前,需要使用 RPC(Remote Procedure Call 遠程過程調用服務將 NFS 服務器的IP 地址和端口號信息發送給客戶端。因此,在啟動 NFS 服務之前,需要先重啟並啟用 rpcbind 服務程序,同時都加入開機自啟動
[root@nfs01 ~]# systemctl enable rpcbind nfs-server
[root@nfs01 ~]# systemctl restart rpcbind nfs-server
2.7 客戶端掛載命令
客戶端安裝nfs服務十分簡單,只需要安裝nfs軟件包即可
[root@backup ~]# yum install nfs-utils rpcbind -y
安裝完成后只需要啟動rpcbind,不需要啟動nfs
[root@backup ~]# systemctl restart rpcbind
使用showmount命令查看nfs共享信息查詢 NFS 服務器的遠程共享信息,其輸出格式為“共享的目錄名稱 允許使用客戶端地址”。
[root@backup ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
掛載命令: 創建掛載目錄
在 NFS 客戶端創建一個掛載目錄, 使用 mount 命令並結合-t 參數, 指定要掛載的文件系統的類型, 並在命令后面寫上服務器的 IP 地址, 以及服務器上的共享目錄, 最后需要寫上要掛載到本地系統(客戶端)的目錄
[root@backup ~]# mkdir /data -p
[root@backup ~]# mount -t nfs 172.16.1.31:/data /data
查看是否掛載成功:
[root@backup ~]# df -h
文件系統 容量 已用 可用 已用% 掛載點
/dev/sda3 18G 1.9G 17G 11% /
devtmpfs 480M 0 480M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 32M 458M 7% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 1014M 110M 905M 11% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 18G 1.9G 17G 11% /data
測試寫入數據是否正常
[root@backup ~]# echo "111" > /data/111.txt
[root@backup ~]# cat /data/111.txt
oldzhang
寫入開機自動掛載
[root@backup ~]# vim /etc/fstab
[root@backup ~]# tail -1 /etc/fstab
172.16.1.31:/data /data nfs defaults 0 0
[root@backup ~]# mount -a
[root@backup ~]# df -h
文件系統 容量 已用 可用 已用% 掛載點
/dev/sda3 18G 1.9G 17G 11% /
devtmpfs 480M 0 480M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 32M 458M 7% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 1014M 110M 905M 11% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 18G 1.9G 17G 11% /data
卸載命令:注意!卸載的時候如果提示”umount.nfs: /nfsdir: device is busy”先切換到其他目錄再卸載
[root@backup ~]# umount /data/
強制卸載命令:
[root@backup ~]# umount -rl /data/
2.8 NFS 權限驗證
2.8.1 驗證ro權限
服務端配置:
[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)
[root@nfs01 ~]# systemctl restart nfs-server.service
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
客戶端掛載:
[root@backup ~]# mount -t nfs 172.16.1.31:/data /data
[root@backup ~]# df -h
文件系統 容量 已用 可用 已用% 掛載點
/dev/sda3 18G 1.9G 17G 11% /
devtmpfs 480M 0 480M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 38M 452M 8% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 1014M 110M 905M 11% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 18G 1.9G 17G 11% /data
測試讀取:
[root@backup ~]# cat /data/111.txt
111
寫入測試:
[root@backup ~]# echo "backup" > /data/111.txt
-bash: /data/111.txt: 權限不夠
2.8.2 驗證all_squash、 anonuid、 anongid 權限
服務端配置:
[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
服務端創建用戶及授權:
[root@nfs01 ~]# useradd -s /sbin/nologin -M -u 666 -g 666 www
[root@nfs01 ~]# id www
uid=666(www) gid=666(www) 組=666(www)
重啟NFS服務:
[root@nfs01 ~]# systemctl restart nfs-server.service
更改目錄授權:
[root@nfs01 ~]# chown -R www:www /data/
[root@nfs01 ~]# ls -ld /data/
drwxr-xr-x 2 www www 35 7月 17 19:50 /data/
客戶端操作:
[root@backup ~]# mount -t nfs 172.16.1.31:/data /data
[root@backup ~]# ls -ld /data/
drwxr-xr-x 2 666 666 35 7月 17 19:50 /data/
[root@backup ~]# ll /data/
總用量 4
-rw-r--r-- 1 666 666 0 7月 17 19:50 123
-rw-r--r-- 1 666 666 9 7月 17 19:46 111.txt
[root@backup ~]# echo "111" > /data/111.txt
[root@backup ~]# cat /data/111.txt
oldzhangy
我們會發現依然可以寫入,但是為了避免這種情況發生,建議客戶端也創建相同uid gid的用戶
[root@backup ~]# groupadd -g 666 www
[root@backup ~]# useradd -s /sbin/nologin -M -u 666 -g 666 www
[root@backup ~]# id www
uid=666(www) gid=666(www) 組=666(www)
[root@backup ~]# ls -ld /data/
drwxr-xr-x 2 www www 35 7月 17 19:50 /data/
[root@backup ~]# ll /data/
總用量 4
-rw-r--r-- 1 www www 0 7月 17 19:50 123
-rw-r--r-- 1 www www 10 7月 17 21:31 111.txt
查看nfs端口
[root@nfs01 ~]# rpcinfo -p
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
100024 1 udp 43177 status
100024 1 tcp 36750 status
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 41388 nlockmgr
100021 3 udp 41388 nlockmgr
100021 4 udp 41388 nlockmgr
100021 1 tcp 43678 nlockmgr
100021 3 tcp 43678 nlockmgr
100021 4 tcp 43678 nlockmgr```
firewall防火牆配置
firewall-cmd --add-service=nfs --permanent
firewall-cmd --add-service=mountd --permanent
firewall-cmd --add-service=rpc-bind --permanent
firewall-cmd --reload
iptables防火牆配置
參考博客
https://www.cnblogs.com/xiangsikai/p/10297233.html
啟動NFS會開啟如下端口:
1)portmapper 端口:111 udp/tcp;
2)nfs/nfs_acl 端口:2049 udp/tcp;
3)mountd 端口:"32768--65535" udp/tcp
4)nlockmgr 端口:"32768--65535" udp/tcp
系統 RPC服務在 nfs服務啟動時默認會給 mountd 和 nlockmgr 動態選取一個隨機端口來進行通訊。
1.查看NFS啟動后的端口
[root@nfs01 /opt/sersync]# rpcinfo -p
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
100024 1 udp 43177 status
100024 1 tcp 36750 status
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 41388 nlockmgr
100021 3 udp 41388 nlockmgr
100021 4 udp 41388 nlockmgr
100021 1 tcp 43678 nlockmgr
100021 3 tcp 43678 nlockmgr
100021 4 tcp 43678 nlockmgr
2.將隨機的端口號設置固定
[root@nfs01 ~]# vim /etc/sysconfig/nfs
[root@nfs01 ~]# tail -5 /etc/sysconfig/nfs
RQUOTAD_PORT=4001
LOCKD_TCPPORT=4002
LOCKD_UDPPORT=4002
MOUNTD_PORT=4003
STATD_PORT=4004
3.重啟nfs和rpc服務
[root@nfs01 ~]# systemctl restart rpcbind.service nfs-server.service
4.再次查看端口信息,發現端口號已經固定了
[root@nfs01 ~]# rpcinfo -p
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
100024 1 udp 43177 status
100024 1 tcp 36750 status
100005 1 udp 4003 mountd
100005 1 tcp 4003 mountd
100005 2 udp 4003 mountd
100005 2 tcp 4003 mountd
100005 3 udp 4003 mountd
100005 3 tcp 4003 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 4002 nlockmgr
100021 3 udp 4002 nlockmgr
100021 4 udp 4002 nlockmgr
100021 1 tcp 4002 nlockmgr
100021 3 tcp 4002 nlockmgr
100021 4 tcp 4002 nlockmgr
5.設置iptables
-A INPUT -p tcp -m tcp --dport 111 -j ACCEPT
-A INPUT -p udp -m udp --dport 111 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT
-A INPUT -p udp -m udp --dport 2049 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4001:4004 -j ACCEPT
-A INPUT -p udp -m udp --dport 4001:4004 -j ACCEPT
6.保存配置
iptables-save
iptables -nL
NFS故障案例
如果設置了開機自啟動,但是系統啟動的時候NFS並沒有提供服務,就會導致開機自檢的時候卡在掛在那一步
開機啟動時添加rd.break
ctrl+x
mount -o remount,rw /sysroot/
chroot /sysroot/
三、搭建考試系統
3.1、搭建WEB服務
1、安裝web軟件
[root@web01 opt]# yum install httpd php php-devel -y
2、將代碼放置於網站的根目錄
[root@web01 opt]# cd /var/www/html/
# 上傳代碼
3、授權
[root@web01 html]# chown -R www.www /var/www/html
4、關閉selinux和防火牆
[root@nfs ~]# setenforce 0
[root@nfs ~]# systemctl disable --now firewalld
5、修改web軟件的用戶
[root@web01 html]# vim /etc/httpd/conf/httpd.conf
User www
Group www
6、啟動web軟件
[root@web01 html]# systemctl start httpd
7、測試
1、上傳
2、訪問
http://172.16.1.7/upload/1_linux.jpg
3.2、配合NFS實現文件共享
1、修改NFS配置文件
[root@nfs nfs1]# vim /etc/exports
/web/upload 172.16.1.0/20(rw,sync,all_squash,anonuid=666,anongid=666)
2、創建掛載點
[root@nfs nfs1]# mkdir /web/upload -p
[root@nfs nfs1]# chown www.www /web/upload
3、重啟NFS
[root@nfs nfs1]# systemctl restart nfs-server rpcbind
4、客戶端安裝NFS軟件
[root@web01 html]# yum install nfs-utils -y
[root@web02 html]# yum install nfs-utils -y
[root@web03 html]# yum install nfs-utils -y
5、掛載
[root@web01 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
[root@web02 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
[root@web03 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
6、測試
用web2上傳,web3查看
效果圖如下: