Linux-存儲服務之NFS

NFS介紹

官方文檔html

NFS(Network File System)即網絡文件系統,它最大的功能就是經過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用能夠透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件同樣。linux

NFS客戶端通常是應用服務器(好比web,負載均衡等),能夠經過掛載的方式將NFS服務器端共享的目錄掛載到NFS客戶端本地的目錄下。nginx

由於NFS支持的功能至關的多,而不一樣的功能都會使用不一樣的程序來啓動,每啓動一個功能就會啓用一些端口來傳輸數據,所以,NFS的功能所對應的端口才沒有固定住,而是隨機取用一些未被使用的小於1024的端口來做爲傳輸之用。但如此一來又形成了客戶端想要連上服務器時的困擾,由於客戶端得要知道服務器端的相關端口才可以進行鏈接。web

所以就須要遠程過程調用(RPC)的服務,RPC最主要的功能就是在指定每一個NFS功能所對應的port number,而且回報給客戶端,讓客戶端能夠鏈接正確的端口上去。那RPC又是如何知道每一個NFS的端口呢?這是由於當服務器在啓動NFS時會隨機取用數個端口,並主動的想RPC註冊,所以RPC能夠知道每一個端口對應的NFS功能,而後RPC又是固定使用port 111來監聽客戶端的需求並回報給客戶端正確的端口,因此固然可讓NFS的啓動更爲輕鬆愉快了。vim

NFS在文件傳送過程當中依賴與RPC(遠程過程調用)協議。NFS自己是沒有提供信息傳送的協議和功能的,可是可以用過網絡進行圖片,視頻,附件等分享功能。只要用到NFS的地方都須要啓動RPC服務,不管是NFS的服務端仍是客戶端。centos

NFSRPC的關係:能夠理解爲NFS是一個網絡文件系統(比喻爲租房的房主),而RPC是負責信息的傳輸(中介),客戶端(至關於租房的租客)。服務器

NFS網絡文件系統存在的意義

實現數據共享,數據保持一致。如圖所示:網絡

NFS網絡文件系統工做方式

一、在nfs服務器端建立共享目錄
二、經過mount網絡掛載,將NFS服務端共享目錄掛載到NFS客戶端本地目錄
三、NFS客戶端在掛載目錄上建立、刪除、查看數據等操做,等價於在服務端進行的建立、刪除、查看數據等操做。架構

如上圖所示,在NFS服務器端設置一個共享目錄/web後,其餘有權限訪問NFS服務器端的客戶端均可以將這個共享目錄/web掛載到客戶端本地的某個掛載點(其實就是一個目錄,這個掛載點能夠本身隨意指定),不一樣的客戶端的掛載點能夠不相同。app

客戶端正確掛載完畢後,就能夠經過NFS客戶端的掛載點所在的/opt/www目錄查看到NFS服務端/web共享出來的目錄下的全部數據。在客戶端查看時,NFS服務端的/web目錄就至關於客戶端本地的磁盤分區或目錄,幾乎感受不到使用上的區別,根據NFS服務器端授予的NFS共享權限以及共享目錄的本地系統權限,只要在指定的NFS客戶端操做掛載的/opt/www目錄,就能夠將數據輕鬆的存取到NFS服務器端上的/web目錄中了。

NFS工做流程

RPC服務工做原理

NFS部署示例

操做系統 角色 IP HOST
CentOS release 7.4 NFS Server 192.168.1.31 nfs-server.com
CentOS release 7.4 NFS Client1 (web server1) 192.168.1.32 nfs-client1.com
CentOS release 7.4 NFS Client2 (web server2) 192.168.1.33 nfs-client2.com

說明:

這裏NFS客戶端是web服務器,站點目錄掛載NFS服務端。
實驗環境關閉防火牆、selinux、時間同步等

具體操做步驟

服務端安裝配置

1)檢查是否安裝NFS、RPC服務

[root@nfs-server ~]# rpm -aq |egrep "nfs-utils|rpcbind"
rpcbind-0.2.0-42.el7.x86_64
nfs-utils-1.3.0-0.48.el7.x86_64

# 若是沒有安裝則進行安裝
# yum -y install nfs-utils rpcbind

2)啓動rpcnfs服務

[root@nfs-server ~]# systemctl start rpcbind
[root@nfs-server ~]# systemctl enable rpcbind
[root@nfs-server ~]# systemctl start nfs

3)能夠經過rpcinfo -p localhost能夠查看到綁定了nfs

[root@nfs-server ~]# 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
    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
    100024    1   udp  60358  status
    100024    1   tcp  34912  status
    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  38577  nlockmgr
    100021    3   udp  38577  nlockmgr
    100021    4   udp  38577  nlockmgr
    100021    1   tcp  42193  nlockmgr
    100021    3   tcp  42193  nlockmgr
    100021    4   tcp  42193  nlockmgr

4)配置共享目錄並重啓nfs

