keepalived支持的健康檢測方式有:HTTP_GET|SSL_GET、TCP_CHECK、SMTP_CHECK、MISC_CHECK。
由於keepalived自身並不支持udp檢測,有TCP_CHECK但是沒有UDP_CHECK,所以這里只能使用MISC_CHECK混合檢測方式調用外部腳本來對udp協議進行健康檢測。
首先,我們知道檢測udp端口是否開啟可以使用nc命令。
# nc --help
Ncat 6.40 ( http://nmap.org/ncat )
Usage: ncat [options] [hostname] [port]
-w, --wait <time>:Connect timeout;連接超時時長。例如設為10秒,如果10秒后未連接成功則停止發起連接請求並返回失敗信息
-v, --verbose:Set verbosity level
-u, --udp:Use UDP instead of default TCP
-n, --nodns:Do not resolve hostnames via DNS
-z:zero-I/O mode [used for scanning];如果端口無回應的時候加上;如果有回應-z參數需去掉(掃描端口是否打開)
在debian下,nc檢測成功后返回的是open,而不是其他OS常見的succeeded。所以這里可以通過grep open字段來判斷udp端口是否開啟。
# nc -unvz -w 1 192.168.10.88 2012
(UNKNOWN) [192.168.10.88] 2012 (?) open
編寫檢測腳本:
# vim /etc/keepalived/UDP_CHECK.sh
#!/bin/bash
/bin/nc -unvz -w 1 $1 $2 2>&1 | grep open &> /dev/null
exit $?
通過返回的狀態碼$?傳遞給keepalived,如果grep open為0,則$?為1,如果grep open為1,則$?為0。
MISC_CHECK 返回的狀態碼 1為失敗,0為正常,詳情可以查看示例文件的說明。
配置keepalived:
virtual_server 122.14.206.125 2012 {
lb_algo rr
lb_kind DR
persistence_timeout 0
delay_loop 20
protocol UDP
real_server 117.119.33.41 2012 {
weight 5
MISC_CHECK {
misc_path "/etc/keepalived/UDP_CHECK.sh 192.168.10.88 2012"
misc_timeout 10
}
}
real_server 117.119.33.12 2012 {
weight 5
MISC_CHECK {
misc_path "/etc/keepalived/UDP_CHECK.sh 192.168.10.89 2012"
misc_timeout 10
}
}
}
