1. 程式人生 > 實用技巧 >NFS雙機熱備高可用環境 - 運維筆記

NFS雙機熱備高可用環境 - 運維筆記

NFS高可用目的 部署NFS雙機熱備高可用環境,用作K8S容器叢集的遠端儲存,實現K8S資料持久化。 NFS高可用思路 NFS + Keepalived 實現高可用,防止單點故障。 Rsync+Inotify 實現主備間共享資料進行同步。 環境準備

技術要求

  • 兩個NFS節點機器的配置要一致
  • keepalived監控nfs程序,master的nfs主程序宕掉無法啟動時由slave的nfs接管繼續工作。
  • k8s資料備份到slave,同時master和slave資料用rsync+inotify實時同步,保證資料完整性。
  • 生產環境下,最好給NFS共享目錄單獨掛載一塊硬碟或單獨的磁碟分割槽。
關閉兩臺節點機的防火牆和Selinux
關閉防火牆
# systemctl stop firewalld.service
# systemctl disable firewalld.service
# firewall-cmd --state
not running

關閉selinux
# cat /etc/sysconfig/selinux
SELINUX=disabled

# setenforce 0
# getenforce
Disabled
# reboot

  

NFS高可用部署記錄 一、安裝部署NFS服務(Master和Slave兩機器同樣操作)
1)安裝nfs
# yum -y install nfs-utils

2)建立nfs共享目錄
# mkdir /data/k8s_storage

3)編輯export檔案,執行k8s的node節點掛載nfs共享目錄
這裡可以使用node節點的ip網段進行掛載配置
也可以直接使用node節點的具體ip(一個ip配置一行)進行掛載配置
# vim /etc/exports
/data/k8s_storage 172.16.60.0/24(rw,sync,no_root_squash)

4)配置生效
# exportfs -r

5)檢視生效
# exportfs

6)啟動rpcbind、nfs服務
# systemctl restart rpcbind && systemctl enable rpcbind
# systemctl restart nfs && systemctl enable nfs

7)檢視 RPC 服務的註冊狀況
# rpcinfo -p localhost

8)showmount測試
Master節點測試
# showmount -e 172.16.60.235
Export list for 172.16.60.235:
/data/k8s_storage 172.16.60.0/24

Slave節點測試
# showmount -e 172.16.60.236
Export list for 172.16.60.236:
/data/k8s_storage 172.16.60.0/24

#############################################################################
或者到ks的任意一個node節點上手動嘗試掛載NFS,看是否掛載成功:
[root@k8s-node01 ~]# mkdir /haha
[root@k8s-node01 ~]# mount -t nfs 172.16.60.235:/data/k8s_storage /haha
[root@k8s-node01 ~]# umount /haha
[root@k8s-node01 ~]# mount -t nfs 172.16.60.236:/data/k8s_storage /haha
[root@k8s-node01 ~]# umount /haha
[root@k8s-node01 ~]# rm -rf /haha
#############################################################################

  

二、安裝部署keepalived(Master和Slave兩機器同樣操作)
1)安裝keepalived
# yum -y install keepalived

2)Master節點的keepalived.conf配置
這裡特別需要注意:
一定要設定keepalived為非搶佔模式,如果設定成搶佔模式會在不斷的切換主備時容易造成NFS資料丟失。

# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
# >/etc/keepalived/keepalived.conf
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id master   #id可以隨便設
}
vrrp_script chk_nfs {
    script "/etc/keepalived/nfs_check.sh"    #監控指令碼
    interval 2
    weight -20   #keepalived部署了兩臺,所以設為20,如果三臺就設為30
}
vrrp_instance VI_1 {
    state BACKUP    #兩臺主機都設為backup非搶佔模式
    interface eth0  #網絡卡名寫自己的,不要照抄
    virtual_router_id 51
    priority 100    #master設為100,backup設為80,反正要比100小
    advert_int 1
    nopreempt       #設定為非搶佔模式必須要該引數
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    track_script {
        chk_nfs
    }
    virtual_ipaddress {
        172.16.60.244      #虛擬ip
    }
}

3)Slave節點的keepalived.conf配置
只需將priority引數項修改為80,其他配置的和master節點一樣,指令碼也一樣。

# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
# >/etc/keepalived/keepalived.conf
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id master   
}
vrrp_script chk_nfs {
    script "/etc/keepalived/nfs_check.sh"    
    interval 2
    weight -20   
}
vrrp_instance VI_1 {
    state BACKUP    
    interface eth0  
    virtual_router_id 51
    priority 80   
    advert_int 1
    nopreempt       
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    track_script {
        chk_nfs
    }
    virtual_ipaddress {
        172.16.60.244      
    }
}


4)編輯nfs_check.sh監控指令碼
# vim /etc/keepalived/nfs_check.sh
#!/bin/bash
A=`ps -C nfsd --no-header | wc -l`
if [ $A -eq 0 ];then
        systemctl restart nfs-server.service
        sleep 2
        if [ `ps -C nfsd --no-header| wc -l` -eq 0 ];then
            pkill keepalived
        fi
fi

設定指令碼執行許可權
# chmod 755 /etc/keepalived/nfs_check.sh

5)啟動keepalived服務
# systemctl restart keepalived.service && systemctl enable keepalived.service

檢視服務程序是否啟動
# ps -ef|grep keepalived

6)檢查vip是否存在
在兩臺節點機器上執行"ip addr"命令檢視vip,其中會在一臺機器上產生vip地址。
# ip addr|grep 172.16.60.244
    inet 172.16.60.244/32 scope global eth0
    
測試vip地址要能被ping通  
# ping 172.16.60.244
PING 172.16.60.244 (172.16.60.244) 56(84) bytes of data.
64 bytes from 172.16.60.244: icmp_seq=1 ttl=64 time=0.063 ms
64 bytes from 172.16.60.244: icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from 172.16.60.244: icmp_seq=3 ttl=64 time=0.077 ms

7)keepalived故障測試
停掉vip所在的Master節點機器上的keepalived服務後,發現vip會自動飄移到另一臺Backup機器上才算測試成功。
當該Master節點的keepalived服務重新啟動後,vip不會重新飄移回來。因為keepalived採用了非搶佔模式。

如果keepalived設定為搶佔模式,vip會在Master節點的keepalived重啟恢復後自動飄回去,
但是這樣一直來回切換可能會造成NFS資料不完整,因為這裡必須設定成非搶佔模式。

由於配置了nfs的nfs_check.sh監控指令碼,所以當其中一臺節點機器上的NFS服務宕停後會自動重啟NFS。
如果NFS服務重啟失敗,則會自動關閉該節點機器上的keepalived服務,如果該節點有vip則會自動飄移到另外一臺節點上。

  

三、安裝部署Rsync+Inofity(Master和Slave兩機器都要操作)
1)安裝rsync和inotify
# yum -y install rsync inotify-tools

2)Master節點機器配置rsyncd.conf
# cp /etc/rsyncd.conf /etc/rsyncd.conf_bak
# >/etc/rsyncd.conf
# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = 0
port = 873
hosts allow = 172.16.60.0/24  #允許ip訪問設定,可以指定ip或ip段
max connections = 0
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
log format = %t %a %m %f %b
transfer logging = yes
syslog facility = local3

[master_web]
path = /data/k8s_storage
comment = master_web
ignore errors
read only = no   #是否允許客戶端上傳檔案
list = no
auth users = rsync  #指定由空格或逗號分隔的使用者名稱列表,只有這些使用者才允許連線該模組
secrets file = /etc/rsyncd.passwd  #儲存密碼和使用者名稱檔案,需要自己生成

編輯密碼和使用者檔案(格式為"使用者名稱:密碼")
# vim /etc/rsyncd.passwd
rsync:123456

編輯同步密碼(注意這個檔案和上面的密碼和使用者檔案路徑不一樣)
該檔案內容只需要填寫從伺服器的密碼,例如這裡從伺服器配的使用者名稱密碼都是rsync:123456,則主伺服器則寫123456一個就可以了
# vim /opt/rsyncd.passwd
123456

設定檔案執行許可權
# chmod 600 /etc/rsyncd.passwd
# chmod 600 /opt/rsyncd.passwd

啟動服務
# systemctl enable rsyncd && systemctl restart rsyncd

檢查rsync服務程序是否啟動
# ps -ef|grep rsync

3)Slave節點機器配置rsyncd.conf
就把master主機/etc/rsyncd.conf配置檔案裡的[master_web]改成[slave_web]
其他都一樣,密碼檔案也設為一樣

