1. 程式人生 > >keepalived高可用服務搭建

keepalived高可用服務搭建

1. Keepalived介紹

Keepalived 是一個基於 vrrp 協議來實現的伺服器高可用解決方案,可以利用其實現避免IP單點故障,類似的工具還有 heartbeat  corosync 。不過其不會單獨出現,而是搭配著 LVS、Nginx、HAproxy,一起協同工作達到高可用的目的。

 

1.1 VRRP協議

VRRP 全稱Vritual Router Redundancy Protocol,虛擬路由冗餘協議。通過把幾臺提供路由功能的裝置組成一個虛擬路由裝置,使用一定的機制保證虛擬路由的高可用,從而達到保持業務的連續性與可靠性。

在這組成的一個虛擬路由器中,有 master  backup 之分。master是主節點,在一個虛擬路由器中,只能有一個master,但可以有多個backup;backup是備用節點,也就是當master掛掉之後,backup接手master節點的所有資源,當有多個backup節點時,根據其 priority (優先順序)的值的大小,來選擇誰作為master的替代者。當backup節點的優先順序值相同時,根據其IP地址的大小,來決定。

 

1.2 VRRP工作邏輯

j30l80jm75q.jpeg

 

2.配置前提

2.1 各節點時間必須同步

可以使用 ntp  chrony 等工具進行時間同步

 

2.2 確保iptables和selinux規則清空

實驗環境下,我們直接將防火牆規則清空,關閉selinux

iptables -F
systemctl stop firewalld.service
setenforce 0

在vrrp協議中我們要將我們虛擬路由器中各節點的優先順序進行廣播,這樣在我們故障時,其他節點發現在多播域內自己的優先順序最高,可以實現故障切換。

多播地址(組播): 224.0.0.0 -- 239.255.255.255

檢視是否支援多播

ifconfig | grep MULTICAST    #檢視是否支援多播
ip link set multicast on dev eth0    #開啟多播功能



3.配置Keepalived+Nginx

3.1 拓撲結構

         MASTER              keep alived              BACKUP

+-------------+          +------------+         +--------------+

|   Nginx-1   |--------|  virtualIP  |--------|   Nginx-2   |

+-------------+          +------------+         +--------------+

     172.31.208.91       172.31.208.95     172.31.208.92


3.2 安裝Keepalived

本機環境是 CentOS7

yum install keepalived
keepalived -v

image.png

3.3 keepalive配置檔案

Keepalvie配置檔案路徑為:/etc/keepalived/keepalived.conf

以下為 MASTER 配置檔案示例:請注意 MASTER 與 BACKUP 不同, 需要更改的地方,多餘配置請刪除

! Configuration File for keepalived

