1. Keepalived介紹linux
Keepalived 是一個基於 vrrp 協議來實現的服務器高可用解決方案,能夠利用其實現避免IP單點故障,相似的工具還有 heartbeat 、 corosync 。不過其不會單獨出現,而是搭配着 LVS、Nginx、HAproxy,一塊兒協同工做達到高可用的目的。nginx
VRRP 全稱Vritual Router Redundancy Protocol,虛擬路由冗餘協議。經過把幾臺提供路由功能的設備組成一個虛擬路由設備,使用必定的機制保證虛擬路由的高可用,從而達到保持業務的連續性與可靠性。服務器
在這組成的一個虛擬路由器中,有 master 和 backup 之分。master是主節點,在一個虛擬路由器中,只能有一個master,但能夠有多個backup;backup是備用節點,也就是當master掛掉以後,backup接手master節點的全部資源,當有多個backup節點時,根據其 priority (優先級)的值的大小,來選擇誰做爲master的替代者。當backup節點的優先級值相同時,根據其IP地址的大小,來決定。網絡
2.1 各節點時間必須同步測試
可使用 ntp 、 chrony 等工具進行時間同步spa
2.2 確保iptables和selinux規則清空3d
實驗環境下,咱們直接將防火牆規則清空,關閉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 { #定義通知郵箱 yangchao@chucloud.com.cn } notification_email_from Alexandre.Cassen@firewall.loc 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 { yangchao@chucloud.com.cn } notification_email_from Alexandre.Cassen@firewall.loc 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 #觸發檢查 } }
說明:
一、vrr_instance實例,名字是VI_1,每一個實例能夠認爲是keepalived服務的一個或者多個業務服務,能夠有多個,注意,主節點的中的vrrp
二、state MASTER表明當前實例VI_1的角色狀態,當前角色爲MASTER,只有MATER和BACKUP兩個狀態,必須大寫
三、interface 爲網絡通訊接口
四、virtual_router_id爲虛擬機路由id表示,最好是數字,並且是配置文件中惟一的,MASTER和BACKUP配置中相同的實例id又必須一致
五、priority優先級,數字越大,優先級越高,MASTER必須高於BACKUP
六、advert_int 同步時間,默認1秒
七、authentication,認證, MASTER和BACKUP須要配置一致
八、virtual_ipaddress虛擬IP,注意,此IP能夠配置多個,一般爲須要跟域名綁定
九、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
記得設定可執行權限
四、測試
開啓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
五、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
加上可執行權限