NFS=Network File System=網絡文件系統。
主要功能是經過網絡(通常是局域網)讓不一樣的主機系統之間能夠共享文件或目錄。
NFS客戶端(通常爲應用服務器,例如web)能夠經過掛載(mount)的方式將NFS服務器端共享的數據目錄掛載到NFS客戶端本地系統中(就是某一個掛載點下)。從客戶端本地看,NFS服務器端共享的目錄就好像是客戶端本身的磁盤分區或者目錄同樣,而實際上倒是遠端的NFS服務器的目錄。
分佈式文件系統:Moosefs(mfs)、GlusterFS、FastDFS(推薦)
NFS屬於本地文件存儲服務。
NFS主要用於存儲web服務器上用戶上傳的數據信息,圖片 附件 頭像 視頻 音頻。
前端
(1)能夠實現數據統一共享存儲
(2)節省架構服務運營成本
node
優勢:配置 安裝簡單
缺點:沒有認證功能 分佈式存儲/ftp/samba
沒法支持高併發存儲 日PV 2000萬
沒法實現高可用 分佈式存儲/keepalived
mysql
(1)FTP服務部署
(2)samba服務部署(可讓Windows與linux同時訪問)
linux
能夠實現數據共享,數據統一一致,節省架構服務運營成本
web
(1)在nfs服務端建立共享目錄
(2)經過mount 網絡掛載,將NFS服務端共享目錄掛載到NFS客戶端本地目錄上。
(3)NFS客戶端掛載目錄上建立、刪除、查看數據操做,等價於在服務端進行建立、刪除、查看數據操做。
sql
由於NFS的各項功能都須要向RPC服務(rpcbind服務)註冊,因此只有RPC服務才能獲取到NFS服務的各項功能對應的端口號(port number)、PID、NFS在主機所監聽的IP等信息,而NFS客戶端也只能經過向RPC服務詢問才能找到正確的端□。也就是說,NFS須要有RPC服務的協助才能成功對外提供服務。
windows
當訪問程序經過NFS客戶端向NFS服務器存取文件時,其請求數據流程大體以下:
(1)首先用戶訪間網站程序,由程序在NFS客戶端上發出存取NFS文件的請求,這時NFS客戶端(即執行程序的服務器)的RPC服務(rpcbind服務)就會經過網絡向NFS服務器端的RPC服務(rpcbind服務)的111端口發出NFS文件存取功能的詢間請求.
(2)NFS服務器端的RPC服務(rpcbind服務)找到對應的已註冊的NFS端口後,通知NFS客戶端的RPC服務。l
(3)此時NFS客戶端獲取到正確的端口,並與NFS daemon聯機存取數據
(4)NFS客戶端把數據存取成功後,返回給前端訪間程序,告知用戶存取結果,做爲網站用戶,就完成了一次存取操做。
後端
RPC 遠程過程調用程序。先啓動PRC服務,而後在啓動NFS。
centos
yum install -y nfs-utils rpcbind rpm -qa nfs-utils rpm -qa rpcbind
vim /etc/exports #進入配置文件 /data 172.16.1.0/24(rw,sync) #寫入命令 # /data 能夠進行共享存儲目錄 # 172.16.1.0/24(rw,sync) 容許存儲數據網段信息(存儲目錄權限配置 存儲數據方式配置)
sync=同步方式存儲數據:用戶有數據存儲 ---- 存儲服務器(磁盤中) 存儲安全性高
async=異步方式存儲數據:用戶有數據存儲 ---- 內存 --- 存儲服務器(磁盤中) 存儲效率高
mkdir /data chown nfsnobody.nfsnobody /data
systemctl start rpcbind systemctl reload rpcbind #重啓rpcbind 平滑重啓 systemctl enable rpcbind systemctl start nfs systemctl reload nfs #重啓nfs systemctl enable nfs ### restart:將全部鏈接會話都會直接斷開 ### reload: 只會將沒有數據傳輸連接斷開,從新創建鏈接,讓用戶訪問感覺更好
yum install -y nfs-utils
mount -t nfs 172.16.1.31:/data /mnt
客戶端建立文件: [root@web01 mnt]#ls [root@web01 mnt]#touch test.txt [root@web01 mnt]#ls test.txt 服務端同步文件: [root@nfs01 data]#ls [root@nfs01 data]#ls test.txt 服務端與客戶端文件同步,則測試成功。
ro | 只讀配置,使存儲目錄權限位只讀,使開發人員只能看 | |
---|---|---|
rw | 讀寫權限 | |
sync | 同步存儲數據 | |
async | 異步存儲數據 | |
all_squash | 不論什麼用戶包括root,都映射爲指定nfsnobody用戶 | |
no_all_squash | 對普通用戶不作映射,無權限。root用戶映射爲nfsnobody | |
root_squash | 將root用戶映射爲指定nfsnobody用戶,普通用戶無權限 | |
no_root_squash | 將root用戶不作映射,普通用戶無權限 | |
anonuid | 指定uid,指定映射成什麼用戶 | |
anongid | 指定gid,指定映射成什麼用戶 |
在企業中,通常選用no_all_squash,root_squash。
第一步:服務端修改服務配置文件
vim /etc/exports /data 172.16.1.0/24(rw,sync,all_squash) systemctl reload nfs
第二步:客戶端上傳數據測試
[root@web01 mnt]#touch test.txt [root@web01 mnt]#ll test.txt -rw-r--r-- 1 nfsnobody nfsnobody 0 Jul 16 20:57 test.txt
第一步:服務端修改服務配置文件
vim /etc/exports /data 172.16.1.0/24(rw,sync,no_all_squash) systemctl reload nfs
第二步:客戶端上傳數據測試
[root@web01 mnt]# touch aaa.txt [root@web01 mnt]# ll -rw-rw-r-- 1 1017 1017 0 Jul 16 12:08 aaa.txt ### 用戶傳輸數據身份沒有變化,看用戶uid信息
第一步:服務端修改服務配置文件
vim /etc/exports /data 172.16.1.0/24(rw,sync,root_squash) systemctl reload nfs
第二步:客戶端上傳數據測試
[root@web01 mnt]# touch bbb.txt [root@web01 mnt]# ll -rw-r--r-- 1 nfsnobody nfsnobody 0 Jul 16 12:19 bbb.txt ### root用戶會映射爲指定的nfsnobody用戶
第一步:服務端修改服務配置文件
vim /etc/exports /data 172.16.1.0/24(rw,sync,no_root_squash) systemctl reload nfs
第二步:客戶端上傳數據測試
[root@web01 mnt]# touch ccc.txt [root@web01 mnt]# ll -rw-r--r-- 1 root root 0 Jul 16 12:22 ccc.txt ### 將root用戶不作映射
要求服務端:
/data/w 可讀可寫權限,全部用戶都作映射, 採用同步傳輸數據
/data/r 只能讀取數據,只有root用戶組映射,採用異步傳輸數據
要求客戶端:
backup /data/w --掛載點 /data/w 能夠存儲數據
web01 /data/r --掛載點 /data/r 不能存儲數據
解決服務端:
(1)編寫配置文件
vi /etc/exports /data/w 172.16.1.0/24(rw,sync,all_squash) /data/r 172.16.1.0/24(ro,async,root_squash)
(2)建立共享存儲目錄
web01: mkdir /data/r chown nfsnobody.nfsnobody /data/r backup: mkdir /data/w chown nfsnobody.nfsnobody /data/w
(3)重啓存儲服務
systemctl reload nfs
解決客戶端:
(1)建立掛載點目錄
web01:mkdir /data/r backup:mkdir /data/w
(2)進行掛載
web01 mount -t nfs 172.16.1.31:/data/r /data/r backup mount -t nfs 172.16.1.31:/data/w /data/w
(3)驗證成功
[root@web01 r]#touch hh.txt touch: cannot touch ‘hh.txt’: Read-only file system ### 只讀權限,因此出現這種狀況纔是正常 [root@backup w]#touch kk.txt ### 讀寫權限,因此能建立 [root@backup w]#ls kk.txt
(1)服務端配置文件參數 exports文件裏ro/rw參數
(2)服務端自己目錄權限
(3)服務端共享目錄權限存在繼承關係 例如:/data,/data/r
PS:建議設置共享目錄時,不要存在父級與子級關係
(4)客戶端掛載參數是否爲 ro
ls: cannot open directory .: Stale file handle (文件句柄錯誤)
出現緣由: 當父級和子級目錄同時進行掛載時,一旦父級目錄取消共享,可是客戶端仍是處於掛載狀態
問題解決: 將和父級目錄有關的全部掛載點所有卸載,從新掛載
Cannot register service: RPC: Unable to receive;
出現緣由: 服務啓動順序不正確
問題解決: 關閉全部服務,按順序進行啓動
出現掛載卡死狀況
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
出現緣由: 服務端開啓防火牆,阻止客戶端訪問
問題解決: 關閉防火牆
服務端採用restart狀況,會有一個90s延遲;形成客戶端掛載好共享目錄,90s內沒法存儲數據
出現緣由:
cat /etc/sysconfig/nfs|grep 90
#NFSD_V4_GRACE=90
#NFSD_V4_LEASE=90
未註冊狀況
[root@nfs01 ~]# rpcinfo -p localhost 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
已經進行註冊
[root@nfs01 ~]# rpcinfo -p localhost program vers proto port service 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 100005 1 udp 20048 mountd 100005 1 tcp 20048 mountd 100005 2 udp 20048 mountd 100005 2 tcp 20048 mountd 100005 3 udp 20048 mountd 100005 3 tcp 20048 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 60318 nlockmgr 100021 3 udp 60318 nlockmgr 100021 4 udp 60318 nlockmgr 100021 1 tcp 32828 nlockmgr 100021 3 tcp 32828 nlockmgr 100021 4 tcp 32828 nlockmgr
命令:showmount -e 172.16.1.31 NFS沒有安裝,不能使用showmount
[root@nfs01 data]#showmount -e 172.16.1.31 Export list for 172.16.1.31: /data/r 172.16.1.0/24 /data/w 172.16.1.0/24
/etc/exports #配置文件 /var/lib/nfs/etab #記錄nfs服務默認配置參數信息 rpcinfo -p 172.16.1.31 #檢查nfs是否向rpc註冊 showmount -e 172.16.1.31 #檢查nfs服務是否存在共享目錄 /usr/sbin/exportfs #能夠平滑重啓nfs服務,能夠臨時設置共享存儲目錄 平滑重啓服務:exportfs -rv 臨時建立目錄:exportfs -o rw,sync 192.168.232.0/24:/data01
mount -t nfs 172.16.1.31:/data /mnt
方法一:vi /etc/rc.local mount -t nfs 172.16.1.31:/data /mnt 方法二:vi /etc/fstab文件 172.16.1.31:/data /mnt nfs defaults 0 0
centos6
啓動系統 -- 加載fstab -- 啓動network網絡服務 -- netfs(在系統啓動完畢以後,再次加載fstab)
centos7
啓動系統 -- 加載fstab -- 啓動network網絡服務 -- remote-fs.target(在系統啓動完畢以後,再次加載fstab)
出現緣由:在客戶端上配置自動nfs服務掛載 --- 耦合度過高
解決問題:
(1)取消自動掛載
(2)啓動順序 先開啓後端服務(nfs mysql backup 緩存服務) 在開啓前端服務(web服務 負載均衡服務)
rw | 讓掛載點目錄具備可讀可寫權限 相反ro | |
---|---|---|
suid=setuid | 讓掛載點目錄中的文件特殊權限位生效 相反nosuid 安全 | |
dev | 讓掛載點目錄存儲設備文件保持屬性不變 | |
exec | 讓掛載點目錄中的執行文件能夠執行 相反noexec | |
auto(mount -a) | 讓掛載點目錄實現快速自動掛載 相反noauto | |
nouser | 讓普通用戶是否能夠卸載和掛載目錄 相反user | |
async | 數據異步存儲概念,相反sync同步存儲 | |
noatime | 訪問文件時不更新文件的inode時間戳,高併發環境下,推薦顯示應用該選項,能夠提升系統I/O性能。性能優化 | |
nodiratime | 不更新文件系統上的directory inode時間戳,高併發環境,推薦顯式應用該選項,能夠提升系統I/O性能。性能優化 | |
remount | 在不進行卸載掛載點時,直接從新掛載修改掛載參數 文件系統只讀:mount -o remount,rw / 解決 |
|
rsize=262144 | 設置一個緩存區 262144字節 設置大小和內存有關 用戶 (讀取) --- web01 /data 2M --- nfs /data 10M 壓力大 |
|
wsize=262144 | 設置一個緩衝區 262144字節 用戶(存儲) --- web01 /data 10M --- nfs /data 10M 壓力大 |
|
hard | 當服務端處於關閉狀態,客戶端會處於一直掛載 | |
soft | 當服務端處於關閉狀態,不會一直掛載 | |
proto=tcp | 掛載協議 |
客戶端重要文件:/proc/mounts --- 查看到mount掛載命令默認參數信息
強行進行卸載:umount -lf
(1)更新yum源
(2)利用rpm安裝軟件 得到rpcbind軟件包
vim /etc/yum.conf cachedir=/var/cache/yum/$basearch/$releasever --- 下載軟件保存路徑 keepcache=1 --- 下載軟件保留下來,不要被刪除 rpm -ivh rpcbind-0.2.0-47.el7.x86_64.rpm.rpm --- 安裝rpcbind