一、Vrrp協(xié)議
1、VRRP 協(xié)議簡介
vrrp: Virtual Redundent Routing Protocol (虛擬冗余路由協(xié)議)
在現(xiàn)實的網(wǎng)絡(luò)環(huán)境中,兩臺需要通信的主機大多數(shù)情況下并沒有直接的物理連接,
vrrp與keepalived詳解
。對于這樣的情況,它們之間路由怎樣選擇?主機如何選定到達目的主機的下一跳路由?這個問題通常的解決方法有二種:
在主機上使用動態(tài)路由協(xié)議(RIP、OSPF等)
在主機上配置靜態(tài)路由
很明顯,在主機上配置動態(tài)路由是非常不切實際的,因為管理、維護成本以及是否支持等諸多問題。配置靜態(tài)路由就變得十分流行,但路由器|默認網(wǎng)關(guān)|default gateway卻經(jīng)常成為單點故障。
VRRP的目的就是為了解決靜態(tài)路由單點故障問題,VRRP通過競選(election)協(xié)議來動態(tài)的將路由任務(wù)交給LAN中虛擬路由器中的某臺VRRP路由器。
2、VRRP 工作機制
在一個VRRP虛擬路由器中,有多臺物理的VRRP路由器,但是這多臺的物理的機器并不能同時工作,而是由一臺稱為MASTER的負責路由工作,其它的都是BACKUP,MASTER并非一成不變,VRRP讓每個VRRP路由器參與競選,最終獲勝的就是MASTER。MASTER擁有虛擬路由器的IP地址,我們的主機就是用這個IP地址作為靜態(tài)路由的,MASTER要負責轉(zhuǎn)發(fā)發(fā)送給網(wǎng)關(guān)地址的包和響應(yīng)ARP請求。
VRRP通過競選協(xié)議來實現(xiàn)虛擬路由器的功能,所有的協(xié)議報文都是通過IP多播(multicast)包形式發(fā)送的。虛擬路由器由VRID(范圍0-255)和一組IP地址組成,對外表現(xiàn)為一個周知的MAC地址。所以,在一個虛擬路由 器中,不管誰是MASTER,對外都是相同的MAC和IP(稱之為VIP)?蛻舳酥鳈C并不需要因為MASTER的改變而修改自己的路由配置,對客戶端來說,這種主從的切換是透明的。
在一個虛擬路由器中,只有作為MASTER的VRRP路由器會一直發(fā)送VRRP通告信息(VRRPAdvertisement message),BACKUP不會搶占MASTER,除非它的優(yōu)先級(priority)更高。當MASTER不可用時(BACKUP收不到通告信息), 多臺BACKUP中優(yōu)先級最高的這臺會被搶占為MASTER。這種搶占是非?焖俚(<1s),以保證服務(wù)的連續(xù)性。由于安全性考慮,VRRP包使用了加密協(xié)議進行加密。
3、相關(guān)術(shù)語
虛擬路由器:由一個 Master 路由器和多個 Backup 路由器組成。主機將虛擬路由器當作默認網(wǎng)關(guān)。
VRID:虛擬路由器的標識。有相同 VRID 的一組路由器構(gòu)成一個虛擬路由器。
Master 路由器:虛擬路由器中承擔報文轉(zhuǎn)發(fā)任務(wù)的路由器。
Backup 路由器:Master 路由器出現(xiàn)故障時,能夠代替 Master 路由器工作的路由器。
虛擬 IP 地址:虛擬路由器的 IP 地址。一個虛擬路由器可以擁有一個或多個IP 地址。
IP 地址擁有者:接口 IP 地址與虛擬 IP 地址相同的路由器被稱為 IP 地址擁有者。
虛擬 MAC 地址:一個虛擬路由器擁有一個虛擬 MAC 地址。虛擬 MAC 地址的格式為 00-00-5E-00-01-{VRID}。通常情況下,虛擬路由器回應(yīng) ARP 請求
使用的是虛擬 MAC 地址,只有虛擬路由器做特殊配置的時候,才回應(yīng)接口的真實 MAC 地址。
priority(優(yōu)先級):VRRP 根據(jù)優(yōu)先級來確定虛擬路由器中每臺路由器的地位。
搶占方式(默認):如果 Backup 路由器工作在搶占方式下,當它收到 VRRP 報文后,會將自己的優(yōu)先級與通告報文中的優(yōu)先級進行比較。如果自己的優(yōu)先級比當前的 Master 路由器的優(yōu)先級高,就會主動搶占成為 Master 路由器;否則,將保持 Backup 狀態(tài)。
非搶占方式:如果 Backup 路由器工作在非搶占方式下,則只要 Master 路由器沒有出現(xiàn)故障,Backup 路由器即使隨后被配置了更高的優(yōu)先級也不會成為
Master 路由器。
4、VRRP 工作流程
(1).初始化:
路由器啟動時,如果路由器的優(yōu)先級是255(最高優(yōu)先級,路由器擁有路由器地址),要發(fā)送VRRP通告信息,并發(fā)送廣播ARP信息通告路由器IP地址對應(yīng)的MAC地址為路由虛擬MAC,設(shè)置通告信息定時器準備定時發(fā)送VRRP通告信息,轉(zhuǎn)為MASTER狀態(tài);否則進入BACKUP狀態(tài),設(shè)置定時器檢查定時檢查是否收到MASTER的通告信息。
(2).Master
設(shè)置定時通告定時器;
用VRRP虛擬MAC地址響應(yīng)路由器IP地址的ARP請求;
轉(zhuǎn)發(fā)目的MAC是VRRP虛擬MAC的數(shù)據(jù)包;
如果是虛擬路由器IP的擁有者,將接受目的地址是虛擬路由器IP的數(shù)據(jù)包,否則丟棄;
當收到shutdown的事件時刪除定時通告定時器,發(fā)送優(yōu)先權(quán)級為0的通告包,轉(zhuǎn)初始化狀態(tài);
如果定時通告定時器超時時,發(fā)送VRRP通告信息;
收到VRRP通告信息時,如果優(yōu)先權(quán)為0,發(fā)送VRRP通告信息;否則判斷數(shù)據(jù)的優(yōu)先級是否高于本機,或相等而且實際IP地址大于本地實際IP,設(shè)置定時通告定時器,復位主機超時定時器,轉(zhuǎn)BACKUP狀態(tài);否則的話,丟棄該通告包;
(3).Backup
設(shè)置主機超時定時器;
不能響應(yīng)針對虛擬路由器IP的ARP請求信息;
丟棄所有目的MAC地址是虛擬路由器MAC地址的數(shù)據(jù)包;
不接受目的是虛擬路由器IP的所有數(shù)據(jù)包;
當收到shutdown的事件時刪除主機超時定時器,轉(zhuǎn)初始化狀態(tài);
主機超時定時器超時的時候,發(fā)送VRRP通告信息,廣播ARP地址信息,轉(zhuǎn)MASTER狀態(tài);
收到VRRP通告信息時,如果優(yōu)先權(quán)為0,表示進入MASTER選舉;否則判斷數(shù)據(jù)的優(yōu)先級是否高于本機,如果高的話承認MASTER有效,復位主機超時定時器;否則的話,丟棄該通告包;
5、ARP查詢處理
當內(nèi)部主機通過ARP查詢虛擬路由器IP地址對應(yīng)的MAC地址時,MASTER路由器回復的MAC地址為虛擬的VRRP的MAC地址,而不是實際網(wǎng)卡的 MAC地址,這樣在路由器切換時讓內(nèi)網(wǎng)機器覺察不到;而在路由器重新啟動時,不能主動發(fā)送本機網(wǎng)卡的實際MAC地址。如果虛擬路由器開啟的ARP代理 (proxy_arp)功能,代理的ARP回應(yīng)也回應(yīng)VRRP虛擬MAC地址。
6、認證方式與工作模式
認證方式:
簡單字符認證
md5認證
工作模式:
master-backup模式
master-master模式
二、Keepalived
1、Keepalived 定義
什么是Keepalived呢?
觀其名可知保持存活在網(wǎng)絡(luò)里面就是保持在線了也就是所謂的高可用或熱備用來防止單點故障(單點故障是指一旦某一點出現(xiàn)故障就會導致整個系統(tǒng)架構(gòu)的不可用)
在Linux主機上,以daemon(守護進程)方式實現(xiàn)了vrrp協(xié)議,并提供了完成配置ipvs規(guī)則及實現(xiàn)相應(yīng)real server狀態(tài)檢測能力。
能調(diào)用外部腳本
輕量靈活,不能解決腦裂問題
適用場景:ipvs, haproxy, nginx(reverse proxy)
Keepalived 是一個基于VRRP協(xié)議來實現(xiàn)的LVS服務(wù)高可用方案,可以利用其來避免單點故障。
一個LVS服務(wù)會有2臺服務(wù)器運行Keepalived,一臺為主服務(wù)器(MASTER),一臺為備份服務(wù)器(BACKUP),但是對外表現(xiàn)為一個虛擬IP,主服務(wù)器會發(fā)送特定的消息給備份服務(wù)器,當備份服務(wù)器收不到這個消息的時候,即主服務(wù)器宕機的時候, 備份服務(wù)器就會接管虛擬IP,繼續(xù)提供服務(wù),從而保證了高可用性,Keepalived是VRRP的完美實現(xiàn)。
2、Keepalived組件
keepalived是模塊化設(shè)計,不同模塊負責不同的功能。
core:keepalived的核心,負責主進程的啟動和維護,全局配置文件的加載解析等;
check:負責healthchecker(健康檢查),包括了各種健康檢查方式,以及對應(yīng)的配置文件的解析;
vrrp:VRRPD子進程,用來實現(xiàn)VRRP協(xié)議;
libipfwc:iptables(ipchains)庫,配置LVS;
libipvs*:配置LVS;
3、keepalived進程
keepalived啟動后會有三個進程:
父進程:內(nèi)存管理,子進程管理等等
子進程:VRRP子進程
子進程:healthchecker子進程
兩個子進程都被系統(tǒng)WatchDog看管,兩個子進程各自負責自己的事,
healthchecker子進程負責檢查各自服務(wù)器的健康程度,如果healthchecker子進程檢查到MASTER上服務(wù)不可用了,就會通知本機上的兄弟VRRP子進程,讓他刪除通告,并且去掉虛擬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分為三個部分:
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 { #報警郵件發(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ù)器連接的超時時間 router_id LVS_DEVEL #機器標識}vrrp_instance VI_1 { #vroute標識 state MASTER #當前節(jié)點的狀態(tài) 主節(jié)點 interface eth0 #發(fā)送vip通告的接口 virtual_router_id 51 #虛擬路由的ID號,是虛擬路由MAC的最后一位地址 priority 100 #此節(jié)點的優(yōu)先級,主節(jié)點的優(yōu)先級需要比其他節(jié)點高 advert_int 1 #vip通告的時間間隔 authentication { #認證配置 auth_type PASS #認證機制,默認是明文 auth_pass 1111 #隨機字符當密碼 } virtual_ipaddress { #vip 192.168.100.41 192.168.200.17 192.168.200.18 }}
###########################################只要以上的配置,把下面的都注釋就可以實現(xiàn)
簡單高可用(此時只能實現(xiàn)主機故障|網(wǎng)絡(luò)故障|keepalived進程停止時vip轉(zhuǎn)移,或者通過腳本實現(xiàn)其它服務(wù)的切換)
virtual_server 192.168.200.100 443 { #集群所使用的VIP和端口 delay_loop 6 lb_algo rr #使用的負載均衡算法 lb_kind NAT #類型 nat_mask 255.255.255.0 persistence_timeout 50 #持久連接時間 protocol TCP #使用的協(xié)議 real_server 192.168.201.100 443 { #節(jié)點服務(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é)點角色判斷的標準,可以通過如下配置實現(xiàn):
vrrp_script. NAME { #先定義一個腳本 }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)控間隔時間 weight -15 #當健康檢查腳本失敗后,主機權(quán)重將會-15 fall 2 #失敗次數(shù) rise 1 #成功數(shù)次 }vrrp_instance NAME{ track_script. { chk_mt_down } }
這個腳本實現(xiàn)了手動將節(jié)點在MASTER和BACKUP之間切換而不用關(guān)閉節(jié)點|關(guān)閉節(jié)點的網(wǎng)絡(luò)|節(jié)點上的keepalived,
電腦資料
《vrrp與keepalived詳解》(http://www.szmdbiao.com)。四、雙主模式配置實例
定義2個路由,互為主備
適用于前端調(diào)度器(LB)的高可用,2個公網(wǎng)ip,在DNS做2條A記錄,還實現(xiàn)了一定程度上的負載均衡,任何一個調(diào)度器掛了也不影響客戶訪問,
180節(jié)點:
[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é)點:
[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}}