一、簡介
目前主流實現web網站及數據庫服務高可用軟件包括:keepalived、heartbeat、corosync,cman;高可用簡稱HA;
官方站點:https://www.keepalived.org/
1、keepalived主要功能
對RealServer進行健康狀態檢查,支持3層、4層、7層協議進行健康檢查;並支持VRRP冗余協議,所以keepalived兩個功能是監控檢查,VRRP冗余協議;
2、keepalived的作用
檢查web服務器的狀態,如果有一台web服務器/mysql服務器宕機或故障,keepalived將故障節點從系統中剔除,當故障恢復的時候自動加入服務器集群中,非常智能化,只需要手動修復壞的節點即可。
3、keepalived的layer3、4、7層分別是IP層、傳輸層、應用層的實現原理如下:
1)、layer3:keepalived定期向集群中服務器發送ICMP的包,如果發現哪台ping不通,便報告這台服務器失效,並將其剔除集群;(判斷標准為IP是否有效)
2)、layer4:主要以TCP端口(也可以是udp)狀態來決定服務器工作是否正常,如web服務器的80端口如果沒有工作,則將其剔除集群(判斷標准為端口)
3)、layer7:應用層,keepalived將根據用戶的設定,檢查服務器程序的運行是否正常,如果不是設定值,則將其剔除集群(判斷標准為程序是否正常)
二、keepalived VRRP原理
1、學習keepalived,必須了解VRRP協議的原理,因為keepalived是VRRP的完美實現,那什么是VRRP那?VRRP(虛擬路由冗余協議)最早是為了解決網關的點單故障的路由協議,在主機上如何選定到達目的的下一跳路由,這個問題通常解決方案是,動態路由協議RIP,OSPF;再有就是靜態路由協議,主機中實現動態路由協議非常不實際,管理,開銷,維護等諸多問題,因此通常是配置靜態路由協議,但是路由器或網管就經常出現單點,VRRP就是解決此靜態路由單點問題,VRRP通過競選協議來動態交給LAN中的虛擬路由器中的某台VRRP路由器。
2、VRRP虛擬路由器集群中,由多台物理機組成,但是並不是同時工作,而是由master負載路由工作,其他都是backup,master也不是一成不變,VRRP會讓每個VRRP路由參與競選最終優先的就是master。
3、master的特權是擁有虛擬路由器的IP地址,即VIP,負責轉發給網關地址的包和響應ARP請求。
4、VRRP通過競選來實現虛擬路由器的功能,所有協議報文都是通過IP多播包(多播地址224.0.0.18)發送的,虛擬路由器有VRID(0~255)和一組IP地址組成,對外表現為一個mac地址,所以一組虛擬路由器集群中,不管誰是master,對外都是一個相同mac和VIP,客戶端沒有感知。
5、master的VRRP路由器會一直發送VRRP廣播包,backup不會搶占master,除非優先級(priority)更高,當master不可用時(backup收不到廣播包),多台backup中優先級最高的這台會搶占master,搶占是非常快速的,並且VRRP包還使用了加密協議進行傳輸。
6、keepalived基於VRRP將兩台主機當做路由器,組成虛擬路由器集群,master高的主機產生VIP,該VIP負責轉發用戶發起的IP包或請求
三、keepalive架構模型
一個父進程兩個子進程
為了確保健壯及穩定性,守護進程被分為3個不同的進程,父進程負責fork和監控子進程,因此父進程也稱為watchdog,涼餓子進程,一個負責VRRP,另一個負責健康檢查,每個進程都有自己的I/O多路復用器,這樣可以優化VRRP調度抖動,因為VRRP比健康檢查更重要,兩個子進程開啟本地套接字Unix Domain Socket,當keepalive啟動后,父進程通過unix domain socket每隔5s發送一個hello消息給子進程,如果父進程無法發送消息給子進程,將認為子進程出現問題,於是重啟子進程。watchdog這種設計的兩個好處是,第一父進程發送給遠程子進程的hello數據包是通過I/O多路復用程序完成的,這樣他就可以在子調度框架中檢測死循環,第二是使用sysV信號檢測dead children。
架構圖:
解釋:
userspace 用戶空間
kernelspace 內核空間
checker組件:負責RS健康狀態檢查,並在LVS拓撲中移除、添加,支持layer3/4/7的協議檢查,該組件使用獨立的子進程負責,但被父進程監控。這個組件就是實現健康檢查(TCP\HTTP\SSL\MISC......)
VRRP stack:提供director的故障轉移功能從而實現director的高可用,該組件可獨立提供功能,無需LVS支持,也是獨立的子進程負責,父進程監控,vrrp stact就是vrrp的實現,比如vrrp協議調用。
system call組件:提供抓取自定義腳本的功能,該組件在使用時,將臨時產生一個子進程來執行任務,支持系統調用機制,做出管理操作。
IPVS wrapper組件:負責將配置文件中IPVS相關規則發送到內核的IPVS模塊,就是生產ipvs規則的。
netlink reflector:用來設定,監控vrrp的vip地址,負責交互,VRRP借助於netlink健康網絡,實現網絡功能配置。
schedule-I/O Multiplexer:並發控制。
memory mngt:內存管理。
control plane configuration file parser:配置文件,分析的主控工具。
watch dog:可以理解為高可用監視器。
四、keepalived配置文件
vim /etc/keepalived/keepalived.conf
2 ! Configuration File for keepalived 3 4 global_defs { #全局部分定義郵件報警系統 5 notification_email { #定義郵件發送目標 6 acassen@firewall.loc 7 failover@firewall.loc 8 sysadmin@firewall.loc 9 } 10 notification_email_from Alexandre.Cassen@firewall.loc #定義郵件發送人 11 smtp_server 192.168.200.1 #指定smtp服務器地址 12 smtp_connect_timeout 30 #指定smtp連接超時時間 13 router_id LVS_DEVEL #表示keepalived服務器的字符串,局域網內是唯一的高可用需要使用它標識節點 14 vrrp_skip_check_adv_addr #默認是不跳過檢查,檢查收到的VRRP通過中的所有地址可能會比較耗時,設置此命令的意思是,如果通告於接收的上一個通過來自相同的master路由器,則不執行檢查,也就是跳過檢查。 15 vrrp_strict #嚴格嬦VRRP協議,阻止keepalived啟動有幾種情況,1沒有vip,2單播鄰居,3在VRRP版本2中有ipv6地址 16 vrrp_garp_interval 0 #在一個接口發送的兩個arp之間的延遲,可以是毫米級 17 vrrp_gna_interval 0 18 } 19#定義VRRP實例,一個配置文件可以有多例,不同主機之間互為主備,實例名稱應該一致。 20 vrrp_instance VI_1 { 21 state MASTER #定義角色狀態,是master/backup 22 interface eth0 #定義網卡 23 virtual_router_id 51 #定義虛擬路由標識VRID,主備應該相同 24 priority 100 #定義優先級 25 advert_int 1 #心跳時間1s 26 authentication { #認證方式一個實例中必須完全一致 27 auth_type PASS 28 auth_pass 1111 #最多8個字符 29 } 30 virtual_ipaddress { #設置VIP,主備相同,可以使用dev選項來指定接口,如果需要ifconfig查看,需要在ip地址后加上label,可以是多個VIP 31 192.168.200.16 32 192.168.200.17 33 192.168.200.18 34 } 35 } 36 #定義虛擬服務部分 37 virtual_server 192.168.200.100 443 { #虛擬服務器地址和端口空格隔開地址為VIP 38 delay_loop 6 #健康檢查間隔 39 lb_algo rr #定義負載均衡算法,這里是rr 40 lb_kind NAT #定義lvs模型 41 persistence_timeout 50 #持久會話保持時長 42 protocol TCP #監控服務的協議類型 43 44 real_server 192.168.201.100 443 { #定義rs部分,地址端口 45 weight 1 #lvs權重 46 SSL_GET { #監控檢查的方式,常見的有HTTP_GET/SSL_GET/TCP_CHECK/MISC_CHECK 47 url { 48 path / #指定ssl——get健康檢查路徑 49 digest ff20ad2481f97b1754ef3e12ecd3a9cc 50 } #健康狀態需要狀態碼,可以是status_code,digest,digest+status_code 51 url { #digest值用keepalived的genhash命令生產,一般使用status_code 52 path /mrtg/ 53 digest 9b3a0c85a887a256d6939da88aabd8cd 54 } 55 connect_timeout 3 #3s五響應就超時,就判斷為realserver不健康,需要重新連接 56 nb_get_retry 3 #標識重試3次,防誤傷 57 delay_before_retry 3 #重試間隔3s 58 } #總共12s才能判斷故障節點,可以改小點 59 } 60 } 61 62 virtual_server 10.10.10.2 1358 { #定義所有rs宕機時,有哪台服務器提供服務 63 delay_loop 6 #一般在keepalived給一個web頁面,提示維護等。 64 lb_algo rr 65 lb_kind NAT 66 persistence_timeout 50 67 protocol TCP 68 69 sorry_server 192.168.200.200 1358 70 71 real_server 192.168.200.2 1358 { 72 weight 1 73 HTTP_GET { 74 url { 75 path /testurl/test.jsp 76 digest 640205b7b0fc66c1ea91c463fac6334d 77 } 78 url { 79 path /testurl2/test.jsp 80 digest 640205b7b0fc66c1ea91c463fac6334d 81 } 82 url { 83 path /testurl3/test.jsp 84 digest 640205b7b0fc66c1ea91c463fac6334d 85 } 86 connect_timeout 3 87 nb_get_retry 3 88 delay_before_retry 3 89 } 90 } 91 92 real_server 192.168.200.3 1358 { 93 weight 1 94 HTTP_GET { 95 url { 96 path /testurl/test.jsp 97 digest 640205b7b0fc66c1ea91c463fac6334c 98 } 99 url { 100 path /testurl2/test.jsp 101 digest 640205b7b0fc66c1ea91c463fac6334c 102 } 103 connect_timeout 3 104 nb_get_retry 3 105 delay_before_retry 3 106 } 107 } 108 } 109 110 virtual_server 10.10.10.3 1358 { 111 delay_loop 3 112 lb_algo rr 113 lb_kind NAT 114 persistence_timeout 50 115 protocol TCP 116 117 real_server 192.168.200.4 1358 { 118 weight 1 119 HTTP_GET { 120 url { 121 path /testurl/test.jsp 122 digest 640205b7b0fc66c1ea91c463fac6334d 123 } 124 url { 125 path /testurl2/test.jsp 126 digest 640205b7b0fc66c1ea91c463fac6334d 127 } 128 url { 129 path /testurl3/test.jsp 130 digest 640205b7b0fc66c1ea91c463fac6334d 131 } 132 connect_timeout 3 133 nb_get_retry 3 134 delay_before_retry 3 135 } 136 } 137 138 real_server 192.168.200.5 1358 { 139 weight 1 140 HTTP_GET { 141 url { 142 path /testurl/test.jsp 143 digest 640205b7b0fc66c1ea91c463fac6334d 144 } 145 url { 146 path /testurl2/test.jsp 147 digest 640205b7b0fc66c1ea91c463fac6334d 148 } 149 url { 150 path /testurl3/test.jsp 151 digest 640205b7b0fc66c1ea91c463fac6334d 152 } 153 connect_timeout 3 154 nb_get_retry 3 155 delay_before_retry 3 156 } 157 } 158 }