近期评论

lvs健康检查

lvs是一个高性能且比较成熟的解决方案,但是要玩的转不容易。这里谈谈健康检查的问题。

后端检查默认使用的模块是TCP_CHECK,这个模块的效果是每个一段时间定时探测后端的服务器的端口是否开放。

配置如下:

TCP_CHECK { 
connect_timeout 3

    nb_get_retry 3
    delay_before_retry 3
    connect_port 80
}

具体是如何实现的呢,以上面的配置为例,每隔3秒,发起一个syn半连接数据包给后端realserver服务器。注意这是半连接syn包,没有建立一个完整的tcp三次握手。
通常后端服务器上nginx,apache,或者一些java web服务器时,这没什么问题。

但是后端如果使用非阻塞模式监听套接字时,后端程序收到syn也会立即处理,消耗系统资源。比如java的netty框架的异步非阻塞模式,thrift的非阻塞模式,C/C++的epoll服务等。
都会导致占用业务程序资源,尤其是每个3秒探测一次的时候,可能产生大量异常日志。
解决办法是使用第三方监控脚本。在director和realserver之间建立免密钥通信。然后使用脚步探测服务器的业务是否正常,比如进程,端口的存活。
real_server 192.168.4.141 9901 {
    weight 1
    MISC_CHECK {
    misc_path “/usr/local/keepalived/bin/check.sh 192.168.4.141”
    }
}

cat /usr/local/keepalived/bin/check.sh
#!/bin/sh
# usage : /usr/local/keepalived/bin/check.sh 192.168.4.141
# author : TangHaiyang
# date : Fri Dec 9 15:46:34 CST 2016
IP=$1

if [ $# != 1 ] ; then
echo “传入参数错误!”
echo “USAGE: $0 IP”
exit 1;
fi

RESULT=`ssh $1 -C ‘netstat -antp |grep LIST |grep 9901’`

if [ x”$RESULT” = x ]; then
exit 0
else
exit 1
fi

585 Responses to “lvs健康检查”

Leave a Reply