1·VRRP協議基本原理介紹
Keepalived實現的基礎是VRRP協議,我們將會在這一節中簡要介紹VRRP協議的基本原理
1.1 協議
vRRP協議是爲消除在靜態缺省路由環境下的缺省路由器單點故障引起的網絡失效而設計的主備模式的協議,使得在發生故障而進行設備功能切換時可以不影響內外數據通信,不需要再修改內部網絡的網絡參數。VRRP協議具有IP地址備份,優先路由選擇,減少不必要的路由器間通信等功能。
VRRP協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP(一個或多個),而在路由器組內部,如果實際擁有這個對外IP的路由器能夠工作正常的話就是MASTER, MASTER實現針對虛擬路由器IP的各種網絡功能,如ARP請求,ICMP,以及數據的轉發等;其他設備不擁有該IP,狀態是BACKUP,除了接收MASTER的VRRP狀態通告信息外,不執行對外的網絡功能。當主機失效時,BACKUP將接管原先MASTER的網絡功能。
配置VRRP協議時需要配置每個路由器的虛擬路由器ID(VRID)和優先權值,使用VRID將路由器進行分組,具有相同VRID值的路由器爲同一個組,VRID是一個0~255的正整數;同一組中的路由器通過使用優先權值來選舉MASTER,優先權大者爲MASTER,優先權也是一個0~255的正整數。
VRRP協議使用多播數據來傳輸VRRP數據,VRRP數據使用特殊的虛擬源MAC地址發送數據而不是自身網卡的MAC地址,VRRP運行時只有MASTER路由器定時發送VRRP通告信息,表示MASTER工作正常以及虛擬路由器IP(組),BACKUP只接收VRRP數據,不發送數據,如果一定時間內沒有接收到MASTER的通告信息,各BACKUP將宣告自己成爲MASTER,發送通告信息,重新進行MASTER選舉狀態。
1.2 MASTER選舉
如果對外的虛擬路由器IP就是路由器本身配置的IP地址的話,該路由器始終都是MASTER;否則如果不具備虛擬IP的話,將進行MASTER選舉,各路由器都宣告自己是MASTER,發送VRRP通告信息;如果收到其他機器的發來的通告信息的優先級比自己高,將轉回BACKUP狀態;如果優先級相等的話,將比較路由器的實際IP,IP值較大的優先權高;不過如果對外的虛擬路由器IP就是路由器本身的IP的話,該路由器始終將是MASTER,這時的優先級值爲255。
2、Keepalived內部原理
2.1 Keepalived組件
keepalived是模塊化設計,不同模塊負責不同的功能。
core:keepalived的核心,負責主進程的啓動和維護,全局配置文件的加載解析等;
check:負責healthchecker(健康檢查),包括了各種健康檢查方式,以及對應的配置文件的解析;
vrrp:VRRPD子進程,用來實現VRRP協議;
2.2 Keepalived進程
keepalived啓動後會有三個進程:
父進程:內存管理,子進程管理等等
子進程:VRRP子進程
子進程:healthchecker子進程
兩個子進程都被系統WatchDog看管,兩個子進程各自負責自己的事,healthchecker子進程負責檢查各自服務器的健康程度,如果healthchecker子進程檢查到MASTER上服務不可用了,就會通知本機上的兄弟VRRP子進程,讓他刪除通告,並且去掉虛擬IP,轉換爲BACKUP狀態。
3·keepalived雙主配置詳解
3.1 keepalived安裝
yum -y install keepalived
3.2 keepalived 雙主配置
A主機配置 global_defs { router_id a_nginx #主機標識 } vrrp_script chk_http_port { script "/etc/keepalived/check_nginx.sh" #檢測腳本 interval 2 } vrrp_instance a_nginx_vip01 { state MASTER #身份未master interface bond1 #網卡 virtual_router_id 180 #虛擬路由的id priority 100 #優先級 advert_int 1 #同步狀態檢查的時間間隔 authentication { #配置授權,方式爲明文密碼 auth_type PASS auth_pass wangpu123 } virtual_ipaddress { #配置vip的地址 10.16.16.206/20 } unicast_src_ip 10.16.16.12 #關閉組播,使用單播通信,源ip爲10.16.16.12 unicast_peer { #對端ip爲10.16.16.13 10.16.16.13 } track_script { #檢測腳本 chk_http_port } } vrrp_instance a_nginx_vip02 { state BACKUP interface bond1 virtual_router_id 181 priority 99 advert_int 1 authentication { auth_type PASS auth_pass wangpu123 } virtual_ipaddress { 10.16.16.207/20 } unicast_src_ip 10.16.16.12 unicast_peer { 10.16.16.13 } track_script { chk_http_port } } B主機配置 global_defs { router_id b_nginx } vrrp_script chk_http_port { script "/etc/keepalived/check_nginx.sh" interval 2 } vrrp_instance a_nginx_vip01 { state BACKUP interface bond1 virtual_router_id 180 priority 99 advert_int 1 authentication { auth_type PASS auth_pass wangpu123 } virtual_ipaddress { 10.16.16.206/20 } unicast_src_ip 10.16.16.13 unicast_peer { 10.16.16.12 } track_script { chk_http_port } } vrrp_instance a_nginx_vip02 { state MASTER interface bond1 virtual_router_id 181 priority 100 advert_int 1 authentication { auth_type PASS auth_pass wangpu123 } virtual_ipaddress { 10.16.16.207/20 } unicast_src_ip 10.16.16.13 unicast_peer { 10.16.16.12 } track_script { chk_http_port } }
健康檢查的腳本如下
check_nginx.sh
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
echo "`date +%Y-%m-%d-%H:%M:%S` nginx: master process fail" >>/data/log/check_keepalived.log
/etc/init.d/keepalived stop
else
echo "`date +%Y-%m-%d-%H:%M:%S` nginx: master process success" >>/data/log/check_keepalived.log
echo "nginx is running"
fi
3.3 結果驗證
A主機
B主機