keepalived簡介與工作原理
Keepalived的作用是檢測服務器的狀態,如果有一台web服務器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常后Keepalived自動將服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。
keepalived工作在IP/TCP協議棧的IP層,TCP層,及應用層,工作原理基於VRRP協議。
網絡層(layer 3):Keepalived會定期向服務器群中的服務器發送一個ICMP的數據包,(既我們平時用的Ping程序),如果發現某台服務的IP地址沒有激活,Keepalived便報告這台服務器失效,並將它從服務器群中剔除。
傳輸層(layer 4):Keepalived以TCP端口的狀態來決定服務器工作正常與否,如web server的服務端口一般是80,如果Keepalived檢測到80端口沒有啟動,則Keepalived將把這台服務器從服務器群中剔除。
應用層(layer 5):只要針對應用上的一些探測方式,如URL的get請求,或者對nginx腳本檢測等;可以根據用戶自定義添加腳本針對特定的服務進行狀態檢測,當檢測結果與用戶設定不一致,則把這台服務器從服務器群中剔除。
VRRP協議與工作原理
VRRP(Virtual Router Redundancy Protocol)虛擬路由冗余協議是一種容錯的主備模式的協議,當網絡設備發生故障時,可以不影響主機之間通信情況下進行設備切換,並且相對用戶時切換過程時透明的。
路由器開啟VRRP功能后,會根據優先級確定自己在備份組中的角色。優先級高的路由器成為主用路由器,優先級低的成為備用路由器。主用路由器擁有虛擬IP與虛擬MAC,實現各種網絡功能,並發送VRRP通告報文,通知備用路由器組內的其他路由器自己工作正常;備用路由器則啟動定時器等待通告報文。搶占模式下,當備用路由器收到VRRP通告報文后,會將自己的優先級與通告報文中的優先級進行比較。如果大於通告報文中的優先級,則成為主用路由器;否則將保持備用狀態。非搶占模式下,只要主用路由器不發生故障,就算備用路由器的優先級再高,也始終保持備用狀態。如果備用路由器的定時器超時后仍未收到主用路由器發送來的VRRP通告報文,則認為主用路由器已經無法正常工作,備份組內的路由器根據優先級選舉出主用路由器。
- 一個VRRP路由器有唯一的標識:VRID,范圍為0—255。該路由器對外表現為唯一的虛擬MAC地址,地址的格式為00-00-5E-00-01-[VRID]。
- 同一台路由器可以加入多個備份組,在不同備份組中有不同的優先級,使得該路由器可以在一個備份組中作為主用路由器,在其他的備份組中作為備用路由器。
- 提供了兩種安全認證措施:明文認證和IP頭認證。
VRRP選舉機制
- 虛擬IP擁有者,如果某台路由器的IP地址與虛擬路由器的VIP地址一致,那么這台就會被選為主用路由器。
- 優先級較高者,如果沒有虛擬IP擁有者,優先級數值大的路由器會被選舉出,優先級范圍0~255。
- IP地址較大者,如果優先級一樣高,IP地址數值大的路由器會被選舉出。
keepalived配置組成
global_defs是對全局一些參數做出設置。
global_defs { notification_email { # 接受郵件地址 sysadmin@firewall.loc } notification_email_from master@keepalived.com # 郵件頭地址 smtp_server 192.168.200.1 # 郵件服務smtp地址 smtp_connect_timeout 30 # smtp連接超時時間 router_id LVS_DEVEL # 本地機器的id,可以為本地主機名 vrrp_skip_check_adv_addr # 檢查收到的通告中的所有地址會非常耗時,設置此參數就不會檢查收到過的主路由器的通告 vrrp_strict # 嚴格遵守VRRP協議,開啟這個功能會在iptables中添加下面一條規則,導致VIP ping不通 # Chain INPUT (policy ACCEPT) # target prot opt source destination # DROP all -- 0.0.0.0/0 172.30.100.200 vrrp_garp_interval 0 # 一個網卡上每組gratuitous arp消息之間的延遲時間,默認為0 vrrp_gna_interval 0 # 一個網卡上每組na消息之間的延遲時間,默認為0 vrrp_iptables # 設置此項則不會開啟任何iptables規則 vrrp_mcast_group4 224.0.0.18 # 主備間通告狀態信息的組播地址,通常為224網段 }
vrrp_script只是定義一個對集群服務的健康狀態檢測腳本,並根據監控的結果狀態能實現優先動態調整;這種方式在做高可用nginx或者haproxy時需要用到。
vrrp_script chk_nginx { script # 添加要定期執行的檢測腳本,它的退出代碼將被記錄在監視它的所有VRRP實例中 interval 2 # 兩次腳本調用的間隔,默認為1秒 weight -20 # 如果檢測條件成立,權重-20 }
vrrp_instance是虛擬路由實例的配置段,用來定義當前keepalived節點的運行角色為主或是備,定義當前節點的優先級,設置虛擬IP等信息。
vrrp_instance VI_1 { # 定義虛擬路由器,實例名稱VI_1主備必須相同 state MASTER # 定義此節點為MASTER interface eth0 # 綁定為當前虛擬路由器使用的物理接口 virtual_router_id 51 # 設置虛擬路由id,范圍0~255,主備必須相同 priority 100 # 設置此節點優先級 advert_int 1 # 設置主備節點間vrrp通告狀態的時間間隔 authentication { # 設置主備間驗證方式 auth_type PASS auth_pass 1111 } virtual_ipaddress { # 設置虛擬路由VIP 172.30.200.1 } track_script { # 添加監控腳本,腳本名為vrrp_script中定義的腳本 chk_nginx } }
virtual_server中定義了LVS工作模式及調度算法等信息,real_server則是定義后端的真實服務器。
virtual_server 172.30.200.1 80 { # 定義虛擬主機IP與端口 delay_loop 6 # 健康狀態檢測時間間隔 lb_algo rr # lvs調度算法 lb_kind NAT # lvs工作類型 persistence_timeout 50 # lvs持久連接超時時間 protocol TCP # 定義服務協議 sorry_server 172.30.10.14 80 # 當后端所有主機不可達時,就會被定義這台主機,只是為了展示sorry頁面 real_server 172.30.10.12 80 { # 配置后端主機 weight 1 # 調度權重 HTTP_GET { # 應用層檢測 url { path /testurl/test.jsp # 定義被檢測的URL status_code 200 # 判斷上述URL健康狀態的響應碼 digest 640205b7b0fc66c1ea91c463fac6334d # 判斷上述URL健康狀態的內容的hash碼 } connect_timeout 3 # 檢測連接的超時時間 nb_get_retry 3 # 重試次數 delay_before_retry 3 # 重試前等待時間 } TCP_CHECK { connect_ip 172.30.10.12 # 選擇要連接的IP地址。默認值為realserver IP connect_port 80 # 選擇要連接的端口。默認值為realserver PORT bindto 172.30.10.11 # 用於發起連接的可選源地址 bind_port 10000 # 用於發起連接的可選源端口 connect_timeout 3 # 連接超時時間 } } real_server 172.30.10.12 80 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }