解讀 Linux 系統(tǒng) Keepalived 健康檢查機制
在進行負載均衡時,一般都會部署一個健康檢查工具,確保后端real server是正常的,可以提供服務的,避免出現(xiàn)后端real server 已經宕機或服務不可用時,負載均衡器扔將請求分發(fā)到real server,影響整體業(yè)務訪問。健康檢查的方式有很多,可以自行部署腳本,當然當前用的比較多的就是keepalived服務了。keepalived的健康檢查方式有三種,tcp_check、http_check、misc_check。
keepalived配置簡述
keepalived主要有三個模塊,分別是core、check和vrrp。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現(xiàn)VRRP協(xié)議的 keepalived只有一個配置文件keepalived.conf,里面主要包括以下幾個配置區(qū)域,分別是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。
yum install keepalived -y
配置文件:
! Configuration File for keepalived
# vi /etc/keepalived/keepalived.conf
# 全局配置 主要是配置故障發(fā)生時的通知對象以及機器標識
global_defs {
notification_email {
r_xl@xl.com # 設置報警郵件接收地址,需要開啟 sendmail 服務
}
notification_email_from s_xl@xl.com # 設置郵件的發(fā)送地址
smtp_server 192.168.2.241 # 設置通知的 SMTP Server 地址
smtp_connect_timeout 30 # 設置通知的 SMTP Server 的超時時間
router_id LVS_DEVEL_1 # 路由ID,標識本節(jié)點的字符串,郵件通知時會用到
}
# 自定義VRRP實例健康檢查腳本 keepalived只能做到對自身問題和網絡故障的監(jiān)控,Script可以增加其他的監(jiān)控來判定是否需要切換主備
vrrp_script chk_sshd {
script "killall -0 sshd" # 示例為檢查sshd服務是否運行中
interval 2 # 檢查間隔時間
weight -4 # 檢查失敗降低的權重
}
# VRRP實例 定義對外提供服務的VIP區(qū)域及其相關屬性
vrrp_instance VI_1 {
state MASTER # 狀態(tài)只有 MASTER 和 BACKUP 兩種,并且要大寫,MASTER 為工作狀態(tài),BACKUP 是備用狀態(tài)
interface eth0 # 節(jié)點固有IP(非VIP)的網卡,用來發(fā)VRRP包
virtual_router_id 51 # 虛擬路由標識,同一個 vrrp_instance 的 MASTER 和 BACKUP 的 vitrual_router_id 需要一致
priority 100 # 優(yōu)先級,同一個 vrrp_instance 的 MASTER 優(yōu)先級必須比 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 # 負載均衡轉發(fā)規(guī)則。一般包括DR,NAT,TUN 3種
persistence_timeout 5 # 會話保持時間。把用戶請求請求間隔在未超過保持時間時,一直分發(fā)到某個服務節(jié)點
protocol TCP # 轉發(fā)協(xié)議 有TCP和UDP兩種
# 配置真實服務器
real_server 192.168.2.222 6500 { #指定IP和端口
weight 1 # 權重,數(shù)值越大,權重越高
# 健康檢查方式 常見有 TCP_CHECK, HTTP_GET, SSL_GET, MISC_CHECK(自定義腳本)
TCP_CHECK { # 通過TcpCheck方式判斷RealServer的健康狀態(tài)
connect_timeout 10 # 連接超時時間
nb_get_retry 3 # 重連次數(shù)
delay_before_retry 3 # 重連時間間隔
connect_port 6500 # 檢測端口
}
}
# 配置真實服務器
real_server 192.168.2.222 6500 { #指定IP和端口
weight 1 # 權重,數(shù)值越大,權重越高
# 健康檢查方式 常見有 TCP_CHECK, HTTP_GET, SSL_GET, MISC_CHECK(自定義腳本)
TCP_CHECK { # 通過TcpCheck判斷RealServer的健康狀態(tài)
connect_timeout 10 # 連接超時時間
nb_get_retry 3 # 重連次數(shù)
delay_before_retry 3 # 重連時間間隔
connect_port 6500 # 檢測端口
}
}
}
健康檢查類型
TCP_CHECK
TCP_CHECK { # 通過TcpCheck判斷RealServer的健康狀態(tài)
connect_timeout 10 # 連接超時時間
nb_get_retry 3 # 重連次數(shù)
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 # 重連次數(shù)
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" # 外部程序或者腳本的路徑和參數(shù)
misc_timeout 10 # 腳本執(zhí)行的超時時間
misc_dynamic #動態(tài)權重標志。腳本返回0則檢測成功權重不變,返回1表示失敗權重設置為0
}
腳本示例:
#!/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