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
複制