LVS - 使用用Keepalived實現健康檢查的示例

襲冷發表於2018-05-17
一、說明和準備

    Keepalived是基於VRRP協議實現的保證叢集高可用的一個服務軟體,執行在LVS之上,它的主要功能是實現真機的故障隔離及負載均衡器間的失敗切換,用來防止單點故障

    keepalived主要有三個模組,分別是core、check和vrrp。core模組為keepalived的核心,負責主程式的啟動、維護以及全域性配置檔案的載入和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模組是來實現VRRP協議的
    keepalived只有一個配置檔案keepalived.conf,裡面主要包括以下幾個配置區域,分別是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server

# 安裝IPVS管理模組
yum install ipvsadm -y
# 安裝keepalived
yum install keepalived -y


二、配置keepalived節點

! Configuration File for keepalived

# vi /etc/keepalived/keepalived.conf

# 全域性配置 主要是配置故障發生時的通知物件以及機器標識
global_defs {
    
    notification_email {
        r_xl@xl.com    # 設定報警郵件接收地址,需要開啟 sendmail 服務
    }
    
    notification_email_from s_xl@xl.com    # 設定郵件的傳送地址  
    smtp_server 192.168.2.241    # 設定通知的 SMTP Server 地址  
    smtp_connect_timeout 30      # 設定通知的 SMTP Server 的超時時間  
    
    router_id LVS_DEVEL_1        # 路由ID,標識本節點的字串,郵件通知時會用到
    
}

# 自定義VRRP例項健康檢查指令碼 keepalived只能做到對自身問題和網路故障的監控,Script可以增加其他的監控來判定是否需要切換主備
vrrp_script chk_sshd {

    script "killall -0 sshd"    # 示例為檢查sshd服務是否執行中

    interval 2         # 檢查間隔時間
    weight -4          # 檢查失敗降低的權重

}


# VRRP例項 定義對外提供服務的VIP區域及其相關屬性
vrrp_instance VI_1 {

    state MASTER           # 狀態只有 MASTER 和 BACKUP 兩種,並且要大寫,MASTER 為工作狀態,BACKUP 是備用狀態
    interface eth0         # 節點固有IP(非VIP)的網路卡,用來發VRRP包
    virtual_router_id 51   # 虛擬路由標識,同一個 vrrp_instance 的 MASTER 和 BACKUP 的 vitrual_router_id 需要一致
    priority 100           # 優先順序,同一個 vrrp_instance 的 MASTER 優先順序必須比 BACKUP 高
    advert_int 1           # MASTER 與 BACKUP 負載均衡器之間同步檢查的時間間隔,單位為秒

    authentication {       # 設定認證
        auth_type PASS     # 認證方式,支援 PASS 和 HA 
        auth_pass 1111     # 證密碼為明文,同一 vrrp 例項 MASTER 與 BACKUP 使用相同的密碼才能正常通訊
    }

    virtual_ipaddress {    # 虛擬IP地址(VIP),可以有多個地址,每個地址佔一行
        192.168.12.200
    }

    track_script {         # 自定義健康檢查指令碼
        chk_sshd           # 配置上面自定義的vrrp指令碼呼叫名
    }
}

