Keepalived 是一款輕量級HA集羣應用,它的設計初衷是爲了作LVS集羣的HA,即探測LVS健康狀況,從而進行主備切換,不只如此,還可以探測LVS代理的後端主機的健康情況,動態修改LVS轉發規則。 前端
當LVS進行主備切換的時候,對外提供服務的IP是如何作到切換的呢?這就依賴於keepalived 所應用的vrrp協議,即Virtual Reduntant Routing Protocol,虛擬冗餘路由協議。簡單來說,此協議是將IP設置在虛擬接口之上,根據必定的規則實現IP在物理主機上流動,即哪臺主機能夠佔有該IP。node
並且keepalived具備腳本調用接口,可經過腳本完成拓展功能。linux
默認爲搶佔式。當優先級高的主機恢復正常狀態時,將奪回IP,從新成爲MASTER。 nginx
這樣兩臺主機,能經過兩個對外IP同時工做。即主主模式。 web
本文演示的環境爲centos7.2。keepalived軟件安裝,配置好yum源,軟件包已在base倉庫中收錄。後端
# yum install keepalived 安裝便可 centos
TOP HIERACHY安全
演示前說明: 服務器
2臺centos7.2 主機:node-00,node-01網絡
VIP1:10.1.38.19預約node-00佔有
VIP2:10.1.38.20 預約node-01佔有
2臺主機安裝好keepalived以後,開始編輯配置文件
node-00的配置以下
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost #定義來信人 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node-00 vrrp_mcast_group4 224.0.38.12 } vrrp_instance VI_1 { state MASTER interface team0 virtual_router_id 38 priority 100 advert_int 1 authentication { auth_type PASS auth_pass x1er44q } virtual_ipaddress { 10.1.38.19/16 dev team0 } smtp_alert #狀態切換,使用郵件通知 } vrrp_instance VI_2 { state BACKUP interface team0 virtual_router_id 39 priority 97 advert_int 1 authentication { auth_type PASS auth_pass x1er44q } virtual_ipaddress { 10.1.38.20/16 dev team0 } smtp_alert }
複製要把備註刪掉
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node-01 vrrp_mcast_group4 224.0.38.12 } vrrp_instance VI_1 { state BACKUP interface bond0 virtual_router_id 38 priority 97 advert_int 1 authentication { auth_type PASS auth_pass x1er44q } virtual_ipaddress { 10.1.38.19/16 dev bond0 } smtp_alert } vrrp_instance VI_2 { state MASTER interface bond0 virtual_router_id 39 priority 100 advert_int 1 authentication { auth_type PASS auth_pass x1er44q } virtual_ipaddress { 10.1.38.20/16 dev bond0 } smtp_alert }
配置完成後,啓動服務
#systemctl start keepalived
使用ip命令查看ip地址狀況
#ip address show
node-00狀況
node-01狀況
此時,咱們模擬node-00宕機,將node-00的keepalived服務停掉,那麼10.1.38.19此ip會流動到node-01上
#systemctl stop keepalived
至此此部分演示完畢。
虛擬服務器:
配置結構:
virtual_server IP port 或者virtual_server fwmark int
{
...
real_server {
...
}
...
}
經常使用參數:
delay_loop <INT>:服務輪詢的時間間隔;
lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調度方法;
lb_kind NAT|DR|TUN:集羣的類型;
persistence_timeout <INT>:定向調度時長;
protocol TCP:服務協議,僅支持TCP;
sorry_server <IPADDR> <PORT>:備用服務器地址;當後端主機都失敗時,由此主機提供友好提示頁面。
real_server <IPADDR> <PORT>
{
weight <INT>
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING>
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定義當前主機的健康狀態檢測方法;
}
HTTP_GET|SSL_GET {
url {
path <URL_PATH>:定義要監控的URL;
status_code <INT>:判斷上述檢測機制爲健康狀態的響應碼;
digest <STRING>:判斷上述檢測機制爲健康狀態的響應的內容的校驗碼;
}
nb_get_retry <INT>:重試次數;
delay_before_retry <INT>:重試以前的延遲時長;
connect_ip <IP ADDRESS>:向當前RS的哪一個IP地址發起健康狀態檢測請求
connect_port <PORT>:向當前RS的哪一個PORT發起健康狀態檢測請求
bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
connect_timeout <INTEGER>:鏈接請求的超時時長;
}
TCP_CHECK {
connect_ip <IP ADDRESS>:向當前RS的哪一個IP地址發起健康狀態檢測請求
connect_port <PORT>:向當前RS的哪一個PORT發起健康狀態檢測請求
bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
connect_timeout <INTEGER>:鏈接請求的超時時長;
}
演示說明:
node-00,node-01 做爲ipvs主機,作HA。對外服務IP爲10.1.38.15,即VIP。
node-02,node-03 做爲後端主機,提供web服務。
node-02 IP:10.1.38.13
node-03 IP:10.1.38.14
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node-00 vrrp_mcast_group4 224.0.38.12 } vrrp_instance VI_1 { state MASTER interface team0 virtual_router_id 38 priority 100 advert_int 1 authentication { auth_type PASS auth_pass x1er44q } virtual_ipaddress { 10.1.38.15/16 dev team0 } smtp_alert } virtual_server 10.1.38.15 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 10.1.38.13 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 10.1.38.14 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } }
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node-01 vrrp_mcast_group4 224.0.38.12 } vrrp_instance VI_1 { state BACKUP interface bond0 virtual_router_id 38 priority 97 advert_int 1 authentication { auth_type PASS auth_pass x1er44q } virtual_ipaddress { 10.1.38.15/16 dev bond0 } smtp_alert } virtual_server 10.1.38.15 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 10.1.38.13 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } real_server 10.1.38.14 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } }
兩臺後端主機作好lvs dr模式集羣設置,並開啓web服務。啓動ipvs兩臺主機keepalived服務。
一切正常狀況下,此時node-00擁有VIP,使用其餘主機來訪問 10.1.38.15
測試1:
#for i in {1..6};do curl 10.1.38.15;done
輪詢調度正常。
測試2:
停掉node-00 keepalived服務,模擬宕機,測試冗餘性
正常結果仍是正常輪詢的。
測試3:
兩臺ipvs主機正常運行,停掉node-02上web服務,模擬後端主機宕機,測試keepalived動態調整後端主機列表功能
測試結果,前端調度器只將服務調度至node-03上。
再將node-02 web服務啓動,再測試
結果顯示恢復正常輪詢,至此keepalived動態調整能力測試完畢。
其實以上結果,再ipvs主機直接查看lvs規則也可看出
#ipvsadm -Ln
再學習一個新知識,腳本調用
分兩步:(1) 先定義一個腳本;(2) 調用此腳本;
vrrp_script <SCRIPT_NAME> {
script "" #定義一個斷定語句,若是退出狀態碼爲非0,則執行減優先級操做。
interval INT #測試間隔
weight -INT #下降優先級,是其釋放VIP全部權
}
track_script {
SCRIPT_NAME_1 #檢測的腳本列表
SCRIPT_NAME_2
...
}
演示說明:
node-00,node-01 爲nginx服務器,代理後端web服務器,使用keepalived作HA集羣。
node-02,node-03 爲後端web服務器。
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node-00 vrrp_mcast_group4 224.0.38.12 } vrrp_script check_ngx { #腳本在引用前定義好 script "killall -0 nginx " #探測nginx服務是否正常 interval 1 weight -5 } vrrp_instance VI_1 { state MASTER interface team0 virtual_router_id 38 priority 100 advert_int 1 authentication { auth_type PASS auth_pass x1er44q } virtual_ipaddress { 10.1.38.15/16 dev team0 } track_script { #在路由實例中引用自定義腳本 check_ngx } smtp_alert }
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node-01 vrrp_mcast_group4 224.0.38.12 } vrrp_script check_ngx { script "killall -0 nginx" interval 1 weight -5 } vrrp_instance VI_1 { state BACKUP interface bond0 virtual_router_id 38 priority 97 advert_int 1 authentication { auth_type PASS auth_pass x1er44q } virtual_ipaddress { 10.1.38.15/16 dev bond0 } track_script { check_ngx } smtp_alert }
node-00,node-01 啓動nginx服務,並已設置好代理兩臺後端web服務器;啓動keepalived 服務。
node-02,node-03 啓動web服務。
若是配置正確,會有如下結果。
測試1:使用另外一臺主機訪問VIP,輪詢響應結果正常,VIP在node-00。
測試2:中止node-00 nginx服務,模擬nginx服務異常,訪問VIP,輪詢響應結果正常,VIP在node-01。
測試3:恢復node-00 nginx 服務,VIP 流動回 node-00上。