global_defs {
   notification_email {		#定義通知郵箱
   [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1	#定義SMTP伺服器地址
   smtp_connect_timeout 30
   router_id lb01  #定義id為lb01,ID要唯一
}

vrrp_script chk_ngx  {		#定義vrrp指令碼,檢測nginx服務狀態
script "/etc/keepalived/chk_ngx.sh"  #具體指令碼位置,當nginx服務有問題時停掉keepalive服務

interval 2			    #間隔兩秒
weight 2
}

vrrp_instance VI_1 {	        #例項名字為VI_1,相同的例項的備節點名字要和這個相同
    state MASTER	        #狀態為MASTER,備節點狀態需要改為BACKUP
    interface ens192		#定義通訊介面為eth0,此引數備節點和主節點相同
    virtual_router_id 55	#例項ID為55.唯一
    priority 150		#優先順序為150,備節點的優先順序必須比此數字低	
    advert_int 1		#通訊檢查檢查間隔時間為1秒
    authentication {
        auth_type PASS		#認證型別,此引數備節點設定和主節點設定相同
        auth_pass 1111		#密碼是1111,此引數備節點設定和主節點相同
    }
    virtual_ipaddress {		#虛擬機器IP,即VIP為172.31.208.95/24,繫結介面為eth0,別名為eth0:1,此引數備節點設定和主節點相同
    	172.31.208.95/24 dev ens192 label ens192:1
    }
    track_script {
    chk_ngx			#觸發檢查
    }
}

以下為BACKUP的配置檔案

! Configuration File for keepalived

global_defs {
   notification_email {
   [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
}
   vrrp_script chk_ngx  {		#定義vrrp指令碼,檢測nginx服務狀態
   script "/etc/keepalived/chk_ngx.sh"  #具體指令碼位置,當nginx服務有問題時停掉keepalive服務

   interval 2			    #間隔兩秒
   weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens192
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.31.208.95/24 dev ens192 label ens192:1 
    }
    track_script {
    chk_ngx			#觸發檢查
    }

}

說明:

1、vrr_instance例項,名字是VI_1,每個例項可以認為是keepalived服務的一個或者多個業務服務,可以有多個,注意,主節點的中的vrrp

2、state MASTER代表當前例項VI_1的角色狀態,當前角色為MASTER,只有MATER和BACKUP兩個狀態,必須大寫

3、interface 為網路通訊介面

4、virtual_router_id為虛擬機器路由id表示,最好是數字,而且是配置檔案中唯一的,MASTER和BACKUP配置中相同的例項id又必須一致

5、priority優先順序,數字越大,優先順序越高,MASTER必須高於BACKUP

6、advert_int 同步時間,預設1秒

7、authentication,認證, MASTER和BACKUP需要配置一致

8、virtual_ipaddress虛擬IP,注意,此IP可以配置多個,通常為需要跟域名繫結

9、vrrp_script,定義的指令碼


3.4監控指令碼編寫

預設情況下,keepalived軟體僅僅在對方機器宕機或者keepalive停掉的時候才會接管業務。但是有時候nginx服務停掉,但是keepalived服務還在工作,此時就會導致使用者的訪問的vip無法找到對應的服務,所以需要編寫指令碼,檢測nginx服務狀態,當服務中斷時,keepalive服務也中斷,指令碼如下

#!/bin/bash
if [ `netstat -lntup|grep nginx|wc -l` -ne 1 ];then
 systemctl stop keepalived
fi

記得設定可執行許可權


4、測試

開啟keepalived

systemctl start keepalived
systemctl enable keepalvied

注意,當配置檔案有任何錯誤的時候,systemctl 不會提示keepalived啟動失敗,需要使用systemclt status檢查服務

當配置正確,MASTER會主機會有VIP

image.png


BACKUP上不會有vip

image.png


當模擬nginxi服務停止,MASTER的keepalived服務因為指令碼會停止,這時BACKUP會爭搶使用vip

image.png

可以看到MASTER上keepalived服務停止,沒有vip

而在BACKUP上爭搶到了vip

image.png


5、keepalived的裂腦的指令碼

    由於某些原因,導致兩臺高可用伺服器對在指定時間內,無法檢測到對方的心跳消失,各自取得資源及服務的所有權,而此時的兩臺高可用伺服器對都還活著並且在正常執行,

此時就會導致一個IP或者服務存在衝突,兩個伺服器都會佔用同一個VIP,此時就被稱為裂腦。

 如果出現了裂腦情況,則需要儘快接入中間仲裁,關閉一臺伺服器或者keepalived服務


指令碼思路:

在BACKUP上執行指令碼,如果可以ping通MASTER,並且BACKUP有VIP就報警。

#!/bin/sh
MASTER_VIP=172.31.208.95
MASTER_IP=172.31.208.91
while true
do
ping -c 2 -W 3 $MASTER_IP &>/dev/null
 if [ $? -eq 0 -a `ip addr|grep "$MASTER_IP"|wc -l` -eq 1 ]
  then
    echo "HA is split brain.warning."
else
    echo "HA is OK!"
fi
sleep 5
done

加上可執行許可權




image.png