1、keepalived實(shí)現(xiàn)原理
Keepalived是一個(gè)基于VRRP協(xié)議來實(shí)現(xiàn)的服務(wù)高可用方案,可以利用其來避免單點(diǎn)故障。一個(gè)WE服務(wù)至少會(huì)有2臺(tái)服務(wù)器運(yùn)行Keepalived,一臺(tái)為主服務(wù)器(MASTER),一臺(tái)為備份服 務(wù)器(BACKUP),但是對(duì)外表現(xiàn)為一個(gè)虛擬IP,主服務(wù)器會(huì)發(fā)送特定的消息給備份服務(wù)器,當(dāng)備份服務(wù)器收不到這個(gè)消息的時(shí)候,即主服務(wù)器宕機(jī)的時(shí)候, 備份服務(wù)器就會(huì)接管虛擬IP,繼續(xù)提供服務(wù),從而保證了高可用性。主/備節(jié)點(diǎn)輪流在對(duì)外發(fā)布vrrp通告(vrrp通告地址224.0.0.18),理論上備節(jié)點(diǎn)如果收到主節(jié)點(diǎn)的通告,通告中優(yōu)先級(jí)高于自己,就不會(huì)主動(dòng)對(duì)外發(fā)送通告
2、VRRP的原理
2.1 VRRP協(xié)議簡介
在現(xiàn)實(shí)的網(wǎng)絡(luò)環(huán)境中,兩臺(tái)需要通信的主機(jī)大多數(shù)情況下并沒有直接的物理連接。對(duì)于這樣的情況,它們之間路由怎樣選擇?主機(jī)如何選定到達(dá)目的主機(jī)的下一跳路由,這個(gè)問題通常的解決方法有二種:
·????????在主機(jī)上使用動(dòng)態(tài)路由協(xié)議(RIP、OSPF等)
·????????在主機(jī)上配置靜態(tài)路由
很明顯,在主機(jī)上配置路態(tài)路由是非常不切實(shí)際的,因?yàn)楣芾?、維護(hù)成本以及是否支持等諸多問題。配置靜態(tài)路由就變得十分流行,但路由器(或者說默認(rèn)網(wǎng)關(guān)default gateway)卻經(jīng)常成為單點(diǎn)。
VRRP的目的就是為了解決靜態(tài)路由單點(diǎn)故障問題。
VRRP通過一競(jìng)選(election)協(xié)議來動(dòng)態(tài)的將路由任務(wù)交給LAN中虛擬路由器中的某臺(tái)VRRP路由器。
2.2 工作機(jī)制
在一個(gè)VRRP虛擬路由器中,有多臺(tái)物理的VRRP路由器,但是這多臺(tái)的物理的機(jī)器并不能同時(shí)工作,而是由一臺(tái)稱為MASTER的負(fù)責(zé)路由工作,其它的都是BACKUP,MASTER并非一成不變,VRRP讓每個(gè)VRRP路由器參與競(jìng)選,最終獲勝的就是MASTER。MASTER擁有一些特權(quán),比如 擁有虛擬路由器的IP地址,我們的主機(jī)就是用這個(gè)IP地址作為靜態(tài)路由的。擁有特權(quán)的MASTER要負(fù)責(zé)轉(zhuǎn)發(fā)發(fā)送給網(wǎng)關(guān)地址的包和響應(yīng)ARP請(qǐng)求。
VRRP通過競(jìng)選協(xié)議來實(shí)現(xiàn)虛擬路由器的功能,所有的協(xié)議報(bào)文都是通過IP多播(multicast)包(多播地址224.0.0.18)形式發(fā)送的。虛擬路由器由VRID(范圍0-255)和一組IP地址組成,對(duì)外表現(xiàn)為一個(gè)周知的MAC地址。所以,在一個(gè)虛擬路由 器中,不管誰是MASTER,對(duì)外都是相同的MAC和IP(稱之為VIP)??蛻舳酥鳈C(jī)并不需要因?yàn)镸ASTER的改變而修改自己的路由配置,對(duì)他們來 說,這種主從的切換是透明的。
在一個(gè)虛擬路由器中,只有作為MASTER的VRRP路由器會(huì)一直發(fā)送VRRP廣告包(VRRPAdvertisement message),BACKUP不會(huì)搶占MASTER,除非它的優(yōu)先級(jí)(priority)更高。當(dāng)MASTER不可用時(shí)(BACKUP收不到廣告包), 多臺(tái)BACKUP中優(yōu)先級(jí)最高的這臺(tái)會(huì)被搶占為MASTER。這種搶占是非常快速的(<1s),以保證服務(wù)的連續(xù)性。
由于安全性考慮,VRRP包使用了加密協(xié)議進(jìn)行加密。
初始化:
路由器啟動(dòng)時(shí),如果路由器的優(yōu)先級(jí)是255(最高優(yōu)先級(jí),路由器擁有路由器地址),要發(fā)送VRRP通告信息,并發(fā)送廣播ARP信息通告路由器IP地址對(duì)應(yīng)的MAC地址為路由虛擬MAC,設(shè)置通告信息定時(shí)器準(zhǔn)備定時(shí)發(fā)送VRRP通告信息,轉(zhuǎn)為MASTER狀態(tài);
否則進(jìn)入BACKUP狀態(tài),設(shè)置定時(shí)器檢查定時(shí)檢查是否收到MASTER的通告信息。
主機(jī):
主機(jī)狀態(tài)下的路由器要完成如下功能:
設(shè)置定時(shí)通告定時(shí)器;
用VRRP虛擬MAC地址響應(yīng)路由器IP地址的ARP請(qǐng)求;
轉(zhuǎn)發(fā)目的MAC是VRRP虛擬MAC的數(shù)據(jù)包;
如果是虛擬路由器IP的擁有者,將接受目的地址是虛擬路由器IP的數(shù)據(jù)包,否則丟棄;
當(dāng)收到shutdown的事件時(shí)刪除定時(shí)通告定時(shí)器,發(fā)送優(yōu)先權(quán)級(jí)為0的通告包,轉(zhuǎn)初始化狀態(tài);
如果定時(shí)通告定時(shí)器超時(shí)時(shí),發(fā)送VRRP通告信息;
收到VRRP通告信息時(shí),如果優(yōu)先權(quán)為0,發(fā)送VRRP通告信息;否則判斷數(shù)據(jù)的優(yōu)先級(jí)是否高于本機(jī),或相等而且實(shí)際IP地址大于本地實(shí)際IP,設(shè)置定時(shí)通告定時(shí)器,復(fù)位主機(jī)超時(shí)定時(shí)器,轉(zhuǎn)BACKUP狀態(tài);否則的話,丟棄該通告包;
備機(jī):
備機(jī)狀態(tài)下的路由器要實(shí)現(xiàn)以下功能:
設(shè)置主機(jī)超時(shí)定時(shí)器;
不能響應(yīng)針對(duì)虛擬路由器IP的ARP請(qǐng)求信息;
丟棄所有目的MAC地址是虛擬路由器MAC地址的數(shù)據(jù)包;
不接受目的是虛擬路由器IP的所有數(shù)據(jù)包;
當(dāng)收到shutdown的事件時(shí)刪除主機(jī)超時(shí)定時(shí)器,轉(zhuǎn)初始化狀態(tài);
主機(jī)超時(shí)定時(shí)器超時(shí)的時(shí)候,發(fā)送VRRP通告信息,廣播ARP地址信息,轉(zhuǎn)MASTER狀態(tài);
收到VRRP通告信息時(shí),如果優(yōu)先權(quán)為0,表示進(jìn)入MASTER選舉;否則判斷數(shù)據(jù)的優(yōu)先級(jí)是否高于本機(jī),如果高的話承認(rèn)MASTER有效,復(fù)位主機(jī)超時(shí)定時(shí)器;否則的話,丟棄該通告包;
ARP查詢處理
當(dāng)內(nèi)部主機(jī)通過ARP查詢虛擬路由器IP地址對(duì)應(yīng)的MAC地址時(shí),MASTER路由器回復(fù)的MAC地址為虛擬的VRRP的MAC地址,而不是實(shí)際網(wǎng)卡的MAC地址,這樣在路由器切換時(shí)讓內(nèi)網(wǎng)機(jī)器覺察不到;而在路由器重新啟動(dòng)時(shí),不能主動(dòng)發(fā)送本機(jī)網(wǎng)卡的實(shí)際MAC地址。如果虛擬路由器開啟的ARP代理(proxy_arp)功能,代理的ARP回應(yīng)也回應(yīng)VRRP虛擬MAC地址
3、Keepalived配置
抓包查看: tcpdump -i eth0 vrrp -n
garp_master_delay 10-- 當(dāng)切為主狀態(tài)后多久更新ARP緩存,默認(rèn)5秒。
preempt_delay 5
3.1 配置iptables
# 配置iptables,允許vrrp流量,或者允許組播流量[root@psql_standby ~]# vim /etc/sysconfig/iptables-A INPUT -p vrrp -j ACCEPT
# 或者:-A INPUT -m pkttype --pkt-type multicast -j ACCEPT# 重啟iptables:
3.2 設(shè)置vrrp單播通告(單播方式必須配置對(duì)端,keepalived集群僅能2節(jié)點(diǎn))
# 如果兩節(jié)點(diǎn)的上聯(lián)交換機(jī)禁用了組播,則只能采用vrrp單播通告的方式[root@psql_master ~]# vim /etc/keepalived/keepalived.conf?
?priority 100? ?
?unicast_src_ip? ##source ip? ??
unicast_peer {
? ? ? ? ? ? ##dest ip? ? }
[root@psql_standby ~]# vim /etc/keepalived/keepalived.conf??
?priority 90? ??
unicast_src_ip??
##source ip? ??
unicast_peer {
? ##dest ip}
3.3 配置示例
global_defs {
? ? router_id 10.1.235.81
}
vrrp_script chk_apiserver {
? ? script "/data/ips/app/kubernetes/bin/check"
? ? interval 2
? ? weight -5
? # fall 3
? # rise 2
}
vrrp_instance VI_1 {
? ? state BACKUP
? ? interface eth0
? ? mcast_src_ip 10.1.235.81
? ? virtual_router_id 88
? ? priority 100
? ? advert_int 2
? ? garp_master_delay 120
? ? preempt_delay 20
? ? authentication {
? ? ? ? auth_type PASS
? ? ? ? auth_pass 4be37dc3b4c90194d1600c483e10ad1d
? ? }
? ? virtual_ipaddress {
? ? ? 10.1.235.7
? ? }
? ? track_script {
? ? ? chk_apiserver
? ? }
}