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协议;

基于状态码的检测

配置如下:

 1real_server 192.168.2.188 80 {
 2      weight 1
 3      HTTP_GET {
 4          url {
 5          path /index.html
 6          status_code 200      #http://192.168.2.188/index.html的返回状态码
 7            }
 8            connect_timeout 3
 9            nb_get_retry 3
10            delay_before_retry 3
11        }

基于genhash的检测

配置如下:

 1real_server 192.168.2.188 80 {
 2     weight 1
 3     HTTP_GET {
 4       url {
 5       path /index.html
 6       digest bfaa334fdd71444e45eca3b7a1679a4a  #http://192.168.2.188/index.html的digest值
 7        }
 8            connect_timeout 3
 9            nb_get_retry 3
10            delay_before_retry 3
11        }

安装完keepalived包,系统中会多出一个命令genhash,通过该命令可以获取页面的hash串,如下是我更改某个页面前后的digest值:

1[root@lvs-dr ~]# genhash  -s 192.168.122.10 -p 80 -u /index.html
2MD5SUM = 6df8d89daedcbb90e3f0c1d1f82cbcf6
3[root@lvs-dr ~]# genhash  -s 192.168.122.10 -p 80 -u /index.html
4MD5SUM = e6368a07d59e3922d2f428b2acd27090

也可以参考官方给出的文档(包安装后,会有该文件生成)

二、TCP_CHECK 检测

配置如下:

1real_server 192.168.2.100 80 {
2        weight 100
3        TCP_CHECK {
4            connect_timeout 3  #连接超时时间
5            nb_get_retry 3  #重连次数
6            delay_before_retry 3  #重连间隔
7            connect_port 80
8        }
9    }

这个在安装包附带的文档中也有示例 。而且其还可以配合HTTP_GET和SSL_GET一起用,如下:

 1real_server 192.168.201.100 443 {
 2        weight 1
 3        SSL_GET {
 4            url {
 5              path /
 6              digest ff20ad2481f97b1754ef3e12ecd3a9cc
 7            }
 8            connect_port    444
 9            connect_timeout 3
10            nb_get_retry 3
11            delay_before_retry 3
12        }
13    }

以上配置也是安装包中的示例

三、SMTP检测

SMTP这个顾名思义,主要用于邮件系统SMTP协议的检测,具体如下示例:

 1SMTP_CHECK {
 2    connect_timeout 10
 3    retry 2
 4    delay_before_retry 5
 5    helo_name foo.bar.com
 6    host {
 7        connect_ip 172.16.1.11
 8    }
 9    host {
10        connect_ip  192.168.155.10
11    }
12}

这里也可以指定连接的端口(默认肯定是25啊),监听的地址 ,更多也可以参看帮助文档

四、MISC_CHECK检测

这个是通过调用外部配置名脚本进行检测确认后端主机是否正常的方法 。

1MISC_CHECK {
2    misc_path |# 外部程序或者脚本路径
3    misc_timeout # 执行脚本的超时时间
4    misc_dynamic #如果设置了misc_dynamic,healthchecker程序的退出状态码会用来动态调整服务器的权重(weight).
5    #返回0:健康检查OK,权重不被修改
6    #返回1:健康检查失败,权重设为0
7    #返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255,那么weight=255-2=253
8}

对应的脚本后面是支持传参的,两个示例如下:

 1#不传参配置
 2real_server 192.168.200.6 1358 {
 3    weight 1
 4    MISC_CHECK {
 5      misc_path /usr/local/bin/script.sh
 6    }
 7}
 8#传参配置
 9real_server 192.168.200.6 1358 {
10    weight 1
11    MISC_CHECK {
12      misc_path "/usr/local/bin/script.sh  arg1  arg2"
13    }
14}