keepalived高可用服務搭建
1. Keepalived介紹
Keepalived 是一個基於 vrrp 協議來實現的伺服器高可用解決方案,可以利用其實現避免IP單點故障,類似的工具還有 heartbeat 、 corosync 。不過其不會單獨出現,而是搭配著 LVS、Nginx、HAproxy,一起協同工作達到高可用的目的。
VRRP 全稱Vritual Router Redundancy Protocol,虛擬路由冗餘協議。通過把幾臺提供路由功能的裝置組成一個虛擬路由裝置,使用一定的機制保證虛擬路由的高可用,從而達到保持業務的連續性與可靠性。
在這組成的一個虛擬路由器中,有 master 和 backup 之分。master是主節點,在一個虛擬路由器中,只能有一個master,但可以有多個backup;backup是備用節點,也就是當master掛掉之後,backup接手master節點的所有資源,當有多個backup節點時,根據其 priority (優先順序)的值的大小,來選擇誰作為master的替代者。當backup節點的優先順序值相同時,根據其IP地址的大小,來決定。
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
yum install keepalived keepalived -v
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
BACKUP上不會有vip
當模擬nginxi服務停止,MASTER的keepalived服務因為指令碼會停止,這時BACKUP會爭搶使用vip
可以看到MASTER上keepalived服務停止,沒有vip
而在BACKUP上爭搶到了vip
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
加上可執行許可權