# 設定虛擬伺服器
virtual_server 192.168.12.200 6500 {     # 指定虛擬IP地址和服務埠

    delay_loop 6             # 服務健康檢查週期,6秒
    lb_algo rr               # 負載均衡排程演算法,一般用wrr、rr、wlc
    lb_kind DR               # 負載均衡轉發規則。一般包括DR,NAT,TUN 3種
    persistence_timeout 5    # 會話保持時間。把使用者請求請求間隔在未超過保持時間時,一直分發到某個服務節點
    protocol TCP             # 轉發協議 有TCP和UDP兩種
    
    # 配置真實伺服器
    real_server 192.168.2.222 6500 {    #指定IP和埠
    
        weight 1       # 權重,數值越大,權重越高 
        
        # 健康檢查方式 常見有 TCP_CHECK, HTTP_GET, SSL_GET, MISC_CHECK(自定義指令碼)
        TCP_CHECK {               # 通過TcpCheck方式判斷RealServer的健康狀態
            connect_timeout 10    # 連線超時時間
            nb_get_retry 3        # 重連次數
            delay_before_retry 3  # 重連時間間隔
            connect_port 6500     # 檢測埠
        }
        
    }
    
    # 配置真實伺服器
    real_server 192.168.2.222 6500 {    #指定IP和埠
    
        weight 1      # 權重,數值越大,權重越高 
        
        # 健康檢查方式 常見有 TCP_CHECK, HTTP_GET, SSL_GET, MISC_CHECK(自定義指令碼)
        TCP_CHECK {               # 通過TcpCheck判斷RealServer的健康狀態
            connect_timeout 10    # 連線超時時間
            nb_get_retry 3        # 重連次數
            delay_before_retry 3  # 重連時間間隔
            connect_port 6500     # 檢測埠
        }
        
    }
    
}


三、負載補充說明

    1、DS通過啟動keepalived開啟排程器的負載均衡

[root@DR1 keepalived]# service keepalived start
    2、ipvs預設超時時間
#### 檢視預設超時時間
[root@DR1 keepalived]# ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 900 120 300
#  也就是說一條tcp的連線經過lvs後,lvs會把這臺記錄儲存15分鐘,就是因為這個時間過長,所以容易發生做好 LVS DR 之後輪詢的現象並沒有發生

#### 調整預設超時時間
[root@DR1 ~]# ipvsadm --set 1 2 1

    3、監測連線保持狀態(2s重新整理一次狀態)

[root@DR1 keepalived]# watch ipvsadm -L -n -c

    4、RS實伺服器參考LVS - 直接路由(DR)模式示例真實伺服器的lvs_real_dr.sh指令碼部分


四、常用keepalived檢查型別

    1、TCP_CHECK

    TCP_CHECK {     # 通過TcpCheck判斷RealServer的健康狀態
        connect_timeout 10    # 連線超時時間
        nb_get_retry 3        # 重連次數
        delay_before_retry 3  # 重連時間間隔
        connect_port 6500     # 檢測埠
    }
    2、HTTP_GET

    HTTP_GET {
        url {
            path check/200.jsp  # 檢查的uri地址
            digest 1362a91278f0806aa1d33e1e26d67763 # 用keepalived自帶的genhash生成,/usr/bin/genhash -s rsIP -p port -u uri
        }
        connect_timeout 3   # 連結超時時間
        nb_get_retry 3   # 重連次數
        delay_before_retry 3  # 重連時間間隔
        connect_port 6500  # 檢測埠
    }
    3、MISC_CHECK

        keepalived.conf配置:

    MISC_CHECK {
        misc_path "/etc/keepalived/misc_check.sh http://192.168.2.222:6500/check/200.jsp"    # 外部程式或者指令碼的路徑和引數
        misc_timeout 10   # 指令碼執行的超時時間
        misc_dynamic    #動態權重標誌。指令碼返回0則檢測成功權重不變,返回1表示失敗權重設定為0
    }
        misc_check.sh指令碼示例:
#!/bin/bash

# ./misc_check.sh http://192.168.2.222:6500/check/200.jsp

if [ $# -ne 1 ]; then
    echo "Warning: command param error."
    exit 1
else
    CHECK_URL=$1
    CMD=`/usr/bin/curl -I ${CHECK_URL} 2>/dev/null | grep "200 OK" | wc -l`
    
    if [ ${CMD} -eq 1 ]; then
            echo "Succ: Check proxy ${CHECK_URL} is succeed."
        exit 0
    
    else
        echo "Fail: check proxy ${CHECK_URL} is failed."
        exit 1
    fi
fi

五、參考資料

    http://www.cnblogs.com/liwei0526vip/p/6370103.html

    http://blog.csdn.net/traumerei/article/details/63686693

    http://outofmemory.cn/wiki/keepalived-configuration




相關文章