Keepalived 是一款輕量級HA集群應用,它的設計初衷是為了做LVS集群的HA,即探測LVS健康情況,從而進行主備切換,不僅如此,還能夠探測LVS代理的后端主機的健康狀況,動態修改LVS轉發規則。
當LVS進行主備切換的時候,對外提供服務的IP是如何做到切換的呢?這就依賴於keepalived 所應用的vrrp協議,即Virtual Reduntant Routing Protocol,虛擬冗余路由協議。簡單來講,此協議是將IP設置在虛擬接口之上,根據一定的規則實現IP在物理主機上流動,即哪台主機可以占有該IP。
而且keepalived具有腳本調用接口,可通過腳本完成拓展功能。
1.Keepalived
術語:
默認為搶占式。當優先級高的主機恢復正常狀態時,將奪回IP,重新成為MASTER。
這樣兩台主機,能通過兩個對外IP同時工作。即主主模式。
組件:
HA Cluster的配置前提:
2.Keepalived配置前需要了解的事
本文演示的環境為centos7.2。keepalived軟件安裝,配置好yum源,軟件包已在base倉庫中收錄。
# yum install keepalived 安裝即可
程序環境:
配置文件組件部分:
TOP HIERACHY
配置語法:
3.Keepalived 雙主虛擬路由配置實例
演示前說明:
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 }
復制要把備注刪掉
node-01配置如下
! 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
至此此部分演示完畢。
4.Keepalived ipvs 高可用集群配置實例
同樣先科普的配置說明
虛擬服務器:
配置結構:
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
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.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 } } }
node-01 配置如下
! 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
5.Keepalived 做nginx 高可用集群配置實例
再學習一個新知識,腳本調用
keepalived調用外部的輔助腳本進行資源監控,並根據監控的結果狀態能實現優先動態調整;
分兩步:(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服務器。
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_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 }
node-01配置如下
! 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上。
完~