nfs大綱
1.nfs是干什么
1.什么是NFS,NFS是Network File System的縮寫及網絡文件系統。
2.NFS能干什么,它的主要功能是通過局域網絡讓不同主機系統之間可以共享文件和目錄。
和Windows網絡共享很像
windows\linux\macos
3.為什么要使用NFS,NFS解決了什么問題?
解決多臺web靜態資源的共享(所有客戶端都掛載服務端,看到的數據都一樣)
解決多臺web靜態資源一致性(如果客戶端A刪除NFS服務上的test文件,客戶端B上也會看不見test文件)
解決多臺web磁盤空間的浪費(有用戶上傳圖片,就使用rsync進行一次同步)
需要注意的問題:
由于用戶請求靜態資源每次都需要web連接NFS服務獲取,那么勢必會帶來一定的網絡開銷、以及網絡延時、所以增加NFS服務并不能給網站帶來訪問速度的提升。
如果希望對靜態資源進行加速,建議將靜態資源統一存放至NFS服務端,便于統一推送至CDN,以此來實現靜態資源的加速。
CDN:將源站內容分發至最接近用戶的節點,使用戶可就近取得所需內容,提高用戶訪問的響應速度和成功率。
NFS共享存儲
分布式共享存儲: glusterfs fastdfs ceph
nfs沒什么用: 為什么要學?
1.理解什么是共享存儲
2.后面很多課程需要使用共享存儲 nfs
3.簡單\容易理解\
2.nfs是怎么存數據
本地文件操作方式
1.當用戶執行mkdir命令,BashShell無法完成該命令操作,會將其翻譯給內核。
2.Kernel內核解析完成后會驅動對應的磁盤設備,完成創建目錄的操作。
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服務
3.nfs怎么使用
安裝
yum install nfs-utils -y #依賴rpcbind軟件包
配置
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,all_squash)
準備共享目錄
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data/
啟動
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server
客戶端測試掛載:
[root@web01 ~]# yum install nfs-utils -y
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /opt
[root@web01 ~]# df -h
客戶端測試寫入
[root@web01 opt]# mkdir dir
[root@web01 opt]# ll
total 0
drwxr-xr-x. 2 nfsnobody nfsnobody 6 May 22 03:01 dir
怎么判斷nfs服務啟動異常:
systemctl status nfs-server
[root@nfs ~]# cat /var/lib/nfs/etab
#有記錄則代表共享的沒問題
#無記錄則代表共享的有問題
使用nfs在共享一個/data1目錄,讓客戶端web01能通過172網段掛載到本地的/mnt目錄,并能寫入數據
服務端
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,all_squash)
/data1 172.16.1.0/24(rw,all_squash)
[root@nfs ~]# mkdir /data1
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data1/
[root@nfs ~]# systemctl restart nfs-server
客戶端
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data1 172.16.1.0/24
/data 172.16.1.0/24
[root@web01 ~]# mount -t nfs 172.16.1.31:/data1 /mnt/
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
172.16.1.31:/data 37G 3.8G 34G 11% /opt
172.16.1.31:/data1 37G 3.8G 34G 11% /mnt
數據到底在哪?
nfs服務器
有人說數據就在web上面? 錯誤 數據始終都是在存儲上面
希望開機自啟動:
#cat /etc/fstab
172.16.1.31:/data /opt nfs defaults 0 0
如果當nfs故障
開機狀態: 那么客戶端輸入df -h 則會夯住
解決方法: 強制卸載
mount #查看所有的掛載信息
umount -lf /opt #強制卸載
重啟系統: 會導致系統無法啟動
單用戶: e enforcing=0 init=/bin/bash ctrl+x
mount -o remount,rw /
NFS配置詳解
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,必須存在系統
驗證: ro
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(ro,all_squash)
[root@nfs ~]# systemctl restart nfs
客戶端測試
[root@web01 opt]# touch file
touch: cannot touch 'file': Read-only file system
驗證: all_squash anonuid anongid
服務端操作
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[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)
[root@nfs ~]# chown -R www.www /data
[root@nfs ~]# systemctl restart nfs
客戶端掛載
[root@web01 ~]# mount -t nfs 172.16.1.31:/data/ /opt
如果客戶端覺得看666屬主和屬組不爽,請執行 groupadd 和useradd添加一個666的用戶
[root@web01 opt]# ll
drwxr-xr-x. 2 666 666 6 May 22 03:01 dir
-rw-r--r--. 1 666 666 0 May 22 07:00 file
[root@web01 opt]# groupadd -g 666 www
[root@web01 opt]# useradd -u 666 -g 666 www
[root@web01 opt]# ll
drwxr-xr-x. 2 www www 6 May 22 03:01 dir
-rw-r--r--. 1 www www 0 May 22 07:00 file
NFS案例實踐
準備3臺虛擬機服務器,并且請按照要求搭建配置NFS服務。
NFS服務端(A)172.16.1.31
NFS客戶端(B)172.16.1.7
NFS客戶端(C)172.16.1.41
1.在NFS服務端(A)上共享/data/w(讀寫rw)及/data/r(只讀ro)
2.在NFS客戶端(B/C)上進行掛載測試
服務端:
1.配置共享
[root@nfs ~]# cat /etc/exports
/data/w 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data/r 172.16.1.0/24(ro,sync,all_squash,anonuid=666,anongid=666)
2.創建共享的目錄,以及用戶,并進行授權
[root@nfs ~]# mkdir /data/{r,w} -p
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -u 666 -g 666 www
[root@nfs ~]# chown -R www.www /data/r/
[root@nfs ~]# chown -R www.www /data/w/
3.重啟服務
[root@nfs ~]# systemctl restart nfs-server
4.檢查共享是否成功
[root@nfs ~]# cat /var/lib/nfs/etab
/data/r 172.16.1.0/24(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,ro,secure,root_squash,all_squash)
/data/w 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,rw,secure,root_squash,all_squash)
客戶端:
[root@web01 ~]# mount 172.16.1.31:/data/r /opt/
[root@web01 ~]# mount 172.16.1.31:/data/w /mnt/
測試寫:
[root@web01 mnt]# touch file123
[root@web01 mnt]# ls
file123
測試讀:
root@web01 ~]# cd /opt/
[root@web01 opt]# ls
[root@web01 opt]# touch file
touch: cannot touch 'file': Read-only file system
NFS存儲總結
1.NFS存儲優點
1.NFS簡單易用、方便部署、數據可靠、服務穩定、滿足中小企業需求。
2.NFS的數據都在文件系統之上,所有數據都是能看得見。
2.NFS存儲局限
1.存在單點故障, 如果構建高可用維護麻煩
2.NFS數據都是明文,并不對數據做任何校驗,也沒有密碼驗證(強烈建議內網使用)。
3.NFS應用建議
1.生產場景應將靜態數據(jpg\png\mp4\avi\css\js)盡可能放置CDN進行加速, 以此來減少后端存儲壓力
2.如果沒有緩存或架構、代碼等,本身歷史遺留問題太大,在多存儲也沒意義
明天: sersync實時同步
案例: 實現web上傳視頻文件,實則是寫入NFS至存儲,當NFS存在新的數據則會實時的復制到備份服務器
rsync
nfs
sersync
EXAMPLE
# sample /etc/exports file
共享什么東西 共享給誰(擁有什么權限)
/ master(rw) trusty(rw,no_root_squash)
/projects proj*.local.domain(rw)
/usr *.local.domain(ro) @trusted(rw)
/home/joe pc001(rw,all_squash,anonuid=150,anongid=100)
/pub *(ro,insecure,all_squash)
/srv/www -sync,rw server @trusted @external(ro)
/foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
/build buildhost[0-9].local.domain(rw)
Stale NFS file handle的解決方法
https://dikar.iteye.com/blog/634862
nfs錯誤:
[root@web01 ~]# mount -t nfs 10.0.0.31:/data /mnt/
mount.nfs: access denied by server while mounting 10.0.0.31:/data
你沒有權限訪問我的nfs服務器
寫錯了共享的目錄名
nfs已掛載:
[root@web01 opt]# mkdir dir
mkdir: cannot create directory 'dir': Permission denied
nfs
[root@web01 ~]# showmount -e 172.16.1.31
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
建議關閉掉 firewalld
建議關閉掉 selinux
加入開機自啟