天天看點

高可用服務之Keepalived利用腳本實作服務的可用性檢測

高可用服務之Keepalived利用腳本實作服務的可用性檢測

對于高可用nginx或haproxy這類在使用者空間有監聽端口和程序的服務來說,如果用keepalived做高可用,我們需要考慮到我們高可用的服務是否正常可用,進而實作在服務不正常的情況下,把對應的VIP能夠遷移到其他節點;為了實作能夠檢測到高可用的服務是否正常,keepalived提供了調用外部腳本的接口,讓我們配置對高可用的服務做可用性檢測;根據我們定義的腳本,keepalived會周期性的去執行我們的定義的腳本,根據腳本執行退出碼判斷服務是否可用,一旦發生服務不可用,或者可用性檢測不通過,它就會觸發目前keepalived節點的優先級降低,進而實作目前節點在通告優先級時,觸發備份節點接管VIP,進而實作VIP轉移,服務的高可用;

  上一篇部落客要聊到了keepalived高可用LVS叢集的相關配置,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13659428.html;keepalived高可用LVS叢集是Keepalived的設計之初的功能,是以它高可用LVS叢集内置了對LVS的RS的健康狀态檢測,自動生成IPVS規則;我們知道LVS是Linux核心功能,本質上在使用者空間不會監聽任何端口,它的主要作用是對使用者請求的流量做4層排程,是以對于這種沒有程序,沒有端口資訊的服務我們怎麼去判斷它是否正常就先得尤為重要;同樣的道理對于高可用nginx或haproxy這類在使用者空間有監聽端口和程序的服務來說,如果用keepalived做高可用,我們需要考慮到我們高可用的服務是否正常可用,進而實作在服務不正常的情況下,把對應的VIP能夠遷移到其他節點;為了實作能夠檢測到高可用的服務是否正常,keepalived提供了調用外部腳本的接口,讓我們配置對高可用的服務做可用性檢測;根據我們定義的腳本,keepalived會周期性的去執行我們的定義的腳本,根據腳本執行退出碼判斷服務是否可用,一旦發生服務不可用,或者可用性檢測不通過,它就會觸發目前keepalived節點的優先級降低,進而實作目前節點在通告優先級時,觸發備份節點接管VIP,進而實作VIP轉移,服務的高可用;

  在keepalived的配置檔案中,我們可以用vrrp_script {...} 來定義我們可以執行的腳本相關資訊;用track_script {..}在對應vrrp執行個體中調用vrrp_script定義的腳本;

  示例:利用腳本對LVS做可用性檢測

  1、編寫腳本

[root@node01 keepalived]# ls
check_lvs.sh  keepalived.conf  keepalived.conf.bak  notify.sh
[root@node01 keepalived]# chmod a+x check_lvs.sh 
[root@node01 keepalived]# ll
total 16
-rwxr-xr-x 1 root root   98 Sep 13 22:26 check_lvs.sh
-rw-r--r-- 1 root root 1611 Sep 13 22:24 keepalived.conf
-rw-r--r-- 1 root root 3598 Sep  8 23:29 keepalived.conf.bak
-rwxr-xr-x 1 root root  472 Sep 10 13:58 notify.sh
[root@node01 keepalived]# cat check_lvs.sh 
#!/bin/bash
ping -c 2 192.168.0.1 &> /dev/null
if [ $? -eq 0 ];then
    exit 0
else
    exit 1
fi
[root@node01 keepalived]# 
      

  提示:以上腳本主要是利用ping 192.168.0.1這個位址來判斷推出碼是0還是1,正常退出時0,非正常退出為1;

  2、配置keepalived調用上面的腳本,并在VIP所在執行個體中引用;

  提示:以上配置表示定義了一個腳本,名為check_LVS(這個名稱可以任意起,主要起辨別作用,後面在執行個體中引用的一個辨別);這個腳本執行時間間隔為每2秒執行一次,逾時時長為2秒,如果腳本執行失敗(退出碼非0)就把對應節點的優先級降低20(通常這個降低的值要大于兩節點優先級之差就行,意思就是降低後的優先級要小于備份節點優先級,這樣才有意義);腳本執行連續3次檢測都為成功狀态(腳本退出碼都為0),則keepalived就标記該執行個體為OK狀态,并會一直檢測下去,如果連續3次檢查都為失敗狀态(退出碼非0),則标記對應執行個體為KO狀态;一旦标記對應執行個體為失敗狀态就會觸發目前節點的優先級降低;進而在通告心跳時,會通告降低後的優先級,進而實作備份節點接管VIP來完成vip轉移;

  完整的keepalived配置

高可用服務之Keepalived利用腳本實作服務的可用性檢測
高可用服務之Keepalived利用腳本實作服務的可用性檢測
[root@node01 keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from node01_keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node01
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.12.132
}

vrrp_script check_LVS {
    script "/etc/keepalived/check_lvs.sh"
    interval 2
    timeout 2
    weight -20
    rise 3
    fall 3
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.0.111/24 brd 192.168.0.255 dev ens33 label ens33:1
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault  "/etc/keepalived/notify.sh fault"
    track_script {
        check_LVS
    }
}

virtual_server 192.168.0.111 80 {
        delay_loop 3
        lb_algo wrr
        lb_kind DR
        protocol TCP
        sorry_server 127.0.0.1 80

        real_server 192.168.0.43 80 {
                weight 1
                nb_get_retry 2
                delay_before_retry 2
                connect_timeout 30
                HTTP_GET {
                    url {
                    path /index.html
                    status_code 200
                    }
                }
        }
        real_server 192.168.0.44 80 {
                weight 1
                nb_get_retry 2
                delay_before_retry 2
                connect_timeout 30
                HTTP_GET {
                    url {
                    path /index.html
                    status_code 200
                    }
                }
        }
}