[root@nfs-server ~]# mkdir /web
[root@nfs-server ~]# vim /etc/exports
/web    192.168.1.0/24(rw,sync,no_root_squash)  #不壓制root(當client端使用root掛載時,也有root權限)
[root@nfs-server ~]# systemctl restart nfs
[root@nfs-server ~]# exportfs -v
/web              192.168.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

客戶端掛載測試

1)建立掛載目錄並進行掛載

[root@nfs-client1 ~]# mkdir /opt/www
[root@nfs-client1 ~]# showmount -e 192.168.1.31    #查看服務器共享目錄
Export list for 192.168.1.31:
/web 192.168.1.0/24
[root@nfs-client1 ~]# mount -t nfs 192.168.1.31:/web /opt/www/
[root@nfs-client1 ~]# df -h
文件系統                 容量  已用  可用 已用% 掛載點
/dev/mapper/centos-root   20G  3.6G   16G   19% /
devtmpfs                 473M     0  473M    0% /dev
tmpfs                    489M     0  489M    0% /dev/shm
tmpfs                    489M   14M  475M    3% /run
tmpfs                    489M     0  489M    0% /sys/fs/cgroup
/dev/sda1                497M  154M  344M   31% /boot
tmpfs                     98M     0   98M    0% /run/user/0
192.168.1.31:/web         20G  3.6G   16G   19% /opt/www
[root@nfs-client1 ~]#
[root@nfs-client1 ~]# vim /etc/fstab    #開機自動掛載
192.168.1.31:/web    /opt/www    nfs    defaults    0 0

2)在client1上的/opt/www建立一個測試文件

[root@nfs-client1 ~]# echo "client1 create test file" >> /opt/www/client1.txt

3)回到nfs上進行查看

[root@nfs-server ~]# ll /web/
總用量 4
-rw-r--r-- 1 root root 25 8月   9 14:41 client1.txt

4)安裝nginx並配置站點目錄爲/opt/www

[root@nfs-client1 ~]# yum -y install nginx
[root@nfs-client1 ~]# vim /etc/nginx/nginx.conf
server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /opt/www;
...
[root@nfs-client1 ~]# systemctl start nginx

上面的步驟一樣在client2上面操做。

在nfs服務端建立站點首頁,訪問client客戶端測試

[root@nfs-server ~]# ll /web/
總用量 8
-rw-r--r-- 1 root root 25 8月   9 14:41 client1.txt
-rw-r--r-- 1 root root 25 8月   9 15:37 client2.txt

[root@nfs-server ~]# echo "<h1>NFS server</h1>" >> /web/index.html    #nfs服務端共享目錄建立首頁文件
[root@nfs-server ~]# curl 192.168.1.32
<h1>NFS server</h1>
[root@nfs-server ~]# 
[root@nfs-server ~]# curl 192.168.1.33
<h1>NFS server</h1>

[root@nfs-client1 ~]# ll /opt/www/    #nfs客戶端1上查看
總用量 12
-rw-r--r-- 1 root root 25 8月   9 14:41 client1.txt
-rw-r--r-- 1 root root 25 8月   9 15:37 client2.txt
-rw-r--r-- 1 root root 20 8月   9 15:41 index.html

[root@nfs-client2 ~]# ll /opt/www/    #nfs客戶端2上查看
總用量 12
-rw-r--r-- 1 root root 25 8月   9 14:41 client1.txt
-rw-r--r-- 1 root root 25 8月   9 15:37 client2.txt
-rw-r--r-- 1 root root 20 8月   9 15:41 index.html

經過測試能夠看出,客戶端掛載後,就徹底至關於本身的一個目錄或者文件,在負載均衡架構中通常經過這種方式作共享存儲。

NFS配置參數說明

nfs共享參數及做用

經過 man exports能夠查看幫助手冊

共享參數 做用
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的用戶GID,必須存在系統

配置實例說明

[root@nfs-server ~]# cat /etc/exports
#/web    192.168.1.0/24(rw,sync,no_root_squash)  #不壓制root(當client端使用root掛載時,也有root權限)
/web    192.168.1.32(rw,sync,no_root_squash) 192.168.1.33(rw,sync,all_squash,anonuid=2000,anongid=2000)
#[共享目錄]  [客戶端地址1(權限)]  [客戶端地址2(權限)]
1、共享目錄:每一行最前面是共享出來的目錄,好比上面我要共享/web目錄,那麼此選項就能夠直接寫/web目錄,這個目錄能夠依照不一樣的權限共享給不一樣的目錄。
2、客戶端地址:客戶端地址可以設置一個網絡,也能夠是單個主機。參數:如上面的讀寫權限rw,同步更新sync等待。

    1、客戶端地址可使用完整的IP或者網絡號,例如192.168.1.33或192.168.1.0/24
    2、一樣可使用主機名,可是這個主機名必需要在/etc/hosts中存在,或者能夠經過DNS找到才行。
相關文章
相關標籤/搜索