用于Linux之間進(jìn)行文件共享則是用NFS服務(wù)(Network FileSystem)
目的在于讓不同的機(jī)器,不同的操作系統(tǒng)可以彼此分享各自的文件數(shù)據(jù)。
NFS服務(wù)可以將遠(yuǎn)程Linux系統(tǒng)上的文件共享資源掛載到本地機(jī)器的目錄上。
企業(yè)生產(chǎn)集群為什么需要共享存儲
這個共享存儲對于中小企業(yè),也就是使用服務(wù)器配置NFS網(wǎng)絡(luò)文件共享系統(tǒng)實現(xiàn)。
什么是共享存儲
簡單說就是將很多臺服務(wù)器的數(shù)據(jù),都可以保存在同一個存儲服務(wù)器上。這樣可以在服務(wù)器集群內(nèi),數(shù)據(jù)統(tǒng)一存儲到一臺機(jī)器上,以實現(xiàn)共享存儲。 這樣在基于負(fù)載均衡的web集群下,用戶無論請求哪一臺機(jī)器都可以獲取到同樣的數(shù)據(jù)。
什么是NFS
network file system 網(wǎng)絡(luò)文件系統(tǒng) NFS主要使用在局域網(wǎng)下,讓不同的主機(jī)之間可以共享文件、或者目錄數(shù)據(jù) 主要用于linux系統(tǒng)上實現(xiàn)文件共享的一種協(xié)議,其客戶端主要是Linux 沒有用戶認(rèn)證機(jī)制,且數(shù)據(jù)在網(wǎng)絡(luò)上傳送的時候是明文傳送,一般只能在局域網(wǎng)中使用 支持多節(jié)點同時掛載及并發(fā)寫入
NFS架構(gòu)圖
NFS程序運行后,產(chǎn)生如下組件
RPC(Remote Procedure Call Protocol):遠(yuǎn)程過程調(diào)用協(xié)議,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計算機(jī)程序上請求服務(wù),不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。-
rpcbind //負(fù)責(zé)NFS的數(shù)據(jù)傳輸,遠(yuǎn)程過程調(diào)用 tcp/udp協(xié)議 端口111
nfs-utils //控制共享哪些文件,權(quán)限管理
什么是RPC
RPC(Remote Procedure Call)遠(yuǎn)程過程調(diào)用,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計算機(jī)程序上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。
遠(yuǎn)程過程調(diào)用,相對應(yīng)的就是,本地過程調(diào)用。 rpc一般是開發(fā)中的網(wǎng)絡(luò)編程知識 1.于超老師本地寫好了一個代碼文件,如hello-world.py ,本地運行該程序,這就是本地過程調(diào)用(執(zhí)行程序,拿到結(jié)果) 2.遠(yuǎn)程過程調(diào)用 于超老師在將代碼文件放在遠(yuǎn)程服務(wù)器上,在自己筆記本上,遠(yuǎn)程調(diào)用、執(zhí)行該代碼文件,執(zhí)行結(jié)果會通過網(wǎng)絡(luò)把數(shù)據(jù)發(fā)回來,這就是遠(yuǎn)程過程調(diào)用
簡單理解RPC與洗衣服
同樣是洗衣服,一個本地洗,一個遠(yuǎn)程洗。
打個比方,你在家里,要洗衣服,你直接把衣服放到洗衣機(jī),開啟洗衣機(jī)開關(guān),這就是本地過程調(diào)用。(本地過程調(diào)用)
遠(yuǎn)程調(diào)用就是,你不在家里,你打個電話回家里,跟媽說幫忙洗個衣服,這就是遠(yuǎn)程過程調(diào)用。
也就是你的一個計算任務(wù),是遠(yuǎn)程的服務(wù)器在執(zhí)行,執(zhí)行完畢,告訴你結(jié)果而已。
NFS和RPC的關(guān)系
我們已知NFS是通過網(wǎng)絡(luò)來進(jìn)行數(shù)據(jù)傳輸(網(wǎng)絡(luò)文件系統(tǒng)),因此NFS會使用一些port來傳輸數(shù)據(jù)。
關(guān)鍵點:
但是NFS在傳輸數(shù)據(jù)的時,使用的端口是隨機(jī)選擇(可以重啟NFS服務(wù)查看端口)。
既然NFS是隨機(jī)端口選擇(好比銀行的取錢窗口總發(fā)生變化,你知道幾號窗口是取錢業(yè)務(wù)嗎?)
那么NFS在傳輸數(shù)據(jù)的時候,怎么知道NFS服務(wù)器使用的端口是哪個呢?
答案就是NFS使用的RPC(Remote Procedure Call,就是遠(yuǎn)程過程調(diào)用)協(xié)議來實現(xiàn)的。
NFS工作原理(重要)
1.NFS服務(wù)端啟動后、將自己的端口信息,注冊到rpcbind服務(wù)中 2.NFS客戶端通過TCP/IP的方式,連接到NFS服務(wù)端提供的rpcbind服務(wù),并且從該服務(wù)中獲取具體的端口信息 3.NFS客戶端拿到具體端口信息后,將自己需要執(zhí)行的函數(shù),通過網(wǎng)絡(luò)發(fā)給NFS服務(wù)端對應(yīng)的端口 4.NFS服務(wù)端接收到請求后,通過rpc.nfsd進(jìn)程判斷該客戶端是否有權(quán)限連接 5.NFS服務(wù)端的rpc.mount進(jìn)程判斷客戶端是否有對應(yīng)的操作權(quán)限 6.最終NFS服務(wù)端會將客戶端請求的函數(shù),識別為本地可以執(zhí)行的命令,傳遞給內(nèi)核、最終內(nèi)核驅(qū)動硬件 結(jié)論、nfs的客戶端、服務(wù)端之間的通信基于rpc協(xié)議,且必須運行rpcbind服務(wù)
rpcbind服務(wù)的作用
該服務(wù)是用于,nfs啟動后,將端口號,注冊到這個rpcbind服務(wù)中
圖解NFS工作原理
NFS工作流程(原理)
在啟動NFS服務(wù)端之前,必須先啟動RPC服務(wù),在centos7服務(wù)器下為rpcbind服務(wù),否則NFSserver無法向RPC注冊信息了。 另外如果RPC服務(wù)重啟,原來注冊的NFS服務(wù)端信息也就失效了,也必須重啟服務(wù),再次注冊信息給RPC服務(wù)。 特別要注意的是,修改NFS配置文件后不需要重啟NFS,只需要執(zhí)行exportfs -rv 命令即可或是systemctl reload nfs
nfs工作流程圖原理
當(dāng)訪問程序通過NFS客戶端向NFS服務(wù)器端存儲文件時,其數(shù)據(jù)請求流程如下: 1.用戶訪問網(wǎng)站程序,由程序在NFS客戶端上發(fā)出存取文件的請求,此時NFS客戶端(執(zhí)行程序的機(jī)器)的RPC服務(wù)(rpcbind)就會通過網(wǎng)絡(luò)向NFS服務(wù)器的RPC服務(wù)的111端口發(fā)出NFS文件存取功能的請求。 2.NFS服務(wù)器RPC找到對應(yīng)注冊的NFS端口,通知NFS客戶端RPC服務(wù) 3.此時NFS客戶端獲取到正確的端口,并與NFS daemon聯(lián)機(jī)存取數(shù)據(jù) 4.NFS客戶端把數(shù)據(jù)存取成功后返回給前端程序,告知用戶存取結(jié)果,完成一次存取請求。 這也就證明,必須先啟動RPC服務(wù),再啟動NFS服務(wù)的步驟。
機(jī)器準(zhǔn)備
nfs服務(wù)端 nfs-31
多個nfs客戶端 web-7
最終完成效果
讓web-7 可以讀寫 nfs共享的靜態(tài)文件數(shù)據(jù)
NFS服務(wù)端部署
配置文件語法介紹
默認(rèn)配置文件路徑是/etc/exports exports配置文件語法 NFS共享目錄 NFS客戶端地址(參數(shù)1、參數(shù)2...) 客戶點地址2(參數(shù)1、參數(shù)2...) 例如 / hostname1(rw) hostname2(rw,no_root_squash) /pub *(rw) /home/chao 123.206.16.61(ro) 參數(shù)解釋 1.NFS共享目錄:為NFS服務(wù)器要共享的實際目錄,必須絕對路徑,注意目錄的本地權(quán)限,如果要讀寫共享,要讓本地目錄可以被NFS客戶端的(nfsnobody)讀寫 2.NFS客戶端地址,也就是NFS服務(wù)器端授權(quán)可以訪問共享目錄的客戶端地址,詳見下表 3.權(quán)限參數(shù),對授權(quán)的NFS客戶端訪問權(quán)限設(shè)置,見下表
nfs客戶端地址說明
NFS配置文件參數(shù)解釋
ro 只讀 rw 讀寫 root_squash 當(dāng)nfs客戶端以root訪問時,它的權(quán)限映射為NFS服務(wù)端的匿名用戶,它的用戶ID/GID會變成nfsnobody no_root_squash 同上,但映射客戶端的root為服務(wù)器的root,不安全,避免使用 all_squash 所有nfs客戶端用戶映射為匿名用戶,生產(chǎn)常用參數(shù),降低用戶權(quán)限,增大安全性。 sync 數(shù)據(jù)同步寫入到內(nèi)存與硬盤,優(yōu)點數(shù)據(jù)安全,缺點性能較差 async 數(shù)據(jù)寫入到內(nèi)存,再寫入硬盤,效率高,但可能內(nèi)存數(shù)據(jù)會丟 /etc/exports man 5 exports 共享目錄 共享選項 /nfs/share *(ro,sync) 共享主機(jī): * :代表所有主機(jī) 192.168.0.0/24:代表共享給某個網(wǎng)段 192.168.0.0/24(rw) 192.168.1.0/24(ro) :代表共享給不同網(wǎng)段 192.168.0.254:共享給某個IP *.yuchaoit.cn:代表共享給某個域下的所有主機(jī) 共享選項: ro:只讀,不常用 rw:讀寫 sync:實時同步,直接寫入磁盤 async:異步,先緩存在內(nèi)存再同步磁盤 anonuid:設(shè)置訪問nfs服務(wù)的用戶的uid,uid需要在/etc/passwd中存在 anongid:設(shè)置訪問nfs服務(wù)的用戶的gid root_squash :默認(rèn)選項 root用戶創(chuàng)建的文件的屬主和屬組都變成nfsnobody,其他人nfs-server端是它自己,client端是nobody。 no_root_squash:root用戶創(chuàng)建的文件屬主和屬組還是root,其他人server端是它自己uid,client端是nobody。 all_squash:不管是root還是其他普通用戶創(chuàng)建的文件的屬主和屬組都是nfsnobody 說明: anonuid和anongid參數(shù)和all_squash一起使用。 all_squash表示不管是root還是其他普通用戶從客戶端所創(chuàng)建的文件在服務(wù)器端的擁有者和所屬組都是nfsnobody;服務(wù)端為了對文件做相應(yīng)管理,可以設(shè)置anonuid和anongid進(jìn)而指定文件的擁有者和所屬組
rpcbind服務(wù)管理
NFS服務(wù)都是基于RPC協(xié)議通信的默認(rèn)端口是111,要確保系統(tǒng)運行了rpcbind服務(wù)
要注意的是rpcbind服務(wù)即使停止,111端口也不會掛掉,因為還有rpcbind.socket服務(wù)
意思是,啟動rpc服務(wù)由2個結(jié)合運行
rpcbind.service
rpcbind.socket
[root@chaogelinux ~]# systemctl status rpcbind ● rpcbind.socket - RPCbind Server Activation Socket Loaded: loaded (/usr/lib/systemd/system/rpcbind.socket; enabled; vendor preset: enabled) Active: active (running) since 二 2020-03-10 1012 CST; 4h 35min ago Listen: /var/run/rpcbind.sock (Stream) 0.0.0.0:111 (Stream) 0.0.0.0:111 (Datagram) 3月 10 1012 chaogelinux systemd[1]: Listening on RPCbind Server Activation Socket. # 啟動rpcbind服務(wù) systemctl restart rpcbind #啟動 systemctl restart nfs-server
NFS服務(wù)端部署實踐(重要)
1.準(zhǔn)備好nfs服務(wù)端機(jī)器 2.安裝nfs工具包 yum install nfs-utils rpcbind -y 3.修改配置文件,填寫為你需要的共享參數(shù)即可 先學(xué)學(xué)該軟件的配置文件語法,每一個軟件的配置文件語法,可能都不相同 [root@nfs-31 ~]#cat /etc/exports 需要你填入如下配置,定義共享文件,以及限定訪問的ip主機(jī),以及共享的參數(shù),權(quán)限設(shè)置 4. 設(shè)置一個共享 /nfs-data文件夾,運行172.16.1.0局域網(wǎng)內(nèi)的用戶可以訪問,權(quán)限是只讀 mkdir /nfs-data vim /etc/exports 這里需要添加參數(shù),讓掛載后的客戶端,身份改為匿名用戶,降低權(quán)限,以及設(shè)置對應(yīng)的讀寫權(quán)限 /nfs-data 172.16.1.0/24(rw,sync,) 5.注意要先啟動rpcbind服務(wù) 確保如下2個進(jìn)程都運行,rpc服務(wù)才正常,如果想停止rpc服務(wù),也是關(guān)閉這倆進(jìn)程 rpcbind.service rpcbind.socket systemctl start rpcbind.service systemctl start rpcbind.socket [root@nfs-31 ~]#netstat -tunlp |grep rpc [root@nfs-31 ~]#systemctl status rpcbind [root@nfs-31 ~]#systemctl start rpcbind.service [root@nfs-31 ~]#systemctl start rpcbind.socket 6.運行nfs服務(wù) ,每次重啟nfs,nfs端口號,不斷變化中 systemctl start nfs 7.檢查nfs共享的情況 [root@nfs-31 ~]#showmount -e 172.16.1.31 Export list for 172.16.1.31: /nfs-data 172.16.1.0/24 8.修改服務(wù)端的nfs配置文件,允許讀寫操作 root_squash 這個參數(shù),就是將客戶端機(jī)器在nfs中創(chuàng)建的數(shù)據(jù),用于改為nfsnobody [root@nfs-31 ~]#cat /etc/exports /nfs-data 172.16.1.0/24(rw,root_squash) 還需要修改該共享文件夾的權(quán)限 chown -R nfsnobody:nfsnobody /nfs-data 9.設(shè)置nfs服務(wù)端開機(jī)自啟、包括rpncbind服務(wù) [root@nfs-31 ~]#systemctl is-enabled nfs 檢查是否開機(jī)自啟 disabled [root@nfs-31 ~]#systemctl enable rpcbind nfs Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. 10.nfs配置文件修改或,無需重啟,使用重新加載,方式NFS端口號再次變化 方法1 systemctl reload nfs 方法2,更新nfs的配置文件設(shè)置 [root@nfs-31 ~]#exportfs -r
NFS客戶端部署實踐(重要)
1.安裝nfs工具包 [root@web-7 ~]#yum install nfs-utils -y 2.運行客戶端的rpcbind程序 [root@web-7 ~]#systemctl start rpcbind [root@web-7 ~]#netstat -tnlp|grep rpc tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 4412/rpcbind tcp6 0 0 :::111 :::* LISTEN 4412/rpcbind 3.遠(yuǎn)程查看nfs服務(wù)器信息 [root@web-7 ~]#showmount -e 172.16.1.31 Export list for 172.16.1.31: /nfs-data 172.16.1.0/24 4.創(chuàng)建文件夾 [root@web-7 ~]#mkdir -p /test-nfs 5..掛載nfs,查看nfs [root@web-7 ~]#mount -t nfs 172.16.1.31:/nfs-data /test-nfs [root@web-7 ~]# [root@web-7 ~]#df -h 6.嘗試讀寫數(shù)據(jù) ls /test-nfs touch /test-nfs/hello.log
NFS結(jié)合nginx實現(xiàn)共享存儲
- 安裝部署nfs服務(wù)端 - 生產(chǎn)環(huán)境下的參數(shù)rw,sync,all_squash,anonuid,anongid
rw,sync, all_squash ,將web-7的任意用戶root,bob01,,在該共享目錄下的操作,全部改為nfsnobody以實現(xiàn)權(quán)限控制 web-7 /test-nfs 172.16.1.31:/nfs-data 無論是root去讀寫 、/test-nfs 還是bob01讀寫 /test-nfs 創(chuàng)建的數(shù)據(jù),都會被改為user,group都是 默認(rèn)的nfsnobody anonuid=id號 anongid= 集合這倆參數(shù),就可以限制在 該nfs共享目錄下的所有用戶操作,統(tǒng)一被限制為了某個指定的用戶
圖解這個需求
任務(wù)需求 1.nginx的啟動用戶必須是www,uid是 1500,不允許登錄 useradd www -u 1500 -M -s /sbin/nologin 1.0 安裝nginx yum install nginx -y 1.1 修改nginx配置文件,指定是www用戶運行 vim /etc/nginx/nginx.conf 修改如下 user www; 1.2 啟動nginx systemctl start nginx 1.3 檢查nginx進(jìn)程 [root@web-7 ~]#ps -ef|grep nginx root 5038 1 0 12:07 ? 00:00:00 nginx: master process /usr/sbin/nginx www 5040 5038 0 12:07 ? 00:00:00 nginx: worker process 2.nfs共享存儲用戶也是www,uid是 1500,不允許登錄,允許讀寫 修改nfs配置文件如下,限定客戶端在該目錄中的操作,權(quán)限都被轉(zhuǎn)化為www用戶 限制nginx機(jī)器才能訪問 [root@nfs-31 ~]#mkdir /nfs-nginx [root@nfs-31 ~]#useradd www -u 1500 -M -s /sbin/nologin 修改配置文件 [root@nfs-31 ~]#cat /etc/exports /nfs-data *(rw,all_squash) /nfs-nginx 172.16.1.7(rw,sync,all_squash,anonuid=1500,anongid=1500) 3.重新加載nfs(reload是針對已經(jīng)有進(jìn)程在運行了,重新讀取配置文件) 你是新安裝的機(jī)器nfs,還能reload嗎? systemctl reload nfs 4.修改共享目錄的屬主、屬組為www [root@nfs-31 /nfs-nginx]#chown -R www.www /nfs-nginx/ [root@nfs-31 /nfs-nginx]#ll -d /nfs-nginx/ drwxr-xr-x 2 www www 6 Apr 22 12:09 /nfs-nginx/ 3.nginx網(wǎng)站可以正常讀寫共享存儲資料 先掛載nfs mount -t nfs 172.16.1.31:/nfs-nginx /usr/share/nginx/html/ [root@web-7 ~]#df -h |grep nginx 172.16.1.31:/nfs-nginx 17G 1.6G 16G 10% /usr/share/nginx/html 客戶端生成網(wǎng)頁,和圖片等靜態(tài)資源,查看是否寫入到NFS服務(wù)端 [root@web-7 ~]#vim /usr/share/nginx/html/index.html 模擬用普通用戶,到該nginx目錄下,生成一個數(shù)據(jù)圖片 [client01@web-7 /usr/share/nginx/html]$wget -O /usr/share/nginx/html/liyunlong.jpg https://inews.gtimg.com/newsapp_bt/0/8823765779/1000 4.修改nginx網(wǎng)頁,加載該用戶自己創(chuàng)建的圖片信息嗎 [client01@web-7 /usr/share/nginx/html]$cat index.html 把我李云龍的意大利炮拿來 5.模擬用戶訪問該nginx網(wǎng)站 http://10.0.0.7/
NFS故障案例
1.nfs服務(wù)端崩潰
服務(wù)端關(guān)閉nfs
當(dāng)nfs服務(wù)端崩潰后,客戶端nfs會卡死 [root@nfs-31 /data3]#systemctl stop nfs
nfs客戶端查看掛載情況
對該掛載目錄的操作全部卡死 [root@web-7 /t3]#ls ^C [root@web-7 /t3]#df -h ^C 也無法取消掛載 [root@web-7 ~]#umount /t3 ^C
解決辦法
1.修復(fù)nfs服務(wù)端
服務(wù)端 [root@nfs-31 /data3]#systemctl start nfs 客戶端 [root@web-7 ~]#ls /t3 hehe 師傅你是干什么的.log 我的老天鵝啊.log 測試anonuid.log
2.強(qiáng)制卸載客戶端的nfs掛載
[root@web-7 ~]#umount --help -f, --force force unmount (in case of an unreachable NFS system) -l, --lazy detach the filesystem now, and cleanup all later 取消客戶端所有對該nfs服務(wù)端的掛載即可 [root@web-7 ~]#umount -lf /t3 [root@web-7 ~]#umount -lf /data df命令恢復(fù)了 [root@web-7 ~]#df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.6G 16G 10% / devtmpfs 980M 0 980M 0% /dev tmpfs 992M 0 992M 0% /dev/shm tmpfs 992M 9.6M 982M 1% /run tmpfs 992M 0 992M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 199M 0 199M 0% /run/user/0
2.nfs服務(wù)端崩潰導(dǎo)致重啟服務(wù)器卡死
1.如果nfs客戶端設(shè)置了/etc/fstab開機(jī)自啟,重啟服務(wù)器后會導(dǎo)致無法正確掛載nfs服務(wù)端,卡死無法啟動,解決辦法就是等待1分鐘30秒左右會自動正確自動 2.進(jìn)入單用戶模式,緊急模式,修復(fù)/etc/fstab文件,重啟即可
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209322 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9123瀏覽量
85322 -
NFS
+關(guān)注
關(guān)注
1文章
53瀏覽量
26101
原文標(biāo)題:打造高效共享存儲:一步步實現(xiàn) NFS 服務(wù)搭建
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論