Linux-存儲服務之NFS


NFS介紹

官方文檔

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

NFS客戶端一般是應用服務器(比如web,負載均衡等),可以通過掛載的方式將NFS服務器端共享的目錄掛載到NFS客戶端本地的目錄下。

因為NFS支持的功能相當的多,而不同的功能都會使用不同的程序來啟動,每啟動一個功能就會啟用一些端口來傳輸數據,因此,NFS的功能所對應的端口才沒有固定住,而是隨機取用一些未被使用的小於1024的端口來作為傳輸之用。但如此一來又造成了客戶端想要連上服務器時的困擾,因為客戶端得要知道服務器端的相關端口才能夠進行連接。

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

NFS在文件傳送過程中依賴與RPC(遠程過程調用)協議。NFS本身是沒有提供信息傳送的協議和功能的,但是能夠用過網絡進行圖片,視頻,附件等分享功能。只要用到NFS的地方都需要啟動RPC服務,不論是NFS的服務端還是客戶端。

NFSRPC的關系:可以理解為NFS是一個網絡文件系統(比喻為租房的房主),而RPC是負責信息的傳輸(中介),客戶端(相當於租房的租客)。

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

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

NFS網絡文件系統工作方式

1、在nfs服務器端創建共享目錄
2、通過mount網絡掛載,將NFS服務端共享目錄掛載到NFS客戶端本地目錄
3、NFS客戶端在掛載目錄上創建、刪除、查看數據等操作,等價於在服務端進行的創建、刪除、查看數據等操作。

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

客戶端正確掛載完畢后,就可以通過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找到才行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM