天天看點

NFS 高可用方案(NFS+keepalived+Sersync)

1. 簡述

1.1 介紹

本方案 NFS 的高可用方案,應用伺服器為 Client ,兩台檔案伺服器分别 Master 和 Slave,使用 keepalived 生成一個虛拟 IP,使用 Sersync 進行 Master 與 Slave 之間檔案互相同步,確定高可用。

2. 安裝前準備

伺服器資訊:

角色 系統版本 ip
虛拟 ip(Vip) 192.168.50.143
Client centos 7.5 192.168.51.246
Master centos 7.5 192.168.50.8
Slave centos 7.5 192.168.50.71

伺服器環境準備:

在 Master 和 Slave 上建立共享目錄

mkdir /data           

複制

在 Client 上建立挂載目錄

mkdir /qiyuesuodata           

複制

關閉 Client 、Master 和 Slave 伺服器上的防火牆

# 關閉防火牆
systemctl stop firewalld
# 關閉開機自啟
systemctl disable firewalld           

複制

3. 安裝 NFS 并配置

在 Client 、Master 和 Slave 伺服器上安裝 NFS 服務

yum -y install nfs-utils rpcbind           

複制

配置 NFS 共享目錄

在 Master 上執行

# 其中/data 為共享的目錄,192.168.51.246 為 Client ip,如有多個私有雲服務叢集可用空格分隔
# 如 echo '/data 192.168.51.246(rw,sync,all_squash) 192.168.51.247(rw,sync,all_squash)' >> /etc/exports
 echo '/data 192.168.51.246(rw,sync,all_squash)' >> /etc/exports
# 開啟服務
 systemctl start rpcbind && systemctl start nfs
# 設定開機自啟
 systemctl enable rpcbind && systemctl enable nfs
# 出現:Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.即成功           

複制

在 Slave 上執行

# 其中/data 為共享的目錄,192.168.51.246 為 Client ip,如有多個私有雲服務叢集可用空格分隔
# 如 echo '/data 192.168.51.246(rw,sync,all_squash) 192.168.51.247(rw,sync,all_squash)' >> /etc/exports
 echo '/data 192.168.51.246(rw,sync,all_squash)' >> /etc/exports
# 開啟服務
 systemctl start rpcbind && systemctl start nfs
# 設定開機自啟
 systemctl enable rpcbind && systemctl enable nfs
# # 出現:Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.即成功           

複制

測試挂載是否成功

在 Client 上執行挂載測試

# 測試 Master 
# 其中 ip 為 Master 的 ip,/data為 Master 共享的目錄,/qiyuesuodata 為需要挂載至 Client 的目錄
 mount -t nfs 192.168.50.8:/data /qiyuesuodata
# 檢查 
df -Th 
# 出現  192.168.50.8:/data      nfs4       29G  7.6G   22G  27% /qiyuesuodata 即為成功
# 去除挂載
umount /qiyuesuodata

# 測試 Slave
# 其中 ip 為 Master 的 ip,/data為 Master 共享的目錄,/qiyuesuodata 為需要挂載至 Client 的目錄
 mount -t nfs 192.168.50.71:/data /qiyuesuodata
# 檢查 
df -Th 
# 出現  192.168.50.71:/data      nfs4       29G  7.6G   22G  27% /qiyuesuodata 即為成功
# 去除挂載
umount /qiyuesuodata           

複制

4. 配置檔案同步

在 Slave 進行同步 Master 資料

# 安裝 rsync
yum -y install rsync.x86_64
# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填寫 master ip
uid = nfsnobody
gid = nfsnobody
port = 873
pid file = /var/rsyncd.pid
log file = /var/log/rsyncd.log
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[data]
path = /data
auth users = qiyuesuo
secrets file = /etc/rsync_salve.pass
hosts allow = 192.168.50.8

# 生成認證檔案
echo 'qiyuesuo:qiyuesuo123' > /etc/rsync_salve.pass
chmod 600 /etc/rsync_salve.pass
# 修改 檔案夾權限
chown -R nfsnobody:nfsnobody /data/
# 啟動服務
 rsync --daemon --config=/etc/rsyncd.conf            

複制

在 Master 上測試

yum -y install rsync.x86_64
chown -R nfsnobody:nfsnobody /data/
echo "qiyuesuo123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
#建立測試檔案,測試推送
cd /data/
echo "This is test file" > file.txt
rsync -arv /data/ [email protected]::data --password-file=/etc/rsync.pass
#在 slave 上測試
ls /data 
# 出現 file.txt 即可           

複制

在 Master 上配置自動同步

cd /usr/local/
 wget https://dl.qiyuesuo.com/private/nfs/sersync2.5.4_64bit_binary_stable_final.tar.gz
 tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz
 mv GNU-Linux-x86/ sersync
 cd sersync/
 # 修改配置檔案
sed -ri 's#<delete start="true"/>#<delete start="false"/>#g' confxml.xml
sed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/data">#g' confxml.xml
sed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="192.168.50.71" name="data"/>#g' confxml.xml
sed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xml
sed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="qiyuesuo" passwordfile="/etc/rsync.pass"/>#g' confxml.xml
sed -ri '33s#<timeout start="false" time="100"/><!-- timeout=100 -->#<timeout start="true" time="100"/><!-- timeout=100 -->#g' confxml.xml
#啟動Sersync
/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml           

複制

測試

# 在 master 中的/data 目錄建立檔案
touch test
# 檢視 salve 中的 /data 是否有該檔案           

複制

以上就做完了 salve 同步 master 的檔案,但是當 master 當機後恢複,master 無法同步 salve 檔案,是以要配置 master 同步 salve 檔案

在 Master 進行同步 slave 資料

# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填寫 slave ip
uid = nfsnobody
gid = nfsnobody
port = 873
pid file = /var/rsyncd.pid
log file = /var/log/rsyncd.log
use chroot = no
max connections = 200
read only = false
list = false
fake super = yes
ignore errors
[data]
path = /data
auth users = qiyuesuo
secrets file = /etc/rsync_master.pass
hosts allow = 192.168.50.71


# 生成認證檔案
echo 'qiyuesuo:qiyuesuo123' > /etc/rsync_master.pass
chmod 600 /etc/rsync_master.pass
# 修改 檔案夾權限
chown -R nfsnobody:nfsnobody /data/
# 啟動服務
 rsync --daemon --config=/etc/rsyncd.conf            

複制

在 Slave 上測試

chown -R nfsnobody:nfsnobody /data/
echo "qiyuesuo123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
#建立測試檔案,測試推送
cd /data/
echo "This is test file" > file.2.txt
rsync -arv /data/ [email protected]::data --password-file=/etc/rsync.pass
#在 slave 上測試
ls /data 
# 出現 file.2.txt 即可           

複制

在 Slave 上配置自動同步

cd /usr/local/
 wget https://dl.qiyuesuo.com/private/nfs/sersync2.5.4_64bit_binary_stable_final.tar.gz
 tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz
 mv GNU-Linux-x86/ sersync
 cd sersync/
 # 修改配置檔案
sed -ri 's#<delete start="true"/>#<delete start="false"/>#g' confxml.xml
sed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/data">#g' confxml.xml
sed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="192.168.50.8" name="data"/>#g' confxml.xml
sed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xml
sed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="qiyuesuo" passwordfile="/etc/rsync.pass"/>#g' confxml.xml
sed -ri '33s#<timeout start="false" time="100"/><!-- timeout=100 -->#<timeout start="true" time="100"/><!-- timeout=100 -->#g' confxml.xml
#啟動Sersync
/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml           

複制

至此我們已經做好了主從互相同步的操作

##5. 安裝 Keepalived

在 Master 上執行

yum -y install keepalived.x86_64
# 修改 /etc/keepalived/keepalived.conf
# 其中 enp0s3 為綁定網卡名稱,可以使用 ip addr 指令檢視
# 其中 192.168.50.143  為虛拟 ip ,注意不要和其它 ip 沖突
! Configuration File for keepalived

global_defs {
   router_id NFS-Master
}

vrrp_instance VI_1 {
    state MASTER
    interface enp0s3
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qiyuesuo123
    }
    virtual_ipaddress {
        192.168.50.143  
    }
}
# 啟動服務
systemctl start  keepalived.service && systemctl enable keepalived.service           

複制

在 Slave 上執行

yum -y install keepalived.x86_64
# 修改 /etc/keepalived/keepalived.conf
# 其中 enp0s3 為綁定網卡名稱,可以使用 ip addr 指令檢視
# 其中 192.168.50.143  為虛拟 ip ,注意不要和其它 ip 沖突
! Configuration File for keepalived

global_defs {
   router_id NFS-Slave
}

vrrp_instance VI_1 {
    state MASTER
    interface enp0s3
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass qiyuesuo123
    }
    virtual_ipaddress {
        192.168.50.143  
    }
}
# 啟動服務
systemctl start  keepalived.service && systemctl enable keepalived.service           

複制

檢視虛拟 IP 是否存在

在 Master 上執行:

ip a | grep  192.168.50.143
# 出現
# inet 192.168.50.143/32 scope global enp0s3
# 即成功           

複制

VIP 挂載測試

在 Client 上通過 vip 挂載測試

mount -t nfs 192.168.50.143:/data /qiyuesuodata
# 如/qiyuesuodata目錄中有共享目錄中檔案則說明挂載成功
umount /qiyuesuodata/           

複制

模拟機器 Down 機, 測試虛拟 IP 位址是否會漂移

# 在 Master 上關閉 keepalived
systemctl stop keepalived.service
# 執行ip a | grep  192.168.50.143會無輸出則關閉成功
# 在 Slave 上檢視
ip a | grep  192.168.50.143
# 出現
# inet 192.168.50.143/32 scope global enp0s3
# 即成功           

複制

則說明 ip 漂移成功

設定 keepalived 腳本

因為 ip 的漂移是根據 keepalived 的存活來判斷的,是以在 nfs 當機之後需要手動停止 keepalived 服務來進行 ip 的切換,這裡在 Master 上編寫一個定時任務來檢測 nfs 服務是否當機

cd /usr/local/sbin
# 生成檔案check_nfs.sh
#!/bin/sh
# 每秒執行一次
step=1 #間隔的秒數,不能大于60 
for (( i = 0; i < 60; i=(i+step) )); do 
  ###檢查nfs可用性:程序和是否能夠挂載
  /sbin/service nfs status &>/dev/null
  if [ $? -ne 0 ];then
    ###如果服務狀态不正常,先嘗試重新開機服務
    /sbin/service nfs restart
    /sbin/service nfs status &>/dev/null
    if [ $? -ne 0 ];then
       # 如服務仍不正常,停止 keepalived
       systemctl stop keepalived.service
    fi
  fi
  sleep $step 
done            

複制

加入定時任務

chmod 777 /usr/local/sbin/check_nfs.sh
crontab -e
# 輸入定時任務
* * * * *  /usr/local/sbin/check_nfs.sh &> /dev/null           

複制

在 Client 添加定時任務,當 Master 當機時進行重新挂載

cd /usr/local/sbin
# 生成檔案check_mount.sh

#!/bin/sh
# 每秒執行一次
step=1 #間隔的秒數,不能大于60 
for (( i = 0; i < 60; i=(i+step) )); do 
  mount=`df -Th|grep qiyuesuodata`
  if [ $mount = "" ];then
     umount /qiyuesuodata
     mount mount -t nfs 192.168.50.143:/data /qiyuesuodata
  fi
  sleep $step 
done            

複制

加入定時任務

chmod 777 /usr/local/sbin/check_mount.sh
crontab -e
# 輸入定時任務
* * * * *  /usr/local/sbin/check_nfs.sh &> /dev/null           

複制