NFS服務搭建過程

Linux小菜鸟發表於2024-12-10

NFS服務

【1】、nfs配置

作用: 解決資料一致性問題

NFS服務程式的配置檔案為/etc/exports,需要嚴格按照共享目錄的路徑 允許訪問的NFS客戶端(共享許可權引數)格式書寫,定義要共享的目錄與相應的許可權,具體書寫方式如下圖所示。

image-20241204143000677

# 安裝服務
[root@nfs ~]# yum install -y nfs-utils

# 配置檔案
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
[root@nfs ~]# mkdir /data/

# 啟動服務
[root@nfs ~]# systemctl enable nfs --now
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.

# 我們需要看下,nfs是使用的哪個使用者啟動的服務,我們能看到他時使用的的uid和gid為65534的使用者執行的,因此我們需要給/data 設定屬主和屬組
[root@nfs ~]# cat /var/lib/nfs/etab 
/data   172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
[root@nfs ~]# chown nobody:nobody /data
# 客戶端進行掛載
# 客戶端也需要安裝nfs-utils,但是不需要啟動
yum install -y nfs-utlils
# showmount -e 檢視有哪些共享目錄
[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 /img
[root@web01 ~]# df -Th|grep nfs
172.16.1.31:/data nfs4       48G  3.8G   45G   8% /img
[root@web01 ~]# echo hahah > /img/1.txt
# 在nfs客戶端可以看到
[root@nfs ~]# cat /data/1.txt 
hahah

# 在backup伺服器進行掛載
[root@backup ~]# mkdir /img
[root@backup ~]# mount -t nfs 172.16.1.31:/data /img
[root@backup ~]# ll /img
total 4
-rw-r--r-- 1 nobody nobody 6 Dec  3 17:25 1.txt
[root@backup ~]# touch /img/{haha,xixi}
[root@backup ~]# ll /img
total 4
-rw-r--r-- 1 nobody nobody 6 Dec  3 17:25 1.txt
-rw-r--r-- 1 nobody nobody 0 Dec  3 17:26 haha
-rw-r--r-- 1 nobody nobody 0 Dec  3 17:26 xixi
# 在別的機器上都能看到了
[root@web01 ~]# ll /img
total 4
-rw-r--r-- 1 nobody nobody 6 Dec  3 17:25 1.txt
-rw-r--r-- 1 nobody nobody 0 Dec  3 17:26 haha
-rw-r--r-- 1 nobody nobody 0 Dec  3 17:26 xixi

# 如果在web01上刪除了/img下的內容,backup上也沒有了,服務端也沒有了
[root@web01 ~]# rm -f /img/*
[root@web01 ~]# ll /img/
total 0
[root@backup ~]# ll /img
total 0
[root@nfs ~]# ll /data/
total 0
# 客戶端實現持久化掛載
/etc/fstab
172.16.1.31:/data /img nfs defaults 0 0

【2】、nfs引數

nfs共享引數 引數作用
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的使用者UID,必須存在系統
# ro 表示客戶端只讀許可權 
/data 172.16.1.0/24(ro,sync,all_squash)

# all_squash 表示壓縮使用者許可權,後面不指定預設使用nobody使用者

# 指定uid和gid,不再使用預設的
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

[root@nfs ~]# systemctl restart nfs
[root@nfs ~]# cat /var/lib/nfs/etab
/data   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)
# 客戶端重新掛載,由於客戶端沒有uid=666的使用者,因此在屬主和屬組的位置顯示的是uid
[root@backup ~]# echo haha > /img/a.txt
[root@backup ~]# ll /img
total 4
-rw-r--r-- 1 666 666 5 Dec  3 18:59 a.txt
[root@backup ~]# 

【3】、nfs原理

image-20241204142811377

