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