NFS用的比較多,可是更新沒有想象的那麼快,Nginx一年要迭代不少個版本,而NFS最新版本4.1是2010年更新的,到目前爲止尚未更新過,但這並不影響NFS使用的普遍性html
RPC協議爲Remote Procedure Call,即爲遠程過程調用,RPC須要爲NFS提供一些支持,好比兩臺機器服務器端和客戶端通訊的時候,他們之間自己不能直接通訊,須要藉助於RPC這個協議來完成mysql
NFS架構以下:sql
有一個場景是:ABC三臺服務器作成負載均衡,數據存儲在A上,當A上的數據一旦發生了變化,就會當即將更新的的文件共享出來,B和C上立刻就能看到,或者說B上更新了文件,A和C也能立刻看到,這種需求咱們能夠經過NFS這個服務實現vim
NFS原理圖以下:centos
NFS原理:服務器端要啓動一個NFS服務,服務器端要想給客戶端提供服務,就要藉助於RPC協議,而RPC協議是經過rpcbind這個服務所實現的,protmap是在centos5以前的版本中的叫法,在centos六、centos7中就叫作rpcbind,其實是一個東西,最終都是啓動這個服務,實現RPC通訊;默認NFS不會監放任何端口,最終監聽端口實現TCP/IP通訊過程的是rpcbind這個服務產生的RPC協議實現的,rpcbind監聽的端口是111,RPC通訊時,NFS服務會在RPC協議裏註冊一個端口,NFS告訴RPC他本身通訊的端口是什麼,而後服務端RPC把這個端口號告訴客戶端rpcbind,而後客戶端這臺機器再和服務端的這個端口通訊,最終實現數據的傳輸(問題:網站數據存放是存放在一臺機器上的嗎?RPC通訊只會傳輸端口號嘛?數據只經過兩臺機器RPC客戶端機器會保留網站的數據文件嗎?)服務器
NFS(Network File System)即網絡文件系統,它容許網絡中的計算機之間經過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用能夠透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件同樣,也就是說客戶端PC能夠掛載NFS服務器所提供的目錄而且掛載以後這個目錄看起來如同本地的磁盤分區同樣,可使用cp、cd、mv、rm及df等與磁盤相關的命令。網絡
在作這個實驗以前,咱們先準備好了兩臺虛擬機,IP分別爲192.168.31.157和192.168.31.149 ,他們中31.157作客戶端,31.149作服務端,下面咱們來安裝配置架構
一、安裝服務端軟件負載均衡
# yum install -y nfs-utils rpcbind //安裝nfs-utils和rpcbind兩個包async
二、安裝客戶端軟件
# yum install -y nfs-utils //安裝nfs-utils
從下圖的安裝過程能夠看到,在安裝nfs-utils的過程當中,也會自動地將rpcbind安裝上,因此上一個步驟命令中的rpcbind實際上是能夠省略的
安裝完成後咱們來查看兩臺機器監聽的端口,此時已經監聽了111端口了
三、在服務端編輯配置文件
# vim /etc/exports
在配置文件中加入如下內容:
/home/nfstestdir/ //這行內容是服務端共享出來的目錄,此目錄目前還不存在,須要手動建立
192.168.31.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000) //定義IP或IP段
四、在服務端建立分享目錄
# mkdir /home/nfstestdir/
五、更改分析目錄權限
# chmod 777 /home/nfstestdir/
六、啓動rpcbind
# systemctl start rpcbind //若是沒有啓動rpcbind的話能夠執行此命令啓動rpcbind
七、啓動nfs服務
# systemctl start nfs
# ps aux |grep rpc //啓動nfs服務成功後咱們再來查看rpc,能夠看到在啓動nfs時會自動地啓動rpc的一些服務
八、開機啓動
若是咱們想讓nfs開機啓動,須要執行如下命令
# systemctl enable nfs
• rw read write讀寫
• ro read only只讀
• sync 同步模式,內存數據實時寫入磁盤,能夠很快地將數據寫到磁盤中去,可是這樣會相應地下降磁盤的效率
• async 非同步模式,與sync相對,async會每隔一段時間將內存中的數據寫入到磁盤中去,這樣作的好處是可以保證磁盤的效率,很差的地方是萬一斷電,數據可能會丟失一部分
• no_root_squash 客戶端掛載NFS共享目錄後,root用戶不受約束,權限很大,客戶端的root用戶不受限制,能夠像訪問本地文件同樣訪問服務端的共享文件
• root_squash 與上面選項相對,客戶端上的root用戶收到約束,被限定成某個普通用戶
• all_squash 客戶端上全部用戶在使用NFS共享目錄時都被限定爲一個普通用戶
• anonuid/anongid 和上面幾個選項搭配使用,定義被限定用戶的uid和gid
一、安裝nfs-utils
# yum install -y nfs-utils //前面咱們已經按照好了,在安裝nfs-utils的過程當中,也會自動地將rpcbind安裝上,
二、查看客戶端是否有訪問服務端的權限
# showmount -e 192.168.31.149 //這個IP就是我配置的NFS服務端IP
上面的訪問結果提示咱們網絡不通,緣由之一多是服務端rpcbind服務沒有開啓,沒有監聽111端口,咱們可使用下面命令查看
# ps aux |grep rpc //下圖能夠看到111端口已經開啓
另一個緣由多是防火牆致使,要想讓nfs實現正常的通訊,咱們還須要將防火牆關一下,由於nfs這個服務比較特殊,雖然rpc已經能夠通訊了,即便說111端口已經放行了,可是nfs不必定可以正常通訊,由於他們用了一個不固定的端口,此時咱們須要將服務端和客戶端的防火牆先關閉
# systemctl stop firewalld //關閉服務端和客戶端的防火牆
# setenforce 0 //只關閉服務端的SELinux
而後咱們再來查詢訪問權限,能夠看到已經有訪問權限了
# showmount -e 192.168.31.149
上圖提示程序未註冊,經查詢資料,咱們重啓了rpcbind和nfs,再來執行上條命令,出現以下提示
經排查,發現/etc/exports配置文件行首多了幾個空格,修改這個文件
修改完畢後,咱們來執行# exportfs -ar
沒有提示錯誤,而後再來重啓rpcbind和nfs,重啓成功後,咱們到用戶端再次執行如下命令查看訪問權限
# showmount -e 192.168.31.149
若是出現上圖提示,則說明咱們有讀寫服務端共享文件的權限
三、掛載
咱們須要在客戶端將服務端提供的共享目錄看成本地磁盤同樣掛載
# mount -t nfs 192.168.31.149:/home/nfstestdir/ /mnt/ //掛載
# df -h //查看掛載是否成功,能夠看到咱們已經成功掛載了
四、測試驗證
下面咱們來驗證兩邊的數據是否能同步 ,首先是客戶端的操做
# cd /mnt //首先切換到共享目錄下
# touch lj.html //而後咱們在客戶端共享目錄下建立一個文件
# ls -l // 查看新建立的這個文件的詳細信息
咱們能夠看到這個由客戶端建立的文件的屬主和屬組均爲mysql,而後咱們又來查看下服務端
# ls -l /home/nfstestdir //查看下服務端共享目錄下是否更新了剛纔咱們建立的文件lj.html
上面的對比咱們能夠看到文件的屬主和屬組均爲mysql,這是由於咱們再/etc/exports文件中anonuid=1000,anongid=1000兩處配置的意思就是讓全部在共享目錄中建立的文件其屬主和屬組均爲此處設置的1000這個id號對應用戶,下面咱們來看下1000這個id對應的屬主和屬組是否是就是mysql呢
從這張圖能夠看到mysql用戶的id號爲1000
其實不管是用戶端仍是服務端在這個目錄建立的文件,其屬主和屬組均爲mysql