第1章 存儲(chǔ)與nfs存儲(chǔ)概述
1.為什么用共享存儲(chǔ)
2.存儲(chǔ)有哪些工具
3.共享存儲(chǔ)應(yīng)用場(chǎng)景有哪些
4.部署nfs共享存儲(chǔ)
5.客戶端嘗試連接共享存儲(chǔ)
什么是NFS局劲?
NFS 是 Network File System 的縮寫及網(wǎng)絡(luò)文件系統(tǒng)除抛。 NFS 主要功能是通過局域網(wǎng)絡(luò)讓不同的主機(jī)系統(tǒng)之間可以共享文件或目錄南缓。
NFS 系統(tǒng)和 Windows 網(wǎng)絡(luò)共享、網(wǎng)絡(luò)驅(qū)動(dòng)器類似, 只不過 windows 用于局域網(wǎng), NFS 用于企業(yè)集群架構(gòu)中, 如果是大型網(wǎng)站, 會(huì)用到更復(fù)雜的分布式文件系統(tǒng) FastDFS,glusterfs,HDFS
那么我們?yōu)槭裁匆褂脭?shù)據(jù)存儲(chǔ)共享服務(wù)?
1.實(shí)現(xiàn)多臺(tái)服務(wù)器之間數(shù)據(jù)共享
2.實(shí)現(xiàn)多臺(tái)服務(wù)器之間數(shù)據(jù)一致
1.1 NFS應(yīng)用場(chǎng)景
下面我將通過圖解給大家展示集群需要共享存儲(chǔ)服務(wù)的理由。
1.A 用戶上傳圖片經(jīng)過負(fù)載均衡,負(fù)載均衡將上傳請(qǐng)求調(diào)度至 WEB1 服務(wù)器上龙巨。
2.B 用戶訪問 A 用戶上傳的圖片,此時(shí) B 用戶被負(fù)載均衡調(diào)度至 WEB2 上熊响,因?yàn)?WEB2 上沒有這張圖片旨别,所以 B用戶無法看到 A 用戶傳的圖片
如果有共享存儲(chǔ)的情況
1.A 用戶上傳圖片無論被負(fù)載均衡調(diào)度至 WEB1 還是 WEB2, 最終數(shù)據(jù)都被寫入至共享存儲(chǔ)
2.B 用戶訪問 A 用戶上傳圖片時(shí),無論調(diào)度至 WEB1 還是 WEB2耘眨,最終都會(huì)上共享存儲(chǔ)訪問對(duì)應(yīng)的文件昼榛,這樣就可以訪問到資源了
1.2 nfs存儲(chǔ)工作原理實(shí)現(xiàn)
NFS工作原理
1.用戶進(jìn)程訪問 NFS 客戶端境肾,使用不同的函數(shù)對(duì)數(shù)據(jù)進(jìn)行處理
2.NFS 客戶端通過 TCP/IP 的方式傳遞給 NFS 服務(wù)端
3.NFS 服務(wù)端接收到請(qǐng)求后剔难,會(huì)先調(diào)用 portmap 進(jìn)程進(jìn)行端口映射。
4.nfsd 進(jìn)程用于判斷 NFS 客戶端是否擁有權(quán)限連接 NFS 服務(wù)端奥喻。
5.Rpc.mount 進(jìn)程判斷客戶端是否有對(duì)應(yīng)的權(quán)限進(jìn)行驗(yàn)證偶宫。
6.idmap 進(jìn)程實(shí)現(xiàn)用戶映射和壓縮
7.最后 NFS 服務(wù)端會(huì)將對(duì)應(yīng)請(qǐng)求的函數(shù)轉(zhuǎn)換為本地能識(shí)別的命令,傳遞至內(nèi)核环鲤,由內(nèi)核驅(qū)動(dòng)硬件纯趋。
注意: rpc 是一個(gè)遠(yuǎn)程過程調(diào)用,那么使用 nfs 必須有 rpc 服務(wù)
1.3 前提條件
1.nfs依賴于RPC服務(wù)來傳遞消息
2.NFS服務(wù)啟動(dòng)的端口號(hào)是隨機(jī)的,啟動(dòng)之后會(huì)向本地的RCP注冊(cè)
3.先啟動(dòng)RPC服務(wù),再啟動(dòng)NFS服務(wù)
4.NFS和RPC之間的通訊是他們自己內(nèi)部完成的,對(duì)于用戶來說無感知
5.NFS客戶端和服務(wù)端不會(huì)直接溝通,必須通過RPC服務(wù)傳遞消息
6.防火墻要開放RPC服務(wù)的端口
第2章 nfs服務(wù)端部署
2.1 安裝nfs
yum install nfs-utils -y
2.2 配置參數(shù)
nfs 服務(wù)程序的配置文件為/etc/exports冷离,需要嚴(yán)格按照共享目錄的路徑 允許訪問的 NFS 客戶端(共享權(quán)限參數(shù))格式書寫吵冒,定義要共享的目錄與相應(yīng)的權(quán)限,具體書寫方式如下圖所示
配置文件參數(shù)解釋:
執(zhí)行 man exports 命令西剥,然后切換到文件結(jié)尾痹栖,可以快速查看如下樣例格式:
nfs共享參數(shù) 參數(shù)作用
rw 讀寫權(quán)限
ro 只讀權(quán)限
root_squash
當(dāng) NFS 客戶端以 root 管理員訪問時(shí),映射為 NFS 服務(wù)器的匿名用戶(不常用)
no_root_squash
當(dāng) NFS 客戶端以 root 管理員訪問時(shí)瞭空,映射為 NFS 服務(wù)器的 root 管理員(不常用)
all_squash
無論 NFS 客戶端使用什么賬戶訪問揪阿,均映射為 NFS 服務(wù)器的匿名用戶(常用)
no_all_squash
無論 NFS 客戶端使用什么賬戶訪問疗我,都不進(jìn)行壓縮
sync
同時(shí)將數(shù)據(jù)寫入到內(nèi)存與硬盤中,保證不丟失數(shù)據(jù)
async
優(yōu)先將數(shù)據(jù)保存到內(nèi)存南捂,然后再寫入硬盤吴裤;這樣效率更高,但可能會(huì)丟失數(shù)據(jù)
anonuid
配置 all_squash 使用,指定 NFS 的用戶 UID,必須存在系統(tǒng)
anongid
配置 all_squash 使用,指定 NFS 的用戶 UID,必須存在系統(tǒng)
2.3 配置NFS服務(wù)端
寫入配置文件:注意溺健!IP地址和后面的小括號(hào)沒有空格
[root@nfs01 ~]# cat > /etc/exports <<EOF
/data 172.16.1.0/24(rw,sync,all_squash)
EOF
創(chuàng)建數(shù)據(jù)目錄和授權(quán):
[root@nfs01 ~]# mkdir /data -p
[root@nfs01 ~]# chown -R nfsnobody:nfsnobody /data/
2.4 啟動(dòng)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 加入開機(jī)自啟動(dòng)
在使用 NFS 服務(wù)進(jìn)行文件共享之前麦牺,需要使用 RPC(Remote Procedure Call 遠(yuǎn)程過程調(diào)用服務(wù)將 NFS 服務(wù)器的IP 地址和端口號(hào)信息發(fā)送給客戶端。因此鞭缭,在啟動(dòng) NFS 服務(wù)之前枕面,需要先重啟并啟用 rpcbind 服務(wù)程序,同時(shí)都加入開機(jī)自啟動(dòng)
[root@nfs01 ~]# systemctl enable rpcbind nfs-server
[root@nfs01 ~]# systemctl restart rpcbind nfs-server
2.7 客戶端掛載命令
客戶端安裝nfs服務(wù)十分簡(jiǎn)單,只需要安裝nfs軟件包即可
[root@backup ~]# yum install nfs-utils rpcbind -y
安裝完成后只需要啟動(dòng)rpcbind缚去,不需要啟動(dòng)nfs
[root@backup ~]# systemctl restart rpcbind
使用showmount命令查看nfs共享信息查詢 NFS 服務(wù)器的遠(yuǎn)程共享信息潮秘,其輸出格式為“共享的目錄名稱 允許使用客戶端地址”。
[root@backup ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
掛載命令: 創(chuàng)建掛載目錄
在 NFS 客戶端創(chuàng)建一個(gè)掛載目錄, 使用 mount 命令并結(jié)合-t 參數(shù), 指定要掛載的文件系統(tǒng)的類型, 并在命令后面寫上服務(wù)器的 IP 地址, 以及服務(wù)器上的共享目錄, 最后需要寫上要掛載到本地系統(tǒng)(客戶端)的目錄
[root@backup ~]# mkdir /data -p
[root@backup ~]# mount -t nfs 172.16.1.31:/data /data
查看是否掛載成功:
[root@backup ~]# df -h
文件系統(tǒng) 容量 已用 可用 已用% 掛載點(diǎn)
/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
測(cè)試寫入數(shù)據(jù)是否正常
[root@backup ~]# echo "oldzhang" > /data/oldzhang.txt
[root@backup ~]# cat /data/oldzhang.txt
oldzhang
寫入開機(jī)自動(dòng)掛載
[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
文件系統(tǒng) 容量 已用 可用 已用% 掛載點(diǎn)
/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
卸載命令:注意!卸載的時(shí)候如果提示”umount.nfs: /nfsdir: device is busy”先切換到其他目錄再卸載
[root@backup ~]# umount /data/
強(qiáng)制卸載命令:
[root@backup ~]# umount -rl /data/
2.8 NFS 權(quán)限驗(yàn)證
2.8.1 驗(yàn)證ro權(quán)限
服務(wù)端配置:
[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
文件系統(tǒng) 容量 已用 可用 已用% 掛載點(diǎn)
/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
測(cè)試讀纫捉帷:
[root@backup ~]# cat /data/oldzhang.txt
oldzhang
寫入測(cè)試:
[root@backup ~]# echo "backup" > /data/oldzhang.txt
-bash: /data/oldzhang.txt: 權(quán)限不夠
2.8.2 驗(yàn)證all_squash枕荞、 anonuid、 anongid 權(quán)限
服務(wù)端配置:
[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
服務(wù)端創(chuàng)建用戶及授權(quán):
[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服務(wù):
[root@nfs01 ~]# systemctl restart nfs-server.service
更改目錄授權(quán):
[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 oldzhang.txt
[root@backup ~]# echo "oldzhangy" > /data/oldzhang.txt
[root@backup ~]# cat /data/oldzhang.txt
oldzhangy
我們會(huì)發(fā)現(xiàn)依然可以寫入搞动,但是為了避免這種情況發(fā)生躏精,建議客戶端也創(chuàng)建相同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 oldzhang.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
啟動(dòng)NFS會(huì)開啟如下端口:
1)portmapper 端口:111 udp/tcp;
2)nfs/nfs_acl 端口:2049 udp/tcp鹦肿;
3)mountd 端口:"32768--65535" udp/tcp
4)nlockmgr 端口:"32768--65535" udp/tcp
系統(tǒng) RPC服務(wù)在 nfs服務(wù)啟動(dòng)時(shí)默認(rèn)會(huì)給 mountd 和 nlockmgr 動(dòng)態(tài)選取一個(gè)隨機(jī)端口來進(jìn)行通訊矗烛。
1.查看NFS啟動(dòng)后的端口
[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.將隨機(jī)的端口號(hào)設(shè)置固定
[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服務(wù)
[root@nfs01 ~]# systemctl restart rpcbind.service nfs-server.service
4.再次查看端口信息,發(fā)現(xiàn)端口號(hào)已經(jīng)固定了
[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.設(shè)置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故障案例
如果設(shè)置了開機(jī)自啟動(dòng),但是系統(tǒng)啟動(dòng)的時(shí)候NFS并沒有提供服務(wù)箩溃,就會(huì)導(dǎo)致開機(jī)自檢的時(shí)候卡在掛在那一步
開機(jī)啟動(dòng)時(shí)添加rd.break
ctrl+x
mount -o remount,rw /sysroot/
chroot /sysroot/
第3章 NFS小結(jié)
NFS 存儲(chǔ)優(yōu)點(diǎn)
1.NFS 文件系統(tǒng)簡(jiǎn)單易用瞭吃、方便部署、數(shù)據(jù)可靠涣旨、服務(wù)穩(wěn)定歪架、滿足中小企業(yè)需求。
2.NFS 文件系統(tǒng)內(nèi)存放的數(shù)據(jù)都在文件系統(tǒng)之上霹陡,所有數(shù)據(jù)都是能看得見
NFS 存儲(chǔ)局限
1.存在單點(diǎn)故障, 如果構(gòu)建高可用維護(hù)麻煩 web->nfs()->backup
2.NFS 數(shù)據(jù)明文, 并不對(duì)數(shù)據(jù)做任何校驗(yàn)和蚪。
3.客戶端掛載 NFS 服務(wù)沒有密碼驗(yàn)證, 安全性一般(內(nèi)網(wǎng)使用)
NFS 應(yīng)用建議
1.生產(chǎn)場(chǎng)景應(yīng)將靜態(tài)數(shù)據(jù)盡可能往前端推, 減少后端存儲(chǔ)壓力
2.必須將存儲(chǔ)里的靜態(tài)資源通過 CDN 緩存 jpg\png\mp4\avi\css\js
3.如果沒有緩存或架構(gòu)本身歷史遺留問題太大, 在多存儲(chǔ)也無用
第4章 項(xiàng)目實(shí)戰(zhàn)
4.1 項(xiàng)目需求
準(zhǔn)備 3 臺(tái)虛擬機(jī)服務(wù)器,并且請(qǐng)按照要求搭建配置 NFS 服務(wù)烹棉。
NFS 服務(wù)端(A)
NFS 客戶端(B)
NFS 客戶端(C)
1.在 NFS 服務(wù)端(A)上共享/data/w(可寫)及/data/r(只讀)
2.在 NFS 客戶端(B/C)上進(jìn)行掛載
環(huán)境準(zhǔn)備