[root@node01 keepalived]#       

View Code

  提示:vrrp_script中的script可以是腳本路徑,也可以是一段指令;

  驗證:重新開機keepalived,修改腳本中的IP位址,模拟故障,故意讓其對指定位址ping不通,看看對應vip是否會從master節點飄逸到備份節點?對應節點的優先級是否有變化?

  未修改腳本時,vip在node01上

  修改腳本以後

  提示:修改腳本以後對應的VIP就沒有在node01上了;

  檢視node01上keepalived的日志資訊,看看它是如何故障轉移的

  提示:從日志檔案可以看到,當keepalived周期性去執行check_lvs.sh腳本時,連續3次都執行失敗,就觸發了動态調整目前節點所在keepalived的優先級,把原來優先級為100調整至80,然後通告自己的心跳資訊時,又觸發了備份節點通告自己的優先級資訊,對應主節點收到高于它的優先級通告,是以它就自動轉換成backup狀态,并删除了VIP;然後後續也在每隔2秒檢測一次腳本執行否正常;

  在node02上檢視vip是否存在?

  通路VIP看看服務是否可通路?

  提示:可以看到對應使用者通路還是可以正常通路;

  驗證:修改腳本為正常可通信位址,看看對應節點是否會重新轉換為master角色呢?對應vip是否會漂移回來呢?

高可用服務之Keepalived利用腳本實作服務的可用性檢測

  提示:可看到修改腳本以後,對應vip就回來了;

  檢視keepalived的日志

  提示:可以看到當腳本執行成功以後,首先會觸發目前節點的優先級還原為原有優先級,并通告出去,然後把目前節點從backup角色轉換為master角色,接管VIP;

  以上示例主要用于對那種高可用服務在使用者空間沒有監聽端口,沒有程序,我們需要借助某種機制去判讀該服務是否正常,比如上面我們利用ping某個ip位址去判斷LVS是否正常,進而來決定對應節點的優先級是否調整,進而來決定vip是否轉移;當然對于在使用者空間有監聽端口,有程序的服務也是同樣的套路,我們可以利用腳本去檢測端口是否存在,或者對應程序是否正常來決定VIP是否轉移;

  示例:keepalived利用腳本來檢測nginx程序是否正常,進而來實作對nginx的高可用

   1、編寫腳本

  提示:以上腳本利用killall指令對nginx程序發送0号信号,去判斷對應的nginx程序是否存在,如果存在該指令會傳回0,否則傳回非0;利用指令的傳回值來确定腳本退出碼;

  2、在keepalived的配置檔案中定義腳本相關參數,并在vrrp執行個體中引用定義的腳本資訊

高可用服務之Keepalived利用腳本實作服務的可用性檢測
高可用服務之Keepalived利用腳本實作服務的可用性檢測
高可用服務之Keepalived利用腳本實作服務的可用性檢測
[root@node01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from node01_keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node01
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_iptables
   vrrp_garp_interval 0
   vrrp_gna_interval 0
   vrrp_mcast_group4 224.0.12.132
}

vrrp_script check_LVS {
    script "/etc/keepalived/check_lvs.sh"
    interval 2
    timeout 2
    weight -20
    rise 3
    fall 3
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    timeout 2
    weight -20
    rise 3
    fall 3
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.0.111/24 brd 192.168.0.255 dev ens33 label ens33:1
    }
    notify_master "/etc/keepalived/notify.sh master"
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_fault  "/etc/keepalived/notify.sh fault"
    track_script {
        check_LVS
        check_nginx
    }
}
[root@node01 ~]#       

  提示:vrrp_script需要定義在執行個體之外,表示引用一段上下文來定義腳本相關資訊;定義了腳本資訊,如果不在執行個體中引用,它是不會周期性的去執行腳本,隻有在執行個體中引用的腳本名稱以後(這裡的名稱是vrrp_script後面的名稱)才會使對應的腳本周期性的去執行;

  在node01和node02上安裝nginx

yum install nginx -y
      

  提供測試頁面

高可用服務之Keepalived利用腳本實作服務的可用性檢測
高可用服務之Keepalived利用腳本實作服務的可用性檢測

  重新開機keepalived 和nginx

systemctl restart nginx keepalived.service 
      
高可用服務之Keepalived利用腳本實作服務的可用性檢測
高可用服務之Keepalived利用腳本實作服務的可用性檢測

  提示:可以看到重新開機nginx和keepalived以後,在node01上有VIP和80端口,在node02上沒有vip,但80端口處于監聽狀态;如果此時有使用者通路vip,就會由node01上的nginx提供響應;

  驗證:用浏覽器通路vip,看看響應的内容是否是我們在node01上提供的測試頁面?

高可用服務之Keepalived利用腳本實作服務的可用性檢測

  驗證:把node01上的nginx停掉,看看對應的服務是否還可通路?

高可用服務之Keepalived利用腳本實作服務的可用性檢測

  提示:可以看到把node01上的nginx停掉以後,對應的vip也就随之被删除;

  再次通路vip看看是否會有響應?

高可用服務之Keepalived利用腳本實作服務的可用性檢測

  提示:可以看到現在通路vip響應的頁面内容變成了node02上nginx提供的測試頁面;說明現在是由node02上的nginx在提供服務;

  到此keepalived高可用nginx的配置就完成了,至于nginx怎麼工作,是否為排程器,這裡的keepalived并不關心,它隻關心nginx程序是否正常;對于keepalived高可用其他服務,思路都是類似的,不同的是對于不同的服務,檢測腳本可能有所不同;

作者:Linux-1874

出處:https://www.cnblogs.com/qiuhom-1874/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.

繼續閱讀