一:NFS基本概述
NFS是Network File System的縮寫及網絡文件系統。NFS主要功能是通過局域網絡讓不同的主機系統之間可以共享文件或目錄。
NFS系統和Windows網絡共享、網絡驅動器類似, 只不過windows用於局域網, NFS用於企業集群架構中, 如果是大型網站, 會用到更復雜的分布式文件系統FastDFS,glusterfs,HDFS
1 為什么使用共享存儲?
-
1.實現多台服務器之間數據共享
-
2.實現多台服務器之間數據一致
二:NFS應用場景
1.1 集群沒有共享存儲
1.A用戶上傳圖片經過負載均衡,負載均衡將上傳請求調度至WEB1服務器上。
2.B用戶訪問A用戶上傳的圖片,此時B用戶被負載均衡調度至WEB2上,因為WEB2上沒有這張圖片,所以B用戶無法看到A用戶傳的圖片。
1.2 集群有共享存儲
1.A用戶上傳圖片無論被負載均衡調度至WEB1還是WEB2, 最終數據都被寫入至共享存儲
2.B用戶訪問A用戶上傳圖片時,無論調度至WEB1還是WEB2,最終都會上共享存儲訪問對應的文件,這樣就可以訪問到資源了
三:NFS實現原理
四:NFS服務安裝
環境准備:
服務器系統 | 角色 | 外網IP | 內網IP |
---|---|---|---|
CentOS 7.5 | NFS服務端 | eth0:10.0.0.31 | eth1:172.16.1.31 |
CentOS 7.5 | NFS客戶端web01 | eth0:10.0.0.7 | eth1:172.16.1.7 |
CentOS 7.5 | NFS客戶端web02 | eth0:10.0.0.8 | eth1:172.16.1.8 |
1. 配置nfs服務端
一:安裝nfs和rpcbind 因為nfs用的是rpc協議
yum -y install nfs-utils #yum安裝nfs服務里有rpcbind的依賴包
nfs-utils是NFS的服務器端管理工具(NFS是內核模塊),不光服務端需要,客戶端也需要安裝,不然無法掛載成功。
1.1查看軟件包
[root@backup ~]# rpm -qa | egrep "nfs|rpcbind"
rpcbind-0.2.0-47.el7.x86_64
libnfsidmap-0.25-19.el7.x86_64
nfs-utils-1.3.0-0.61.el7.x86_64
[root@backup ~]# rpm -qa |grep -E "nfs|rpcbind"
rpcbind-0.2.0-47.el7.x86_64
libnfsidmap-0.25-19.el7.x86_64
nfs-utils-1.3.0-0.61.el7.x86_64
###########################擴展##########################
NFS在文件傳送或信息傳送過程中依賴於RPC協議。RPC,遠程過程調用 (Remote Procedure Call) 是能使客戶端執行其他系統中程序的一種機制。
NFS本身是沒有提供信息傳輸的協議和功能的,但NFS卻能讓我們通過網絡進行資料的分享,這是因為NFS使用了一些其它的傳輸協議。
而這些傳輸協議用到這個RPC功能的。可以這么理解RPC和NFS的關系:NFS是一個文件系統,而RPC是負責負責信息的傳輸。
RPC是一種通過網絡從遠程計算機程序上請求服務,其工作在TCP/UDP的111端口。
在Linux6/Centos7中實現RPC協議的軟件是RPCbind程序包,進程名稱是portmapper。RPC並不提供任何具體的服務,
要想提供具體的服務就必須在Linux上提供具體的軟件。而網絡文件系統(NFS)就是基於RPC協議工作的,
RPC會記錄NFS端口的信息,如此我們就能夠通過RPC實現服務端和客戶端溝通端口信息。PRC最主要的功能就是指定每個NFS功能所對應的port number,
並且通知客戶端,記客戶端可以連接到正常端口上去。
特別注意:一般修改NFS配置文檔后,是不需要重啟NFS的,直接在命令執行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。
###########################擴展##########################
啟動:# CentOS 6啟動方式;
$ service nfs restart
$ chkconfig nfs on
# CentOS 7啟動方式;
$ systemctl enable nfs.service
$ systemctl start nfs.service
### 2. 配置nfs配置文件
```
位置:/etc/exports 默認是空配
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/data :共享目錄,存在於我們本機上的目錄,我們想共享給網絡上的其他主機使用。
如果要共享/tmp/data目錄,那么此選項可以就直接寫/tmp/data目錄,這個目錄可以依照不同的權限共享給不同的主機。
172.16.1.0/24 :客戶端地址:客戶端地址能夠設置一個網絡,也可以設置單個主機。
參數:如讀寫權限rw,同步更新sync,壓縮來訪賬號all_squash,壓縮后的匿名賬號anonuid=uid,anongid=gid等等;
###########################擴展##########################
客戶端地址的設置主要有以下幾種方式:
1) 可以使用完整的IP或者是網絡號,例如192.168.100.100 或 192.168.8.0/24
2) 可以使用主機名,但這個主機名必須要在/etc/hosts內,或可以使用DNS找到該名稱才行,反正重點是可找到IP就行,
如果是主機名的話,還可以支持通配符,例如‘*’或‘?’均可接受;例如:host[1-8].ctos.zu,server?.test.com
###########################擴展##########################
rw:讀寫
sync:寫磁盤,持久化
all_squash:無論NFS客戶端使用什么賬戶訪問,均映射為NFS服務器的匿名用戶(常用)
就算用root訪問,也會映射成匿名用戶
anonuid=666,anonuid=666 :指定用戶uid和gid
```
### 3. 創建用戶
```
客戶端以什么身份來訪問?
客戶端訪問服務端默認是使用nfsnobody這個用戶來進行訪問的。uid和gid為65534。服務器默認共享時,也是加上了all_squash這個參數。
並制定anonuid為65534(也就是nfsnobayd用戶)。當然如果系統中nfsnobody是其他的uid,那么就有可能造成訪問權限出現問題。
所以最好我們可以通過一設置一個用戶來訪問,統一UID、GID。
[root@nfs ~]# tail -1 /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
因為需要跟web用戶一致,如果沒有一致,用戶上傳一張圖片,沒有權限上傳到/data目錄
[root@nfs ~]# groupadd www -g 666
[root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
```
### 4. 創建共享目錄並授權
```
mkdir /data
[root@nfs ~]# chown -R www.www /data/ #一定要和web端統一用戶,不然掛載無法上傳。
[root@nfs ~]# ll /data/ -d
drwxr-xr-x 2 www www 6 Aug 20 10:43 /data/
```
### 5. 啟動並設置開機自啟動
2. 配置nfs客戶端web01,web02
一:同樣安裝nfs和rpcbind,不需要啟動,因為只需要nfs的命令
二:安裝httpd和php 模擬web站點
yum -y install httpd php
2.1#找到站點目錄
rpm -ql httpd
/var/www/html
2.2上傳一個提交作業的腳本到html目錄並解壓並修改權限,
chown -R www.www /var/www/html
[root@web01 html]# ll
total 884
-rw-r--r-- 1 www www 147976 Mar 31 12:36 1.png
-rw-r--r-- 1 www www 139609 Mar 31 12:36 2.png
-rw-r--r-- 1 www www 138926 Mar 31 12:36 3.png
-rw-r--r-- 1 www www 38772 Apr 27 2018 bg.jpg
-rw-r--r-- 1 www www 2633 Aug 20 11:41 index.html
-rw-r--r-- 1 www www 52 May 10 2018 info.php
drwxr-xr-x 2 www www 27 Aug 20 11:59 upload
-rw-r--r-- 1 www www 1245 Aug 20 11:49 upload_file.php
2.3#修改文件上傳的路徑(這是一個php腳本)
[root@web01 html]# vim upload_file.php
<?php
header("Content-type:text/html;charset=utf-8");
ini_set('date.timezone','Asia/Shanghai');
//$wen="C:\wamp\www\linux-54-".date("Y-m-d");
$wen="/var/www/html/upload"; #修改路徑
$dd=date("Y-m-d");
$pre=preg_match("/^([0-9])+_/",$_FILES['file']["name"][0]);
$size =$_FILES['file']["size"][0];
if (!is_dir($wen.'/')) {
MKDIR($wen.'/', 0777);
}
2.4#在httpd配置文件中修改httpd服務的用戶
[root@web01 html]# vim /etc/httpd/conf/httpd.conf
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User www 將用戶改成www 否則無法上傳文件
Group www
或者:
[root@web01 html]# sed -i '/^Group/c Group www' /etc/httpd/conf/httpd.conf 將Croup開頭的替換成***
[root@web01 html]# sed -i '/^User/c User www' /etc/httpd/conf/httpd.conf
2.5 重啟服務上傳一個文件測試,會發現upload會出現這個文件
三:查看掛載點:showmount 需要安裝nfs才有的命令
################擴展#####################
showmount命令查詢“mountd”守護進程,以顯示NFS服務器加載的信息。
-d:僅顯示已被NFS客戶端加載的目錄;
-e:顯示NFS服務器上所有的共享目錄。
# showmount -e 172.16.1.31
顯示指定NFS服務器輸出目錄列表(也稱為共享目錄列表)
################擴展#####################
報錯:有時showmount -e 172.16.1.31沒有出現共享目錄,需要在服務端重啟下nfs服務
3.1 掛載到共享目錄
mount -t nfs 172.16.1.31:/data /var/www/html/upload/
###mount -t 指定文件類型 = mount.nfs
掛在后會發現,原先upload目錄下的文件都沒有了,因為掛載只是提供一個入口,upload已經不是一個目錄是服務端/data
的一個入口,因為data沒有文件,所以,掛在后看不到文件,需要先做備份,將upload下的文件scp到data下面
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.6G 18G 9% /
devtmpfs 980M 0 980M 0% /dev
tmpfs 991M 0 991M 0% /dev/shm
tmpfs 991M 9.6M 981M 1% /run
tmpfs 991M 0 991M 0% /sys/fs/cgroup
/dev/sda1 197M 105M 93M 54% /boot
tmpfs 199M 0 199M 0% /run/user/0
172.16.1.31:/data 19G 1.4G 18G 8% /var/www/html/upload
3.2:showmount -e 172.16.1.31
[root@web01 html]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24 顯示共享目錄
3.3 檢測nfs是否啟動成功
有兩個重要的文件,能夠解決這個疑問。/var/lib/nfs/etab、/var/lib/nfs/rmtab這兩個文件就能夠查看服務器上共享了什么目錄,
到底有多少客戶端掛載了共享,能查看到客戶端掛載的具體信息。
1、etab這個文件能看到服務器上共享了哪些目錄,執行哪些人可以使用,並且設定的參數為何。
2、rmtab這個文件就是能夠查看到共享目錄被掛載的情況。
#如果沒有返回信息,說明配置有問題
3.4 永久掛載
vim /etc/fstab
172.16.1.31:/data /var/www/html/upload nfs default 0 0
C6不要永久掛載,因為是串行啟動,先掛載再啟動網卡,系統會卡住進不去。
C7可以,因為是systemd管理,是並行啟動
3.5
mount.nfs: Stale file handle
重啟服務后,需要先umount再mount
四:web01和web02配置一樣,這樣會發現,不管用戶發送圖片到哪個web
都會上傳到/data下面,用戶上傳圖片無論被負載均衡調度至WEB1還是WEB2, 最終數據都被寫入至共享存儲
用戶訪問A用戶上傳圖片時,無論調度至WEB1還是WEB2,最終都會上共享存儲訪問對應的文件,這樣就可以訪問到資源了