一、健康检查方式
keepalived对后端realserver的健康检查方式主要有以下几种TCP_CHECK:工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。
HTTP_GET:工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。
SSL_GET:跟上面的HTTP_GET相似,不同的只是用SSL连接
MISC_CHECK:用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:
0) 检测成功
1) 检测失败,将从服务器池中移除
2-255)检测成功;如果有设置misc_dynamic,权重自动调整为 退出码-2,如退出码为200,权重自动调整为198=200-2。
SMTP_CHECK:用来检测邮件服务的smtp的
二、相关配置:delay_loop 隔多长时间做一次健康检测,单位为秒
connect_timeout 连接超时时间,单位为秒
nb_get_retry 检测失败后的重试次数,如果达到重试次数仍然失败,将后端从服务器池中移除。
delay_before_retry 失败重试的间隔时间,单位为秒
三、示例
1)HTTP_GETHTTP_GET {
url {
path /index.html
digest 5b6d74f1453e20c09d6a20d909779ad7
}
## status_code 200
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 7
}
##digest的值用genhash生成,genhash由keepalived自带,一般位于安装目录中的bin目录,生成方法:#./genhash -s realserverIP -p port -u url
如
#./genhash -s 192.168.1.100 -p 80 -u /index.html
2)TCP_CHECKTCP_CHECK {
connect_port 80
connect_timeout 6
nb_get_retry 3
delay_before_retry 3
}
3)MISC_CHECKMISC_CHECK {
misc_path "/opt/mytools/check_web.sh web1" #脚本名,需全路径
misc_timeout 30 #脚本执行的超时时间
misc_dynamic #动态调整服务器权重
}
--------------------------------------------------------华丽神奇的分割线--------------------------------------------------------
--------------------------------------------------------华丽神奇的分割线--------------------------------------------------------
keepalived具有很强大、灵活的后端检测方式,其具有HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK 几种健康检测方式 ,在分别介绍各种检测方式之前,先纠正一个常见的理论问题 。在百度百科 及 keepalived官方老文档(田逸提交的)中,对keepalived的描述是其具有3、4、7层交换及健康检测功能。不过根据官网对当前版本的介绍和这有些出入 。
网上一些文档的介绍如下:
layer 3层检测:进行ICMP ping包检测,确认主机是否存活,如果异常,则会该主机从服务器集群中剔除;
layer 4层检测:进行端口检测,例如80、3306等,端口不通时,将服务器从集群中剔除;
layer 7层检测:这个就是基于应用的了,如http返回码是否为200,确认主机是否正常。
当然,上面这些对keepalived的描述不能说不对,只能说不准确 。对于当前的最近版本来说,管网上关于checkers 的描述如下:
This is one of the main Keepalived functionnality. Checkers are in charge of realserver healthchecking.
A checker test if realserver is alive, this test end on a binary decision :
remove or add realserver from/into the LVS topology. The internal checker design is realtime networking software,
it use a fully multi-threaded FSM design (Finite State Machine).
This checker stack provide LVS topology manipulation accoring to layer4 to layer5/7 test results.
Its run in an independent process monitored by parent process
上面的描述很清楚,是layer4 to layer5/7 ,并不包含上面所谓的三层交换检测 。不过也并不能说网上这些说法是不准确的,因为三层相较于layer5/7这些,属于低层级的基本功能,基于MISC_CHECK 进行ICMP ping 三层网络检测完全是不存在问题的 。不过仅仅通过ping确认一个服务是否正常,显然也太低端了。---(本人有“洁癖” ,以上为对比官网描述和当下网上资料后的一点心得)
一、HTTP及SSL GET检测
这里有几个要点:
1、两者都有两种检测方式,一种是简单的基于返回码确认;另一种是基于确认后端页面内容hash值,确认前后是否发生变化(是不是感觉有点高端,还有简单的防止页面被篡改的作用,当然,动态页面显然不行);
2、两者都是处理简单的GET请求,基于post返回值确认是否正常,这种方法显然不适用 ,不过POST方式是可以通过MISC_CHECK方式进行支持检测的;
3、两者配置语法上相同,只不过类型名不同而已 。同属于大的web请求范畴,只不过一个走的HTTP协议,一个走的HTTPS协议;
基于状态码的检测
配置如下:real_server 192.168.2.188 80 {
weight 1
HTTP_GET {
url {
path /index.html
status_code 200 #http://192.168.2.188/index.html的返回状态码
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
基于genhash的检测
配置如下:real_server 192.168.2.188 80 {
weight 1
HTTP_GET {
url {
path /index.html
digest bfaa334fdd71444e45eca3b7a1679a4a #http://192.168.2.188/index.html的digest值
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
安装完keepalived包,系统中会多出一个命令genhash,通过该命令可以获取页面的hash串,如下是我更改某个页面前后的digest值:[root@lvs-dr ~]# genhash -s 192.168.122.10 -p 80 -u /index.html
MD5SUM = 6df8d89daedcbb90e3f0c1d1f82cbcf6
[root@lvs-dr ~]# genhash -s 192.168.122.10 -p 80 -u /index.html
MD5SUM = e6368a07d59e3922d2f428b2acd27090
也可以参考官方给出的文档(包安装后,会有该文件生成)。
二、TCP_CHECK 检测
配置如下:real_server 192.168.2.100 80 {
weight 100
TCP_CHECK {
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔
connect_port 80
}
}
这个在安装包附带的文档中也有示例 。而且其还可以配合HTTP_GET和SSL_GET一起用,如下:real_server 192.168.201.100 443 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
connect_port 444
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
以上配置也是安装包中的示例 。
三、SMTP检测
SMTP这个顾名思义,主要用于邮件系统SMTP协议的检测,具体如下示例:SMTP_CHECK {
connect_timeout 10
retry 2
delay_before_retry 5
helo_name foo.bar.com
host {
connect_ip 172.16.1.11
}
host {
connect_ip 192.168.155.10
}
}
这里也可以指定连接的端口(默认肯定是25啊),监听的地址 ,更多也可以参看帮助文档 。
四、MISC_CHECK检测
这个是通过调用外部配置名脚本进行检测确认后端主机是否正常的方法 。MISC_CHECK {
misc_path |# 外部程序或者脚本路径
misc_timeout # 执行脚本的超时时间
misc_dynamic #如果设置了misc_dynamic,healthchecker程序的退出状态码会用来动态调整服务器的权重(weight).
#返回0:健康检查OK,权重不被修改
#返回1:健康检查失败,权重设为0
#返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255,那么weight=255-2=253
}
对应的脚本后面是支持传参的,两个示例如下:
#不传参配置real_server 192.168.200.6 1358 {
weight 1
MISC_CHECK {
misc_path /usr/local/bin/script.sh
}
}
#传参配置real_server 192.168.200.6 1358 {
weight 1
MISC_CHECK {
misc_path "/usr/local/bin/script.sh arg1 arg2"
}
}
--------------------------------------------------------华丽神奇的分割线--------------------------------------------------------
--------------------------------------------------------华丽神奇的分割线--------------------------------------------------------