KeepAlived(三):vrrp實例故障轉移(keepalived+haproxy)


keepalived使用腳本進行健康檢查時的相關配置項。例如keepalived+haproxy實現haproxy的高可用。

keepalived分為vrrp實例的心跳檢查和后端服務的健康檢查。如果要配置后端服務,則后端服務只能是LVS。但vrrp能獨立於lvs存在,例如keepalive結合haproxy、mysql等服務實現它們的高可用。

  1. vrrp實例的心跳檢查(lvs,haproxy,mysql...)
    • (1).除了LVS,vrrp只能通過腳本來實現vrrp的健康檢查,並通過vrrp實例腳本結束keepalived進程來中斷該實例的心跳通告。此時virtual server部分的配置需省略。
    • (2).對於LVS,無需使用任何腳本,因為所有keepalived節點會同時對后端服務進行健康檢查,並同時從LVS規則中剔除下線的服務。如果所有后端服務都不健康,那就沒有必要切換keepalived。
  2. 后端RS的健康檢查(只能是LVS)
    • (1).一般采用TCP_CHECK、HTTP_GET、SSL_GET進行健康檢查。
    • (2).但也能自寫腳本進行后端服務的健康檢查,這種模式稱為MISC_CHECK。

以下是從man keepalived中截取的通過腳本進行心跳檢查、健康檢查時的相關配置選項。man介紹的比較簡單,更詳細的配置說明可參考:https://github.com/acassen/keepalived/blob/master/doc/keepalived.conf.SYNOPSIS

VRRP script(s)
    # 定義一個vrrp腳本,后續vrrp組或vrrp實例要執行某腳本時,需要從此處引用
    # 注意,所有vrrp實例都會監控腳本的退出狀態碼
    vrrp_script <SCRIPT_NAME> {
       script <STRING>|<QUOTED-STRING> # 要執行的命令或腳本路徑
       interval <INTEGER>              # 腳本調用時間間隔,默認1秒
       timeout <INTEGER>               # 腳本執行等待超時時長,超過該時長,表示腳本執行失敗
       weight <INTEGER:-254..254>      # 根據該權重值調整vrrp實例優先級值,默認值為0
       rise <INTEGER>                  # 需要成功多少次,vrrp才進行角色狀態切換(從fault切換為正常)
       fall <INTEGER>                  # 需要失敗多少次,vrrp才進行角色狀態切換(從正常切換為fault)
       user USERNAME [GROUPNAME]       # 腳本執行身份,group默認同username
       init_fail                       # 假定腳本初始化時就處於失敗狀態
    }

VRRP synchronization group(s)
    # 分別表示切換為主/備/出錯(例如監控的eth0壞了)時所執行的腳本。
    # 要為腳本傳遞參數時,使用引號包圍整個腳本和參數
    notify_master /path/to_master.sh [username [groupname]]
    notify_backup /path/to_backup.sh [username [groupname]]
    notify_fault "/path/fault.sh VG_1" [username [groupname]]

    # notify表示只要狀態切換都會調用的腳本,且該腳本是在以上三個腳本執行之后再調用的,
    # keepalived會自動傳遞四個參數,因此不要手動為腳本傳遞參數。
    # $1 = "GROUP"|"INSTANCE"
    # $2 = vrrp組名稱或vrrp實例名
    # $3 = 切換的目標狀態(MASTER/BACKUP/FAULT)
    # $4 = 優先級數值(priority value)
    notify /path/notify.sh [username [groupname]]