# cp /etc/rsyncd.conf /etc/rsyncd.conf_bak
# >/etc/rsyncd.conf
# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = 0
port = 873
hosts allow = 172.16.60.0/24
max connections = 0
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
log format = %t %a %m %f %b
transfer logging = yes
syslog facility = local3

[slave_web]
path = /data/k8s_storage
comment = master_web
ignore errors
read only = no
list = no
auth users = rsync
secrets file = /etc/rsyncd.passwd

編輯密碼和使用者檔案(格式為"使用者名稱:密碼")
# vim /etc/rsyncd.passwd
rsync:123456

編輯同步密碼
# vim /opt/rsyncd.passwd
123456

設定檔案執行許可權
# chmod 600 /etc/rsyncd.passwd
# chmod 600 /opt/rsyncd.passwd

啟動服務
# systemctl enable rsyncd && systemctl restart rsyncd

檢查rsync服務程序是否啟動
# ps -ef|grep rsync

  

4)手動驗證下Master節點NFS資料同步到Slave節點
在Master節點的NFS共享目錄下建立測試資料
# ls /data/k8s_storage/
# mkdir /data/k8s_storage/test
# touch /data/k8s_storage/{a,b}
# ls /data/k8s_storage/
a  b  test

手動同步Master節點的NFS共享目錄資料到Slave節點的NFS共享目錄下
# rsync -avzp --delete /data/k8s_storage/ [email protected]::slave_web --password-file=/opt/rsyncd.passwd

到Slave節點檢視
# ls /data/k8s_storage/
a  b  test

  

上面rsync同步命令說明:

  • /data/k8s_storage/ 是同步的NFS共享目錄
  • [email protected]::slave_web
  • rsync 是Slave節點伺服器的/etc/rsyncd.passwd檔案中配置的使用者名稱
  • 172.16.60.236為Slave節點服務ip
  • slave_web 為Slave伺服器的rsyncd.conf中配置的同步模組名
  • --password-file=/opt/rsyncd.passwd 是Master節點同步到Slave節點使用的密碼檔案,檔案中配置的是Slave節點伺服器的/etc/rsyncd.passwd檔案中配置的密碼
5)設定Rsync+Inotify自動同步 這裡需要注意:不能設定Master和Slave節點同時執行rsync自動同步,即不能同時設定雙向同步。因為Master節點將資料同步到Slave節點,如果Slave節點再將資料同步回到Master節點,這個就矛盾了。所以需要確保只有一方在執行自動同步到另一方的操作。方式就是判斷當前節點伺服器是否存在VIP,如存在VIP則自動同步資料到另一臺節點上。如不存在VIP則不執行自動同步操作。 +++++++ Master節點伺服器操作 +++++++ 編寫自動同步指令碼/opt/rsync_inotify.sh
#!/bin/bash
host=172.16.60.236
src=/data/k8s_storage/
des=slave_web
password=/opt/rsyncd.passwd
user=rsync
inotifywait=/usr/bin/inotifywait

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files ;do
 rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
 echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

  

編寫VIP監控指令碼/opt/vip_monitor.sh
#!/bin/bash
VIP_NUM=`ip addr|grep 244|wc -l`
RSYNC_INOTIRY_NUM=`ps -ef|grep /usr/bin/inotifywait|grep -v grep|wc -l`
if [ ${VIP_NUM} -ne 0 ];then
   echo "VIP在當前NFS節點伺服器上" >/dev/null 2>&1
   if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then
      echo "rsync_inotify.sh指令碼已經在後臺執行中" >/dev/null 2>&1
   else
      echo "需要在後臺執行rsync_inotify.sh指令碼" >/dev/null 2>&1
      nohup sh /opt/rsync_inotify.sh &
  fi
else
   echo "VIP不在當前NFS節點伺服器上" >/dev/null 2>&1
   if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then
      echo "需要關閉後臺執行的rsync_inotify.sh指令碼" >/dev/null 2>&1
      ps -ef|grep rsync_inotify.sh|grep -v grep|awk '{print $2}'|xargs kill -9
      ps -ef|grep inotifywait|grep -v grep|awk '{print $2}'|xargs kill -9
   else
      echo "rsync_inotify.sh腳本當前未執行" >/dev/null 2>&1
   fi
fi

  

編寫持續執行指令碼/opt/rsync_monit.sh
#!/bin/bash
while [ "1" = "1" ]
do
  /bin/bash -x /opt/vip_monitor.sh >/dev/null 2>&1
done

  

後臺執行指令碼
# chmod 755 /opt/rsync_inotify.sh
# chmod 755 /opt/vip_monitor.sh
# chmod 755 /opt/rsync_monit.sh

# nohup sh /opt/rsync_inotify.sh &
# nohup sh /opt/rsync_monit.sh &

  

設定rsync_monit.sh指令碼的開機啟動
# chmod +x /etc/rc.d/rc.local
# echo "nohup sh /opt/rsync_monit.sh & " >> /etc/rc.d/rc.local

  

+++++++ Slave節點伺服器操作 +++++++ 指令碼名為/opt/rsync_inotify.sh,內容如下:
#!/bin/bash
host=172.16.60.235
src=/data/k8s_storage/
des=master_web
password=/opt/rsyncd.passwd
user=rsync
inotifywait=/usr/bin/inotifywait

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files ;do
 rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
 echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

  

編寫VIP監控指令碼/opt/vip_monitor.sh
#!/bin/bash
VIP_NUM=`ip addr|grep 244|wc -l`
RSYNC_INOTIRY_NUM=`ps -ef|grep /usr/bin/inotifywait|grep -v grep|wc -l`
if [ ${VIP_NUM} -ne 0 ];then
   echo "VIP在當前NFS節點伺服器上" >/dev/null 2>&1
   if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then
      echo "rsync_inotify.sh指令碼已經在後臺執行中" >/dev/null 2>&1
   else
      echo "需要在後臺執行rsync_inotify.sh指令碼" >/dev/null 2>&1
      nohup sh /opt/rsync_inotify.sh &
  fi
else
   echo "VIP不在當前NFS節點伺服器上" >/dev/null 2>&1
   if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then
      echo "需要關閉後臺執行的rsync_inotify.sh指令碼" >/dev/null 2>&1
      ps -ef|grep rsync_inotify.sh|grep -v grep|awk '{print $2}'|xargs kill -9
      ps -ef|grep inotifywait|grep -v grep|awk '{print $2}'|xargs kill -9
   else
      echo "rsync_inotify.sh腳本當前未執行" >/dev/null 2>&1
   fi
fi

  

編寫持續執行指令碼/opt/rsync_monit.sh
#!/bin/bash
while [ "1" = "1" ]
do
  /bin/bash -x /opt/vip_monitor.sh >/dev/null 2>&1
done

  

後臺執行指令碼 (只執行rsync_monit.sh)
# chmod 755 /opt/rsync_inotify.sh
# chmod 755 /opt/vip_monitor.sh
# chmod 755 /opt/rsync_monit.sh

# nohup sh /opt/rsync_monit.sh &

  

設定rsync_monit.sh指令碼的開機啟動
# chmod +x /etc/rc.d/rc.local
# echo "nohup sh /opt/rsync_monit.sh & " >> /etc/rc.d/rc.local

  

6)最後驗證下自動同步
1)比如當前VIP在Master節點,在Master節點建立測試資料,觀察是否自動同步到Slave節點
# ip addr|grep 172.16.60.244
    inet 172.16.60.244/32 scope global eth0

# rm -rf /data/k8s_storage/*
# echo "test" > /data/k8s_storage/haha
# ls /data/k8s_storage/
haha

到Slave節點上檢視,已自動同步過來
# ls /data/k8s_storage/
haha
# cat /data/k8s_storage/haha
test

2)接著關閉Master節點的keeplived,將VIP飄移到Slave節點
# systemctl stop keepalived
# ip addr|grep 172.16.60.244

到Slave節點上檢視,發現VIP已經飄移過來了
# ip addr|grep 172.16.60.244
    inet 172.16.60.244/32 scope global eth0

在Slave節點建立測試資料,觀察是否自動同步到Master節點
# rm -rf /data/k8s_storage/*
# mkdir /data/k8s_storage/cha
# echo "heihei" > /data/k8s_storage/you

到Master節點檢視,發現數據已經同步過來了
# ls /data/k8s_storage/
cha heihei

3)模擬Master節點和Slave節點關機,觀察開機後:
/opt/rsync_monit.sh指令碼會實現開機自啟動。
按照上面Master和Slave節點的自動同步驗證OK。