1、簡介
Keepalived:高可用或熱備軟件,用來防止單點故障(單點故障是指一旦某一點出現故障就會導致整個系統架構不可用)的發生,keepalived就是VRRP協議的實現。
2、原理
keepalived采用是模塊化設計,不同模塊實現不同的功能,keepalived主要有三個模塊,分別是core、check和vrrp。 core:是keepalived的核心,負責主進程的
啟動和維護,全局配置文件的加載解析等 check: 負責healthchecker(健康檢查),包括了各種健康檢查方式,以及對應的配置的解析包括LVS的配置解析;
可基於腳本檢查對IPVS后端服務器健康狀況進行檢查。 vrrp:VRRPD子進程,VRRPD子進程就是來實現VRRP協議的,以上是主要組件;下面是其他庫: libipfwc:iptables/ipchains庫,配置LVS會用到 libipvs*:配置LVS會用到,注意,keepalived和LVS完全是兩碼事,各司其職相互配合。
3、架構圖
Keepalived啟動后會有三個進程:
父進程:內存管理,子進程管理等等
子進程:vrrpd子進程
子進程:healthchecker子進程
由上圖可知,兩個子進程都被系統WatchDog看管,兩個子進程各自實現自己的事,healthchecker子進程實現檢查各自服務器的健康程度,例如HTTP,LVS等等,如果healthchecker子進程檢查到MASTER上服務不可用,就會通知本機上的兄弟VRRP子進程,讓他刪除通告,並且去掉虛擬IP,轉換為BACKUP狀態
4、工作原理
keepalived是一個類似於layer3, 4 & 5交換機制的軟件,也就是第3層、第4層和第5層交換,分別工作在IP/TCP協議棧的IP層、TCP層、應用層,原理分別如下:Layer3: Keepalived使用Layer3的方式工作式時,Keepalived會定期向服務器群中的服務器發送一個ICMP的數據包(既Ping),如果發現某台服務的IP地址沒有激活,Keepalived便報告這台服務器失效,並將它從服務器群中剔除(這種情況的典型例子是某台服務器被非法關機)。Layer3方式是以服務器的IP地址是否有效作為服務器工作正常與否的標准。 Layer4: Layer4主要以TCP端口的狀態來決定服務器工作正常與否。如web server的服務端口一般是80,如果Keepalived檢測到80端口沒有啟動,則Keepalived將把這台服務器從服務器群中剔除。
Layer5: Layer5就是工作在具體的應用層了,比Layer3,Layer4要復雜,在網絡上占用的帶寬也要大一些。Keepalived將根據用戶的設定檢查服務器相應服務是否運行正常,如果沒有正常運行,則Keepalived將把服務器從服務器群中剔除。
5、vrrp協議介紹
VRRP協議簡介
在現實的網絡環境中,兩台需要通信的主機大多數情況下並沒有直接的物理連接。對於這樣的情況,它們之間路由怎樣選擇?主機如何選定到達目的主機的下一跳路由,這個問題通常的解決方法有二種:
在主機上使用動態路由協議(RIP、OSPF等)
在主機上配置靜態路由
很明顯,在主機上配置動態路由是非常不切實際的,因為管理、維護成本以及是否支持等諸多問題。配置靜態路由就變得十分流行,但路由器(或者說默認網關default gateway)卻經常成為單點。
VRRP的目的就是為了解決靜態路由單點故障問題。
VRRP通過一競選(election)協議來動態的將路由任務交給LAN中虛擬路由器中的某台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),以保證服務的連續性。
6、配置文件keepalived.conf 的介紹
#全局定義模塊 ! Configuration File for keepalived global_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 #此處注意router_id為負載均衡標識,在局域網內應該是唯一的,建議使用機器名。 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } #VRRP實例定義塊 vrrp_instance VI_1 { state MASTER #狀態只有MASTER和BACKUP兩種,並且要大寫,MASTER為工作狀態,BACKUP是備用狀態。 interface eth0 lvs_sync_daemon_inteface eth0 #這個默認沒有,相當於心跳線接口,DR模式用的和上面的接口一樣,也可以用機器上的其他網卡eth1,用來防止腦裂。 virtual_router_id 51 #虛擬路由標識,同一個vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。 priority 100 #優先級,同一個vrrp_instance的MASTER優先級必須比BACKUP高。 advert_int 1 #MASTER 與BACKUP 負載均衡器之間同步檢查的時間間隔,單位為秒。 authentication { auth_type PASS #驗證authentication。包含驗證類型和驗證密碼。類型主要有PASS、AH 兩種,通常使用的類型為PASS, auth_pass 1111 據說AH 使用時有問題。驗證密碼為明文,同一vrrp 實例MASTER 與BACKUP 使用相同的密碼才能正常通信。 } virtual_ipaddress { #虛擬ip地址,可以有多個地址,每個地址占一行,不需要子網掩碼,同時這個ip 必須與我們在lvs 客戶端設定的vip 相一致! 192.168.200.100 192.168.200.101 192.168.200.102 } } #虛擬服務器定義塊 virtual_server 192.168.200.100 443 { #虛擬IP,來源與上面的虛擬IP地址,后面加空格加端口號 delay_loop 6 #健康檢查間隔,單位為秒 lb_algo rr #負載均衡調度算法,一般用wrr、rr、wlc lb_kind NAT #負載均衡轉發規則。一般包括DR,NAT,TUN 3種。 persistence_timeout 50 #會話保持時間,會話保持,就是把用戶請求轉發給同一個服務器,不然剛在1上提交完帳號密碼,就跳轉到另一台服務器2上了。 protocol TCP #轉發協議,有TCP和UDP兩種,一般用TCP,沒用過UDP。 real_server 192.168.201.100 80 { #真實服務器,包括IP和端口號 weight 1 #權重,數值越大,權重越高 TCP_CHECK { #通過tcpcheck判斷RealServer的健康狀態 connect_timeout 3 #連接超時時間 nb_get_retry 3 #重連次數 delay_before_retry 3 #重連時間間隔 connect_port 80 #檢測端口 } } }