1.使用者程序訪問NFS客戶端,使用不同的函式對資料進行處理
2.NFS客戶端透過TCP/IP的方式傳遞給NFS服務端。
3.NFS服務端接收到請求後,會先呼叫portmap程序進行埠對映。
4.nfsd程序用於判斷NFS客戶端是否擁有許可權連線NFS服務端。
5.Rpc.mount程序判斷客戶端是否有對應的許可權進行驗證。
6.idmap程序實現使用者對映和壓縮
7.最後NFS服務端會將對應請求的函式轉換為本地能識別的命令,傳遞至核心,由核心驅動硬體。

注意: rpc是一個遠端過程呼叫,那麼使用nfs必須有rpc服務

【4】、解決nfs單點故障的結構

image-20241204144620927

故障原因:

由於我們只有一臺nfs伺服器,假設nfs伺服器掛了,那所有掛載nfs伺服器上共享目錄的伺服器也就沒有了任何的資料。

故障解決:

在我們的叢集架構中存在著一臺backup伺服器,我們會利用backup伺服器來實現一種nfs的冗餘。

具體實現也就是在nfs伺服器上部署lsync服務,實現將nfs上共享目錄中的資料實時同步到backup伺服器中,如果nfs掛了,資料不會丟失。我們還可以在backup伺服器上搭建nfs服務,再讓別的主機掛載到backup伺服器的共享目錄

在整個過程中我們需要保證使用者一致

1、搭建nfs伺服器的nfs服務

[root@nfs ~]# yum install -y nfs-utils
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,all_squash,sync,anonuid=666,anongid=666)
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -g 666 -u 666 -M -s /sbin/nologin www
[root@nfs ~]# mkdir -p /data/
[root@nfs ~]# chown www:www /data/
[root@nfs ~]# systemctl enable nfs --now
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[root@nfs ~]# cat /var/lib/nfs/etab
/data   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)

# 在web01上掛載
[root@web01 ~]# mkdir /img
[root@web01 ~]# yum install -y nfs-utils
[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 /img
[root@web01 ~]# df -Th | grep nfs
172.16.1.31:/data nfs4       48G  3.7G   45G   8% /img

# 測試
[root@web01 ~]# touch /img/aaa
[root@nfs ~]# ll /data/
total 0
-rw-r--r-- 1 www www 0 Dec  4 19:43 aaa

2、搭建rsync

[root@backup ~]# yum install -y rsync
[root@backup ~]# vim /etc/rsyncd.conf 
uid = www  # 一定要和nfs使用者一致
gid = www
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsync.log
fake super = yes
use chroot = no
max connections = 200
time out = 600
ignore errors
read only = false
port = 873
list = false
[backup]
path=/backup
[nfs]
path=/nfs
[root@backup ~]# groupadd -g 666 www
[root@backup ~]# useradd -g 666 -u 666 -M -s /sbin/nologin www
[root@backup ~]# echo "rsync_backup:123" > /etc/rsync.passwd
[root@backup ~]# chmod 600 /etc/rsync.passwd
[root@backup ~]# mkdir /backup /nfs
[root@backup ~]# chown www:www /backup/
[root@backup ~]# chown www:www /nfs
[root@backup ~]# systemctl enable rsyncd --now
Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service → /usr/lib/systemd/system/rsyncd.service.

# 在web01和nfs伺服器上做測試
[root@web01 ~]# rsync -avz /etc/passwd rsync_backup@192.168.121.41::backup
Password: 
sending incremental file list
passwd

sent 829 bytes  received 43 bytes  158.55 bytes/sec
total size is 1,805  speedup is 2.07
-rw-r--r-- 1 www www 0 Dec  4 19:43 aaa
[root@nfs ~]# rsync -avz /etc/hosts rsync_backup@192.168.121.41::nfs
Password: 
sending incremental file list
hosts

sent 140 bytes  received 43 bytes  11.09 bytes/sec
total size is 158  speedup is 0.86

3、在nfs伺服器上搭建lsync

[root@nfs ~]# yum install -y lsyncd
[root@nfs ~]# cat /etc/lsyncd.conf
settings {
    logfile = "/var/log/lsyncd/lsyncd.log",
    statusFile = "/var/log/lsyncd/lsyncd.status",
    maxProcesses = 2,
    nodaemon = false,
}
sync {
    default.rsync,
    source = "/data",
    target = "rsync_backup@192.168.121.41::nfs",
    delete = true,
    delay = 1,
    rsync = {
        binary = "/usr/bin/rsync",
        password_file = "/etc/rsyncd.pwd",
        archive = true,
        compress = true,
    }
}
[root@nfs ~]# echo 123 > /etc/rsyncd.pwd
[root@nfs ~]# chmod 600 /etc/rsyncd.pwd
# 在lsync啟動的時候,會自動先執行一遍裡面的rsync命令
# 此時backup伺服器中的nfs目錄下是沒有資料的
[root@backup ~]# ll /nfs
total 0
[root@nfs ~]# systemctl enable lsyncd --now
[root@nfs ~]# systemctl status lsyncd.service 
● lsyncd.service - Live Syncing (Mirror) Daemon
   Loaded: loaded (/usr/lib/systemd/system/lsyncd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2024-12-04 20:06:19 CST; 5s 
# 此時backup中的nfs共享目錄就有內容了
[root@backup ~]# ll /nfs
total 0
-rw-r--r-- 1 www www 0 Dec  4 19:43 aaa
# 測試:在web01上向共享目錄中寫入資料,會不會自動同步到backup上
[root@web01 ~]# touch /img/{1..3}.log
[root@backup ~]# ll /nfs
total 0
-rw-r--r-- 1 www www 0 Dec  4 20:11 1.log
-rw-r--r-- 1 www www 0 Dec  4 20:11 2.log
-rw-r--r-- 1 www www 0 Dec  4 20:11 3.log
-rw-r--r-- 1 www www 0 Dec  4 19:43 aaa
# 現在我們模擬nfs掛掉,將web01的共享目錄同步到backup中
[root@backup ~]# ifdown ens36
WARN      : [ifdown] You are using 'ifdown' script provided by 'network-scripts', which are now deprecated.
WARN      : [ifdown] 'network-scripts' will be removed from distribution in near future.
WARN      : [ifdown] It is advised to switch to 'NetworkManager' instead - it provides 'ifup/ifdown' scripts as well.
Device 'ens36' successfully disconnected.

# 檢視掛載的共享目錄是哪個
[root@web01 ~]# cat /proc/mounts
172.16.1.31:/data /img nfs4 rw,relatime,vers=4.2,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.7,local_lock=none,addr=172.16.1.31 0 0
[root@web01 ~]# umount -f /img

# 在backup上搭建nfs
[root@backup ~]# vim /etc/exports
/nfs 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@backup ~]# systemctl enable nfs --now
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.

# 在web01上重新掛載
[root@web01 ~]# showmount -e 172.16.1.41
Export list for 172.16.1.41:
/nfs 172.16.1.0/24
[root@web01 ~]# mount -t nfs 172.16.1.41:/nfs /img
# 資料就重新回來了
[root@web01 ~]# ll /img/
total 0
-rw-r--r-- 1 666 666 0 Dec  4 20:11 1.log
-rw-r--r-- 1 666 666 0 Dec  4 20:11 2.log
-rw-r--r-- 1 666 666 0 Dec  4 20:11 3.log
-rw-r--r-- 1 666 666 0 Dec  4 19:43 aaa
[root@web01 ~]# touch /img/4.log
[root@backup ~]# ll /nfs
total 0
-rw-r--r-- 1 www www 0 Dec  4 20:11 1.log
-rw-r--r-- 1 www www 0 Dec  4 20:11 2.log
-rw-r--r-- 1 www www 0 Dec  4 20:11 3.log
-rw-r--r-- 1 www www 0 Dec  4 20:19 4.log
-rw-r--r-- 1 www www 0 Dec  4 19:43 aaa


# 此時nfs伺服器恢復執行了,我們需要將資料重新掛載回去
# 在nfs伺服器掛掉的期間,web01伺服器產生的資料,都在和backup的nfs共享目錄進行同步,在nfs伺服器恢復後,我們重新將目錄掛載回去,這段時間的資料不會不會同步。由於重新掛載後我們需要重啟lsync服務,我們lsync在同步時使用了 --delete 引數,因此我們為了防止資料丟失,在重新掛載之前我們要先進行一次rsync同步
[root@web01 ~]# umount /img
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /img
[root@web01 ~]# ll /img/
total 0
-rw-r--r-- 1 666 666 0 Dec  4 20:11 1.log
-rw-r--r-- 1 666 666 0 Dec  4 20:11 2.log
-rw-r--r-- 1 666 666 0 Dec  4 20:11 3.log
-rw-r--r-- 1 666 666 0 Dec  4 19:43 aaa
[root@nfs ~]# systemctl restart lsyncd.service 
[root@nfs ~]# ll /data
total 0
-rw-r--r-- 1 www www 0 Dec  4 20:11 1.log
-rw-r--r-- 1 www www 0 Dec  4 20:11 2.log
-rw-r--r-- 1 www www 0 Dec  4 20:11 3.log
-rw-r--r-- 1 www www 0 Dec  4 19:43 aaa
[root@backup ~]# ll /nfs
total 0
-rw-r--r-- 1 www www 0 Dec  4 20:11 1.log
-rw-r--r-- 1 www www 0 Dec  4 20:11 2.log
-rw-r--r-- 1 www www 0 Dec  4 20:11 3.log
-rw-r--r-- 1 www www 0 Dec  4 19:43 aaa
# 為了解決這一部分的資料問題,我們需要在重新掛回nfs伺服器前,執行一次rsync同步資料
[root@backup ~]# rsync -avz /nfs/ 192.168.121.31:/data

Authorized users only. All activities may be monitored and reported.
root@192.168.121.31's password: 
sending incremental file list
./
4.log

sent 187 bytes  received 38 bytes  64.29 bytes/sec
total size is 0  speedup is 0.00
[root@nfs ~]# ll /data
total 0
-rw-r--r-- 1 www www 0 Dec  4 20:11 1.log
-rw-r--r-- 1 www www 0 Dec  4 20:11 2.log
-rw-r--r-- 1 www www 0 Dec  4 20:11 3.log
-rw-r--r-- 1 www www 0 Dec  4 20:30 4.log
-rw-r--r-- 1 www www 0 Dec  4 19:43 aaa

[root@web01 ~]# mount -t nfs 172.16.1.31:/data /img
[root@nfs ~]# systemctl restart lsyncd.service 

4、使用指令碼監控nfs伺服器,實現自動切換

[root@web01 ~]# cat m.sh 
#!/bin/bash

ping -c1 -W1 172.16.1.31 > /dev/null 2>&1
ip=` df -Th | grep nfs | awk -F: '{print $1}'`
if [ $? -ne 0 ];then
    umount -f /img &> /dev/null &
    sleep 2
    mount -t nfs 172.16.1.41:/nfs /img
else
    if [[ $ip =~ "172.16.1.41" ]];then
         umount -f /img &> /dev/null &
         sleep 2
         mount -t nfs 172.16.1.31:/data /img
    fi
fi
# 將資料定時打包到指定目錄下
#!/bin/bash

mkdir -p /backup

IP=`hostname -I | awk -F" " '{print $1}'`
path=/backup/web01_${IP}_`date +%F`
tar -zcvf  $path /etc/
rsync -avz $path rsync_backup@backup::backup
find /backup -mtime +7 -exec rm -f {} \;

相關文章