Keepalive:http://www.keepalived.org/
《老男孩Linux運(yùn)維》
Keepalived
Keepalived介紹
Keepalived軟件最初是專為LVS設(shè)計(jì)的,用來管理并監(jiān)控LVS集群系統(tǒng)中的各個(gè)服務(wù)節(jié)點(diǎn)狀態(tài),后來又加入了實(shí)現(xiàn)高可用的 VRRP功能。因此,Keepalived除了能管理LVS外,還可以作為Nginx、Haproxy等的高可用解決軟件。
Keepalived主要是通過VRRP協(xié)議實(shí)現(xiàn)高可用功能。
VRRP(Virtual Router Redundancy Protocol),虛擬路由冗余協(xié)議。
VRRP目的是為了解決靜態(tài)路由單點(diǎn)故障問題,它能保證當(dāng)個(gè)別節(jié)點(diǎn)宕機(jī)時(shí),整個(gè)網(wǎng)絡(luò)可以不間斷地運(yùn)行。
所以,Keepalived一方面具有配置管理LVS的功能,同時(shí)還具有對LVS下面節(jié)點(diǎn)進(jìn)行健康檢查的功能,另一方面也可實(shí)現(xiàn)系統(tǒng)網(wǎng)絡(luò)服務(wù)的高可用功能。
Keepalived的三個(gè)重要功能
管理LVS負(fù)載均衡軟件
可以說,Keepalived起初是專為解決LVS的問題而誕生的。因此,Keepalived和LVS的關(guān)系如夫妻一樣,可緊密結(jié)合。
實(shí)現(xiàn)對LVS集群節(jié)點(diǎn)健康檢查
當(dāng)LVS集群中某個(gè)節(jié)點(diǎn)服務(wù)器發(fā)生故障時(shí),Keepalived服務(wù)會自動將失效的節(jié)點(diǎn)從正常隊(duì)列中剔除,并將請求調(diào)度到別的正常的節(jié)點(diǎn)服務(wù)器上,從而保證用戶訪問不受影響。當(dāng)故障節(jié)點(diǎn)被修復(fù)后,Keepalived服務(wù)又會自動把它切換回來。
系統(tǒng)網(wǎng)絡(luò)服務(wù)的高可用功能
Keepalived可以實(shí)現(xiàn)任意兩臺主機(jī)之間,如Master和Backup間的故障轉(zhuǎn)移和自動切換。這個(gè)主機(jī)是不能停機(jī)的業(yè)務(wù)服務(wù)器,如LVS負(fù)載均衡、Nginx反向代理服務(wù)器等。
Keepalived高可用功能的簡單原理。Mater獲得所有資源并對用戶提供服務(wù),Backup主機(jī)為Master的熱備。當(dāng)Master失效或出現(xiàn)故障時(shí),Backup將自動接管Master主機(jī)的所有工作,包括VIP資源;當(dāng)Master恢復(fù)后,自會自動接管回它原來的工作,Backup則同時(shí)釋放它接管的工作。
此時(shí),兩臺主機(jī)將恢復(fù)到最初啟動時(shí)各自的原始角色及工作狀態(tài)。
Keepalived高可用故障切換轉(zhuǎn)移原理
Keepalived高可用服務(wù)的故障切換轉(zhuǎn)移,是通過VRRP來實(shí)現(xiàn)的。
在Keepalived服務(wù)正常運(yùn)行時(shí),主Master節(jié)點(diǎn)會不斷向備用結(jié)點(diǎn)發(fā)送(多播方式)心跳信息,用以告訴Backup節(jié)點(diǎn)自己還活著。
當(dāng)Master節(jié)點(diǎn)發(fā)生故障時(shí),就無法發(fā)送心跳信息,Backup節(jié)點(diǎn)也就無法檢測到來自Master的心跳信息,于是調(diào)用自身的接管程序,接管Master的IP資源和服務(wù);
當(dāng)Master恢復(fù)時(shí),Backup又會釋放Master故障時(shí)自身接管的IP資源和服務(wù),恢復(fù)到原來的備用角色。
VRRP(Virtual Router Redundancy Protocol)虛擬路由協(xié)議,為了解決靜態(tài)路由的單點(diǎn)故障問題,VRRP通過一種競選機(jī)制來將路由的任務(wù)交給某臺VRRP路由器。
VRRP早期是用來解決交換機(jī)、路由器等設(shè)備單點(diǎn)故障。交互、路由的Master和Backup的切換原理同樣適用于Keepalived的工作原理。
在一組VRRP路由器集群中,有多臺物理VRRP路由器,但并不是同時(shí)工作,而是由一臺Master的機(jī)器負(fù)責(zé)路由工作,其他機(jī)器都是Backup。Master并不是一成不變,VRRP會讓每個(gè)VRRP路由參與競選,最終獲勝的就是Master。獲勝的Master有一些特權(quán),比如擁有虛擬路由器的IP地址等。
擁有系統(tǒng)資源的Master負(fù)責(zé)轉(zhuǎn)發(fā)發(fā)送給網(wǎng)關(guān)地址的包和響應(yīng)ARP請求。
VRRP通過競選機(jī)制來實(shí)現(xiàn)虛擬路由器的功能,所有的協(xié)議報(bào)文都是通過IP多播(Multicast)包形式來發(fā)送,默認(rèn)多播地址224.0.0.18
。在一組虛擬路由器中,不管誰是 Master,對外都是相同的MAC和IP,稱之為VIP。客戶端主機(jī)并不需要因Master的改變而修改自己的路由配置。對他們來說,這種切換時(shí)透明的。
在一組虛擬路由器中,只有作為Master的VRRP路由器會一直發(fā)送VRRP廣播包,此時(shí)Backup不會搶占Master。當(dāng)Master不可用時(shí),Backup就收不到來自Master的廣播包了,此時(shí)多臺Backup中優(yōu)先級最高的路由器會搶占為Master。
這種搶占非常快速,以保證服務(wù)的連續(xù)性。處于安全性考慮,VRRP數(shù)據(jù)報(bào)使用了加密協(xié)議進(jìn)行加密。
Keepalived高可用服務(wù)
安裝Keepalived軟件
可以通過官方下載源碼來編譯安裝,也可以使用yum來安裝。
yum search keepalived
yum install -y keepalived
rpm -q keepalived
Keepalived配置文件
利用yum安裝,Keepalived的配置文件默認(rèn)為:/etc/keepalived/keepalived.conf
全局定義(Global Definitions)部分:
! Configuration File for keepalived
#號 和 !號 都是注釋
global_defs { #全局定義
notification_email { #定義報(bào)警郵件地址,當(dāng)服務(wù)切換或RS節(jié)點(diǎn)有故障時(shí),發(fā)送報(bào)警郵件
acassen@firewall.loc #收件人1
failover@firewall.loc #收件人2
sysadmin@firewall.loc #收件人3
}
notification_email_from Alexandre.Cassen@firewall.loc #發(fā)件人
smtp_server 192.168.200.1 #發(fā)送郵件的smtp服務(wù)器
smtp_connect_timeout 30 #連接smtp的超時(shí)時(shí)間
#所有郵件報(bào)警相關(guān)參數(shù)均可以不配,可以交由監(jiān)控軟件(如Nagios、Zabbix)實(shí)現(xiàn)
router_id LVS_DEVEL #Keepalived服務(wù)器的路由標(biāo)識。在一個(gè)局域網(wǎng)內(nèi),此標(biāo)識應(yīng)該唯一
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
VRRP實(shí)例定義區(qū)塊(VRRP instance)部分:
這部分主要用來定義具體服務(wù)的實(shí)例配置,包括Keepalived主備狀態(tài)、接口、優(yōu)先級、認(rèn)證方式和IP信息等。
vrrp_instance VI_1 {
#定義一個(gè)vrrp實(shí)例,名字是 VI_1
#每個(gè)vrrp實(shí)例可以認(rèn)為是Keepalived服務(wù)的一個(gè)實(shí)例或作為一個(gè)業(yè)務(wù)服務(wù),在Keepalived服務(wù)配置中,vrrp實(shí)例可以有多個(gè)
#注意,存在于主節(jié)點(diǎn)中的vrrp實(shí)例在備節(jié)點(diǎn)中也要存在,這樣才能實(shí)現(xiàn)故障切換轉(zhuǎn)移
state MASTER
#當(dāng)前vrrp實(shí)例狀態(tài),MASTER|BACKUP,大寫
interface eth0
#網(wǎng)絡(luò)通信接口,注意服務(wù)器的接口名稱
virtual_router_id 51
#虛擬路由ID標(biāo)識,這個(gè)標(biāo)識最好是一個(gè)數(shù)字,并在keepalived.conf配置中唯一
#MASTER和BACKUP配置中相同vrrp實(shí)例的virtual_router_id必須一致,否則將出現(xiàn)腦裂問題
priority 100
#優(yōu)先級,數(shù)字越大,表示實(shí)例優(yōu)先級越高
#在同一個(gè)vrrp實(shí)例里,MASTER的優(yōu)先級要高于BACKUP才行
advert_int 1
#同步通知間隔,MASTER和BACKUP之間通信檢查的時(shí)間間隔,單位是秒
authentication {
#權(quán)限認(rèn)證配置
auth_type PASS
#認(rèn)證類型,有PASS(Simple Passwd)和 AH(IPSEC),官方推薦PASS
#驗(yàn)證密碼為明文方式,最好長度不要超過8個(gè)字符,建議使用4位的數(shù)字。同一個(gè)vrrp實(shí)例的MASTER和BACKUP使用相同的密碼才能正常通信
auth_pass 1111 #通信密碼
}
virtual_ipaddress {
#虛擬ip,可以配置多個(gè)虛擬ip,配置是最好指定子網(wǎng)掩碼和虛擬IP綁定的網(wǎng)絡(luò)接口。否則子網(wǎng)掩碼默認(rèn)是32位,綁定的接口和前面的interface參數(shù)配置一致
#虛擬IP就是工作中需要和域名綁定的IP,和配置高可用服務(wù)監(jiān)聽的IP要保持一致
192.168.200.16
192.168.200.17
192.168.200.18
}
}
配置Keepalived高可用
Keepalived高可用服務(wù)器節(jié)點(diǎn),MASTER 和 BACKUP 。兩臺的配置如下:
Ip:
MASTER:192.168.1.9
BACKUP:192.168.1.7
Virtual_ip:192.168.3.88
upstream.conf:
upstream zhang {
server 192.168.0.99:5678;
}
Nginx.conf:
http {
xxx;
include /xxx/nginx/conf.d/*.conf;
server {
listen 80;
server_name localhost;
proxy_pass http://zhang;
}
訪問效果:
MASTER端Keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id zhang #路由器ID主備可同可不同
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.3.88/22 dev ens33 label ens33:1
}
}
BACKUP端Keepalived.conf:
BACKUP在MASTER沒有掛的情況下是沒有VIP的哦!VIP同一時(shí)刻只能出現(xiàn)在同一臺機(jī)器上。
! Configuration File for keepalived
global_defs {
router_id zhang #路由器ID主備可同可不同
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.3.88/22 dev eth0 label eth0:1
}
}
注意:
state 不一樣;
priority 不一樣;
修改hosts:
192.168.3.88 www.zhang.com
實(shí)際效果:
切換MASTER:
192.168.1.9上
service keepalived stop
這里1.9主機(jī)的Keepalived掛掉后,VIP實(shí)現(xiàn)了自動漂移切換。因此,僅適合兩臺服務(wù)器提供的服務(wù)均開啟的應(yīng)用場景,這也是工作中常用的高可用解決方案。
關(guān)于腦裂問題:
如果MASTER 和 BACKUP都出現(xiàn)了VIP,那說明兩者高可用裂腦了,裂腦是兩臺服務(wù)器爭搶同一資源導(dǎo)致的。
如出現(xiàn)兩節(jié)點(diǎn)搶奪同一IP資源問題,可考慮排查:
主備服務(wù)器間通信是否正常,是否有防火墻阻擋;
主備對應(yīng)的keepalived.conf配置文件是否有錯(cuò)?
Keepalived高可用服務(wù)的裂腦問題
什么是裂腦
由于某些原因,導(dǎo)致兩臺高可用服務(wù)器在指定時(shí)間內(nèi),無法檢測到對方的心跳消息,各自取得資源及服務(wù)的所有權(quán),而此時(shí)的兩臺高可用服務(wù)器對都還活著并正常運(yùn)行,這樣就會導(dǎo)致同一個(gè)ip或服務(wù)在兩端同時(shí)存在而發(fā)生沖突。
最嚴(yán)重的是兩臺主機(jī)占用同一個(gè)VIP地址,當(dāng)用戶寫入數(shù)據(jù)時(shí)可能會分別寫入到兩端,這可能會導(dǎo)致服務(wù)器兩端的數(shù)據(jù)不一致或造成數(shù)據(jù)丟失,這種情況被稱為裂腦。
裂腦發(fā)生的原因
一般來說,有以下幾種原因:
- 高可用服務(wù)器對之間心跳線路發(fā)生故障,導(dǎo)致無法正常通信;
- 高可用服務(wù)器上開啟了防火墻阻擋了心跳信息傳輸;
- 高可用服務(wù)器網(wǎng)卡等信息配置不正確,導(dǎo)致心跳信息發(fā)送失敗;
- 其他服務(wù)配置不當(dāng),如vrrp實(shí)例的virtual_router_id不一致;
解決裂腦常見方案
- 保證通信線路完整;
- 當(dāng)檢測到裂腦時(shí)強(qiáng)行關(guān)閉一個(gè)心跳節(jié)點(diǎn);
- 做好多裂腦的監(jiān)控報(bào)警,發(fā)生問題時(shí)及時(shí)解決;
- 如果有防火墻,要讓心跳信息通過;
Keepalived雙實(shí)例雙主模式
前面的Keepalived栗子是單實(shí)例主備模式,但Keepalived還支持雙實(shí)例多業(yè)務(wù)雙向主備模式。需要創(chuàng)建新實(shí)例。
雙實(shí)例主備環(huán)境:
192.168.1.7 instance VI_1-BACKUP, instance VI_2-MASTER;
192.168.1.9 instance VI_1-MASTER, instance VI_2-BACKUP;
instance 1-VIP:192.168.3.88-www.zhang.com;
instance 2-VIP:192.168.3.99-www.zhang.cn;
#記得添加hosts
192.168.1.9-keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id zhang
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.3.88/22 dev ens33 label ens33:1
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.3.99/22 dev ens 33 label ens33:2
}
}
192.168.1.7-keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id zhang
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.3.88/22 dev eth0 label eth0:1
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 52
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.3.99/22 dev eth0 label eth0:2
}
}
效果:
VIP漂移:
192.168.1.9
service keepalived stop
訪問圖:
解決高可用服務(wù)只針對物理服務(wù)器的問題
默認(rèn)情況下,Keepalived軟件僅僅在另外一臺機(jī)器宕機(jī)或Keepalived停掉的時(shí)候才會接管業(yè)務(wù)。
但在實(shí)際工作中,有業(yè)務(wù)服務(wù)停止而Keepalived服務(wù)還存在的情況,這就會導(dǎo)致用戶訪問的VIP無法找到對應(yīng)的服務(wù)。那么,如果讓ip漂移到對端節(jié)點(diǎn)呢?
第一個(gè)方法:可以寫守護(hù)進(jìn)程腳本來處理
當(dāng)Nginx業(yè)務(wù)有問題時(shí),就停掉本地的Keepalived服務(wù),實(shí)現(xiàn)IP漂移到對端繼續(xù)提供服務(wù)。
舉個(gè)栗子:
vim check_nginx.sh
#!/bin/bash
while true
do
if [ `netstat -nltup | grep nginx | wc -l` -ne 1 ];then
/sbin/service keepalived stop
fi
sleep 2
done
第二個(gè)方法:使用Keepalived配置文件觸發(fā)寫好的監(jiān)測腳本
監(jiān)測腳本:
vim chk_nginx.sh
#!/bin/bash
while true
do
if [ `netstat -nltup | grep nginx | wc -l` -ne 1 ];then
/sbin/service keepalived stop
fi
sleep 3
done
修改keepalived.conf:
! Configuration File for keepalived
global_defs {
xxx
}
vrrp_script chk_nginx { #定義vrrp腳本
script "/etc/keepalived/chk_nginx.sh"
interval 2 #間隔2s
weight 2
}
vrrp_instancd xxx {
xxx
virtual_ipaddress {
xxx
}
track_script { #觸發(fā)檢查
chk_nginx
}
}
解決多組Keepalived服務(wù)器在同一個(gè)局域網(wǎng)的沖突問題
當(dāng)在同一個(gè)局域網(wǎng)內(nèi)部部署了多組Keepalived服務(wù)器對,而又未使用專門的心跳線通信時(shí),可能會發(fā)生高可用接管的嚴(yán)重故障問題。
Keepalived高可用是通過VRRP協(xié)議來實(shí)現(xiàn)的,VRRP協(xié)議默認(rèn)通過IP多播的形式實(shí)現(xiàn)高可用對之間的通信。多組Keepalived服務(wù)器對會造成IP多播地址沖突問題,導(dǎo)致接管錯(cuò)亂,不同組的Keepalived都是使用默認(rèn)的 224.0.0.18
作為多播地址。
此時(shí)解決辦法是,在同組的Keepalived服務(wù)器所有的配置文件里指定獨(dú)一無二的多播地址。
global_defs {
router_id zhang
vrrp_mcast_group4 224.0.0.19 #指定多播地址
不同實(shí)例的通信認(rèn)證密碼也最好不同,以確保接管正確。
指定Keepalived日志
默認(rèn)情況下,Keepalived服務(wù)的日志會輸出到 /var/log/messages
,和其他日志混雜在一起,很不方便。
操作如下:
vim /etc/sysconfig/keepalived
將 KEEPALIVED_OPTIONS="-D"
修改為 KEEPALIVED_OPTIONS="-D -d -S 0"
vim /etc/rsyslog.conf
#在末尾加入
#keepalived
local0.* /var/log/keepalived.log
#然后找到 *.info;mail.none;authpriv.none;cron.none /var/log/messages
#加上local0
*.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages
#重啟rsyslog服務(wù)
service rsyslog restart
開發(fā)檢查Keepalived腦裂的腳本
思路:在備節(jié)點(diǎn)上執(zhí)行腳本,如果可以ping通主節(jié)點(diǎn),并且備節(jié)點(diǎn)有VIP就報(bào)警,讓人員介入檢查。