一、Vrrp協(xié)議
1、VRRP 協(xié)議簡介
vrrp: Virtual Redundent Routing Protocol (虛擬冗余路由協(xié)議)
在現(xiàn)實(shí)的網(wǎng)絡(luò)環(huán)境中,兩臺(tái)需要通信的主機(jī)大多數(shù)情況下并沒有直接的物理連接,
vrrp與keepalived詳解
。對(duì)于這樣的情況,它們之間路由怎樣選擇?主機(jī)如何選定到達(dá)目的主機(jī)的下一跳路由?這個(gè)問題通常的解決方法有二種:
在主機(jī)上使用動(dòng)態(tài)路由協(xié)議(RIP、OSPF等)
在主機(jī)上配置靜態(tài)路由
很明顯,在主機(jī)上配置動(dòng)態(tài)路由是非常不切實(shí)際的,因?yàn)?a class="channel_keylink" href="http://www.zwdianwu.cn/fanwenwang/gzzd/" title="管理">管理、維護(hù)成本以及是否支持等諸多問題。配置靜態(tài)路由就變得十分流行,但路由器|默認(rèn)網(wǎng)關(guān)|default gateway卻經(jīng)常成為單點(diǎn)故障。
VRRP的目的就是為了解決靜態(tài)路由單點(diǎn)故障問題,VRRP通過競選(election)協(xié)議來動(dòng)態(tài)的將路由任務(wù)交給LAN中虛擬路由器中的某臺(tái)VRRP路由器。
2、VRRP 工作機(jī)制
在一個(gè)VRRP虛擬路由器中,有多臺(tái)物理的VRRP路由器,但是這多臺(tái)的物理的機(jī)器并不能同時(shí)工作,而是由一臺(tái)稱為MASTER的負(fù)責(zé)路由工作,其它的都是BACKUP,MASTER并非一成不變,VRRP讓每個(gè)VRRP路由器參與競選,最終獲勝的就是MASTER。MASTER擁有虛擬路由器的IP地址,我們的主機(jī)就是用這個(gè)IP地址作為靜態(tài)路由的,MASTER要負(fù)責(zé)轉(zhuǎn)發(fā)發(fā)送給網(wǎng)關(guān)地址的包和響應(yīng)ARP請(qǐng)求。
VRRP通過競選協(xié)議來實(shí)現(xiàn)虛擬路由器的功能,所有的協(xié)議報(bào)文都是通過IP多播(multicast)包形式發(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)行加密。
3、相關(guān)術(shù)語
虛擬路由器:由一個(gè) Master 路由器和多個(gè) Backup 路由器組成。主機(jī)將虛擬路由器當(dāng)作默認(rèn)網(wǎng)關(guān)。
VRID:虛擬路由器的標(biāo)識(shí)。有相同 VRID 的一組路由器構(gòu)成一個(gè)虛擬路由器。
Master 路由器:虛擬路由器中承擔(dān)報(bào)文轉(zhuǎn)發(fā)任務(wù)的路由器。
Backup 路由器:Master 路由器出現(xiàn)故障時(shí),能夠代替 Master 路由器工作的路由器。
虛擬 IP 地址:虛擬路由器的 IP 地址。一個(gè)虛擬路由器可以擁有一個(gè)或多個(gè)IP 地址。
IP 地址擁有者:接口 IP 地址與虛擬 IP 地址相同的路由器被稱為 IP 地址擁有者。
虛擬 MAC 地址:一個(gè)虛擬路由器擁有一個(gè)虛擬 MAC 地址。虛擬 MAC 地址的格式為 00-00-5E-00-01-{VRID}。通常情況下,虛擬路由器回應(yīng) ARP 請(qǐng)求
使用的是虛擬 MAC 地址,只有虛擬路由器做特殊配置的時(shí)候,才回應(yīng)接口的真實(shí) MAC 地址。
priority(優(yōu)先級(jí)):VRRP 根據(jù)優(yōu)先級(jí)來確定虛擬路由器中每臺(tái)路由器的地位。
搶占方式(默認(rèn)):如果 Backup 路由器工作在搶占方式下,當(dāng)它收到 VRRP 報(bào)文后,會(huì)將自己的優(yōu)先級(jí)與通告報(bào)文中的優(yōu)先級(jí)進(jìn)行比較。如果自己的優(yōu)先級(jí)比當(dāng)前的 Master 路由器的優(yōu)先級(jí)高,就會(huì)主動(dòng)搶占成為 Master 路由器;否則,將保持 Backup 狀態(tài)。
非搶占方式:如果 Backup 路由器工作在非搶占方式下,則只要 Master 路由器沒有出現(xiàn)故障,Backup 路由器即使隨后被配置了更高的優(yōu)先級(jí)也不會(huì)成為
Master 路由器。
4、VRRP 工作流程
(1).初始化:
路由器啟動(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的通告信息。
(2).Master
設(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);否則的話,丟棄該通告包;
(3).Backup
設(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í)器;否則的話,丟棄該通告包;
5、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地址。
6、認(rèn)證方式與工作模式
認(rèn)證方式:
簡單字符認(rèn)證
md5認(rèn)證
工作模式:
master-backup模式
master-master模式
二、Keepalived
1、Keepalived 定義
什么是Keepalived呢?
觀其名可知保持存活在網(wǎng)絡(luò)里面就是保持在線了也就是所謂的高可用或熱備用來防止單點(diǎn)故障(單點(diǎn)故障是指一旦某一點(diǎn)出現(xiàn)故障就會(huì)導(dǎo)致整個(gè)系統(tǒng)架構(gòu)的不可用)
在Linux主機(jī)上,以daemon(守護(hù)進(jìn)程)方式實(shí)現(xiàn)了vrrp協(xié)議,并提供了完成配置ipvs規(guī)則及實(shí)現(xiàn)相應(yīng)real server狀態(tài)檢測(cè)能力。
能調(diào)用外部腳本
輕量靈活,不能解決腦裂問題
適用場(chǎng)景:ipvs, haproxy, nginx(reverse proxy)
Keepalived 是一個(gè)基于VRRP協(xié)議來實(shí)現(xiàn)的LVS服務(wù)高可用方案,可以利用其來避免單點(diǎn)故障。
一個(gè)LVS服務(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ù),從而保證了高可用性,Keepalived是VRRP的完美實(shí)現(xiàn)。
2、Keepalived組件
keepalived是模塊化設(shè)計(jì),不同模塊負(fù)責(zé)不同的功能。
core:keepalived的核心,負(fù)責(zé)主進(jìn)程的啟動(dòng)和維護(hù),全局配置文件的加載解析等;
check:負(fù)責(zé)healthchecker(健康檢查),包括了各種健康檢查方式,以及對(duì)應(yīng)的配置文件的解析;
vrrp:VRRPD子進(jìn)程,用來實(shí)現(xiàn)VRRP協(xié)議;
libipfwc:iptables(ipchains)庫,配置LVS;
libipvs*:配置LVS;
3、keepalived進(jìn)程
keepalived啟動(dòng)后會(huì)有三個(gè)進(jìn)程:
父進(jìn)程:內(nèi)存管理,子進(jìn)程管理等等
子進(jìn)程:VRRP子進(jìn)程
子進(jìn)程:healthchecker子進(jìn)程
兩個(gè)子進(jìn)程都被系統(tǒng)WatchDog看管,兩個(gè)子進(jìn)程各自負(fù)責(zé)自己的事,
healthchecker子進(jìn)程負(fù)責(zé)檢查各自服務(wù)器的健康程度,如果healthchecker子進(jìn)程檢查到MASTER上服務(wù)不可用了,就會(huì)通知本機(jī)上的兄弟VRRP子進(jìn)程,讓他刪除通告,并且去掉虛擬IP,轉(zhuǎn)換為BACKUP狀態(tài)。
三、keepalived安裝與配置
1、安裝keepalived
[root@BAIYU_180 html]# yum install keepalived -y
[root@BAIYU_180 html]# rpm -ql keepalived
/etc/keepalived
/etc/keepalived/keepalived.conf
/etc/rc.d/init.d/keepalived
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/sbin/keepalived
/usr/share/doc/keepalived-1.2.7
2、keepalived配置
keepalived配置文件/etc/keepalived/keepalived.conf分為三個(gè)部分:
global_defs: 全局配置
vrrp_instance: vrouter的配置
lvs: ipvs相關(guān)配置
(1)查看/etc/keepalived/keepalived.conf
[root@BAIYU_180 keepalived]# cat keepalived.conf ! Configuration File for keepalivedglobal_defs { #全局配置 notification_email { #報(bào)警郵件發(fā)送給誰 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #通知郵件的發(fā)件人郵箱 smtp_server 192.168.200.1 #郵件服務(wù)器地址 smtp_connect_timeout 30 #件服務(wù)器連接的超時(shí)時(shí)間 router_id LVS_DEVEL #機(jī)器標(biāo)識(shí)}vrrp_instance VI_1 { #vroute標(biāo)識(shí) state MASTER #當(dāng)前節(jié)點(diǎn)的狀態(tài) 主節(jié)點(diǎn) interface eth0 #發(fā)送vip通告的接口 virtual_router_id 51 #虛擬路由的ID號(hào),是虛擬路由MAC的最后一位地址 priority 100 #此節(jié)點(diǎn)的優(yōu)先級(jí),主節(jié)點(diǎn)的優(yōu)先級(jí)需要比其他節(jié)點(diǎn)高 advert_int 1 #vip通告的時(shí)間間隔 authentication { #認(rèn)證配置 auth_type PASS #認(rèn)證機(jī)制,默認(rèn)是明文 auth_pass 1111 #隨機(jī)字符當(dāng)密碼 } virtual_ipaddress { #vip 192.168.100.41 192.168.200.17 192.168.200.18 }}
###########################################只要以上的配置,把下面的都注釋就可以實(shí)現(xiàn)
簡單高可用(此時(shí)只能實(shí)現(xiàn)主機(jī)故障|網(wǎng)絡(luò)故障|keepalived進(jìn)程停止時(shí)vip轉(zhuǎn)移,或者通過腳本實(shí)現(xiàn)其它服務(wù)的切換)
virtual_server 192.168.200.100 443 { #集群所使用的VIP和端口 delay_loop 6 lb_algo rr #使用的負(fù)載均衡算法 lb_kind NAT #類型 nat_mask 255.255.255.0 persistence_timeout 50 #持久連接時(shí)間 protocol TCP #使用的協(xié)議 real_server 192.168.201.100 443 { #節(jié)點(diǎn)服務(wù)器使用的IP及端口 weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } }}virtual_server 10.10.10.2 1358 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP sorry_server 192.168.200.200 1358 real_server 192.168.200.2 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.3 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } }}virtual_server 10.10.10.3 1358 { delay_loop 3 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.200.4 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.5 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } }}
(2)配置文件中指令詳解
vip的配置
virtual_ipaddress { <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> 廣播地址 設(shè)備 作用域 別名 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 }
如果有其它資源可用于做為主備節(jié)點(diǎn)角色判斷的標(biāo)準(zhǔn),可以通過如下配置實(shí)現(xiàn):
vrrp_script. NAME { #先定義一個(gè)腳本 }vrrp_instance NAME{ track_script. { #再調(diào)用 } }
示例:
vrrp_script. chk_mt_down { script. "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 #監(jiān)控間隔時(shí)間 weight -15 #當(dāng)健康檢查腳本失敗后,主機(jī)權(quán)重將會(huì)-15 fall 2 #失敗次數(shù) rise 1 #成功數(shù)次 }vrrp_instance NAME{ track_script. { chk_mt_down } }
這個(gè)腳本實(shí)現(xiàn)了手動(dòng)將節(jié)點(diǎn)在MASTER和BACKUP之間切換而不用關(guān)閉節(jié)點(diǎn)|關(guān)閉節(jié)點(diǎn)的網(wǎng)絡(luò)|節(jié)點(diǎn)上的keepalived,
電腦資料
《vrrp與keepalived詳解》(http://www.zwdianwu.cn)。四、雙主模式配置實(shí)例
定義2個(gè)路由,互為主備
適用于前端調(diào)度器(LB)的高可用,2個(gè)公網(wǎng)ip,在DNS做2條A記錄,還實(shí)現(xiàn)了一定程度上的負(fù)載均衡,任何一個(gè)調(diào)度器掛了也不影響客戶訪問,
180節(jié)點(diǎn):
[root@BAIYU_180 keepalived]# cat keepalived.conf! Configuration File for keepalivedglobal_defs { notification_email { xxj@192.168.100.180 } notification_email_from xiexiaojun smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL}vrrp_script. chk_mt_down {script. "[ -f /etc/keepalived/down ] && exit 1 || exit 0"interval 1weight -15 }vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass vi111 } virtual_ipaddress { 192.168.100.41 }track_script. {chk_mt_down}}vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 52 priority 90 advert_int 1 authentication { auth_type PASS auth_pass vi222 } virtual_ipaddress { 192.168.100.51 }track_script. {chk_mt_down}}
179節(jié)點(diǎn):
[root@BAIYU_179 keepalived]# cat keepalived.conf! Configuration File for keepalivedglobal_defs { notification_email { xxj@192.168.100.180 } notification_email_from xiexiaojun smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL}vrrp_script. chk_mt_down {script. "[ -f /etc/keepalived/down ] && exit 1 || exit 0"interval 1weight -15}vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass vi111 } virtual_ipaddress { 192.168.100.41 }track_script. {chk_mt_down}}vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass vi222 } virtual_ipaddress { 192.168.100.51 }track_script. {chk_mt_down}}