VRRP instance(s)部分

    # 監控接口,當某接口down掉時,切換為fault狀態
    track_interface {
      eth0
      eth1
      eth2 weight <-254..254>
      ...
    }

    # 監控腳本,即執行vrrp_script定義的腳本
    track_script {
        <SCRIPT_NAME>
        <SCRIPT_NAME> weight <-254..254>
    }

    # notify_master/backup/fault/stop分別表示切換為主、備、出錯(例如監控的eth0壞了)、vrrp停止時所執行的腳本
    # 要為腳本傳遞參數時,使用引號包圍整個腳本和參數
    notify_master <STRING>|<QUOTED-STRING> [username [groupname]]
    notify_backup <STRING>|<QUOTED-STRING> [username [groupname]]
    notify_fault <STRING>|<QUOTED-STRING> [username [groupname]]
    notify_stop <STRING>|<QUOTED-STRING> [username [groupname]]   # executed when stopping vrrp

    # notify表示只要狀態切換都會調用的腳本,並且該腳本是在以上三個腳本執行之后再調用的
    notify <STRING>|<QUOTED-STRING> [username [groupname]]



Virtual server(s)部分

    # 投票被選舉成功或失敗時執行的腳本
    quorum_up <STRING>|<QUOTED-STRING>
    quorum_down <STRING>|<QUOTED-STRING>

    real_server <IPADDR> <PORT>
       {
           # 當健康檢查的后端rs上線、下線時執行的腳本
           notify_up <STRING>|<QUOTED-STRING>
           notify_down <STRING>|<QUOTED-STRING>

           # MISC健康檢查類型,該類型通過自定義腳本來檢查后端健康狀況
           MISC_CHECK
           {
               # 執行哪個腳本來判斷后端是否健康
               misc_path <STRING>|<QUOTED-STRING>
               # Script execution timeout
               misc_timeout <INT>

               # 指定一個隨機延遲時間,防止同時檢查所有后端,指定為0時表示禁止該功能。
               # 默認啟動該功能,默認最大間隔為delay_loop的值。
               warmup <INT>

               # 如果指定該選項,則根據健康檢查腳本的退出狀態碼動態調整權重值
               # 退出狀態碼為:
               # 0:表示檢查成功,不做任何權重修改
               # 1:表示檢查失敗
               # 2-255:表示檢查成功,但權重值減2,例如(狀態碼為255,則設置權重為253)
               misc_dynamic

               # 指定運行后端健康檢查腳本的身份,不指定group時將默認使用username
               user USERNAME [GROUPNAME]
           }
       }
    }

例如,在keepalived+haproxy時。

vrrp_script check_haproxy {
        script"/etc/keepalived/chk_haproxy.sh"
        interval 2
        weight 2
    }

global_defs {
        router_id haproxy1
    }

vrrp_instanceVI_1 {
        state MASTER
        interface eth0 virtual_router_id 150 priority 50 advert_int 1 authentication {
            auth_type PASS
            auth_pass 1111
        }

virtual_ipaddress{
        192.168.1.201
    }
track_script {
        check_haproxy
    }
}

其中check_haproxy的腳本/etc/keepalived/chk_haproxy.sh內容如下:

#!/bin/bash 
if ! killall -0 haproxy &>/dev/null;then
    serivce haproxy restart
    sleep 1
    if ! killall -0 haproxy &>/dev/null;then
        service keepalived stop
    fi
fi

另外一種方式,直接在vrrp_script處定義要執行的命令,而不是使用一個額外的腳本來監控對象。例如:


vrrp_script check_haproxy {
        script "killall -0 haproxy"  # 此行改變
        interval 2
        weight 2
    }
 
global_defs {
        router_id haproxy1
    }
 
vrrp_instanceVI_1 {
        state MASTER
        interface eth0
        virtual_router_id 150
        priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
 
virtual_ipaddress{
        192.168.1.201
    }
track_script {
        check_haproxy
    }
}

上面的vrrp_script配置中,每兩秒檢查一次haproxy進程是否存在,連續檢查fall <int>次數后都不存在就進入fault狀態,由於沒有指定fall <int>,所以一次檢查失敗就進入fault。

其實通過腳本控制比較復雜,因為要考慮腳本的返回值(不是退出狀態碼)。當然,如果直接像前面示例一樣在腳本中直接進行restart、stop等操作也是可以的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM