nfs大綱
1.nfs是干什么
1.什么是NFS乳幸,NFS是Network File System的縮寫及網(wǎng)絡文件系統(tǒng)符欠。
2.NFS能干什么希柿,它的主要功能是通過局域網(wǎng)絡讓不同主機系統(tǒng)之間可以共享文件和目錄曾撤。
和Windows網(wǎng)絡共享很像
windows\linux\macos
3.為什么要使用NFS,NFS解決了什么問題巫湘?
解決多臺web靜態(tài)資源的共享(所有客戶端都掛載服務端,看到的數(shù)據(jù)都一樣)
解決多臺web靜態(tài)資源一致性(如果客戶端A刪除NFS服務上的test文件洞渤,客戶端B上也會看不見test文件)
解決多臺web磁盤空間的浪費(有用戶上傳圖片,就使用rsync進行一次同步)
需要注意的問題:
由于用戶請求靜態(tài)資源每次都需要web連接NFS服務獲取,那么勢必會帶來一定的網(wǎng)絡開銷护昧、以及網(wǎng)絡延時、所以增加NFS服務并不能給網(wǎng)站帶來訪問速度的提升。
如果希望對靜態(tài)資源進行加速浴捆,建議將靜態(tài)資源統(tǒng)一存放至NFS服務端选泻,便于統(tǒng)一推送至CDN,以此來實現(xiàn)靜態(tài)資源的加速窝撵。
CDN:將源站內容分發(fā)至最接近用戶的節(jié)點,使用戶可就近取得所需內容襟铭,提高用戶訪問的響應速度和成功率碌奉。
NFS共享存儲
分布式共享存儲: glusterfs fastdfs ceph
nfs沒什么用: 為什么要學?
1.理解什么是共享存儲
2.后面很多課程需要使用共享存儲 nfs
3.簡單\容易理解\
2.nfs是怎么存數(shù)據(jù)
本地文件操作方式
1.當用戶執(zhí)行mkdir命令,BashShell無法完成該命令操作寒砖,會將其翻譯給內核赐劣。
2.Kernel內核解析完成后會驅動對應的磁盤設備,完成創(chuàng)建目錄的操作哩都。
NFS實現(xiàn)原理(需要先了解[程序|進程|線程])
1.NFS客戶端執(zhí)行增魁兼、刪等操作,客戶端會使用不同的函數(shù)對該操作進行封裝咐汞。
2.NFS客戶端會通過TCP/IP的方式傳遞給NFS服務端锌仅。
3.NFS服務端接收到請求后伊脓,會先調用portmap進程進行端口映射纯蛾。
4.nfsd進程用于判斷NFS客戶端是否擁有權限連接NFS服務端。
5.Rpc.mount進程判斷客戶端是否有對應的權限進行操作俄认。
6.idmap進程實現(xiàn)用戶映射和壓縮役拴。
7.NFS服務端將客戶端的函數(shù)轉換為本地能執(zhí)行的命令髓考,然后將命令傳遞至內核查蓉,由內核驅動硬件
注意: 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網(wǎng)段掛載到本地的/mnt目錄,并能寫入數(shù)據(jù)
服務端
[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
數(shù)據(jù)到底在哪?
nfs服務器
有人說數(shù)據(jù)就在web上面? 錯誤 數(shù)據(jù)始終都是在存儲上面
希望開機自啟動:
#cat /etc/fstab
172.16.1.31:/data /opt nfs defaults 0 0
如果當nfs故障
開機狀態(tài): 那么客戶端輸入df -h 則會夯住
解決方法: 強制卸載
mount #查看所有的掛載信息
umount -lf /opt #強制卸載
重啟系統(tǒng): 會導致系統(tǒng)無法啟動
單用戶: e enforcing=0 init=/bin/bash ctrl+x
mount -o remount,rw /
NFS配置詳解
nfs共享參數(shù) 參數(shù)作用
rw* 讀寫權限
ro 只讀權限
root_squash 當NFS客戶端以root管理員訪問時凌蔬,映射為NFS服務器的匿名用戶(不常用)
no_root_squash 當NFS客戶端以root管理員訪問時坎弯,映射為NFS服務器的root管理員(不常用)
all_squash 無論NFS客戶端使用什么賬戶訪問囚灼,均映射為NFS服務器的匿名用戶(常用)
no_all_squash 無論NFS客戶端使用什么賬戶訪問,都不進行壓縮
sync* 同時將數(shù)據(jù)寫入到內存與硬盤中,保證不丟失數(shù)據(jù)
async 優(yōu)先將數(shù)據(jù)保存到內存破花,然后再寫入硬盤蹂喻;這樣效率更高,但可能會丟失數(shù)據(jù)
anonuid* 配置all_squash使用,指定NFS的用戶UID,必須存在系統(tǒng)
anongid* 配置all_squash使用,指定NFS的用戶UID,必須存在系統(tǒng)
驗證: 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屬主和屬組不爽,請執(zhí)行 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.創(chuàng)建共享的目錄,以及用戶,并進行授權
[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存儲優(yōu)點
1.NFS簡單易用蘸泻、方便部署、數(shù)據(jù)可靠、服務穩(wěn)定崩侠、滿足中小企業(yè)需求漆魔。
2.NFS的數(shù)據(jù)都在文件系統(tǒng)之上,所有數(shù)據(jù)都是能看得見。
2.NFS存儲局限
1.存在單點故障, 如果構建高可用維護麻煩
2.NFS數(shù)據(jù)都是明文,并不對數(shù)據(jù)做任何校驗改抡,也沒有密碼驗證(強烈建議內網(wǎng)使用)矢炼。
3.NFS應用建議
1.生產場景應將靜態(tài)數(shù)據(jù)(jpg\png\mp4\avi\css\js)盡可能放置CDN進行加速, 以此來減少后端存儲壓力
2.如果沒有緩存或架構、代碼等阿纤,本身歷史遺留問題太大句灌,在多存儲也沒意義
明天: sersync實時同步
案例: 實現(xiàn)web上傳視頻文件,實則是寫入NFS至存儲欠拾,當NFS存在新的數(shù)據(jù)則會實時的復制到備份服務器
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
加入開機自啟