版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_17736151/article/details/82720288

负载均衡作为实现应用高可用和高可靠的一种方式,已成为目前数据中心内不可或缺的一个环节,并扮演着越来越重要的作用,而F5正是这一领域的佼佼者。要实现应用的高可用,如何探测负载均衡后端应用的可用性是其中非常重要的一个环节,该环节又被称作应用的健康检查。

本文将在下面的章节中,就作者工作中使用的几种F5健康检查的方式做简单的介绍和分析。主要包括TCP_HALF_OPEN、TCP ECV、HTTP GET这三种。我认为每一种健康检查的方式,都有其特点,而没有绝对的优劣。

##############################################
写在前面:

F5用来做健康检查的配置被统称为monitor,F5会优先通过与pool membet相同vlan的Self ip发起健康检查,采用主备状态的两台F5,均会对pool中的member进行健康检查。F5内置了一些常用的monitor配置,用户可以直接使用。如:icmp、tcp、tcp-half-open等。用户也可以根据自己的需要创建自己定制化的monitor。

##############################################
针对TCP应用的健康检查,目前工作中用到的有两种:

1、TCP-HALF-OPEN

2、另一种是通过F5发送TCP报文给应用,通过判断收到应用的返回值中是否包含有我用来判断应用健康的值,来监测应用的健康程度。这种方式被F5称作ECV(Extended Content Verification)。

下面将分别针对这两种方式做简要的分析。

##############################################
1、TCP-HALF-OPEN方式

TCP-HALF-OPEN的探测方式,实际是F5每隔一个固定的时间,发送一个SYN包给资源池pool中的一个member,等待服务器返回SYN_ACK,在收到SYN_ACK后,F5会使用RST,将该连接重置。

若F5在发出SYN包后,超过规定的时间仍未收到SYN_ACK,则认为这个member不可用,不再向这个member分配应用流量。

F5默认内置了一个tcp-half-open的monitor,具体配置界面如下:

从图中可以看到默认的,tcp_half_open的健康检查方式,探测间隔为5秒,超时时间为16秒。

下面来看一下具体的数据包:

在F5上抓包,利用wireshark对抓包文件进行过滤,192.168.92.7为F5的self ip,192.168.92.11为健康检查目标服务器。

通过Time 列可以看出,每隔约5秒钟,F5发起一次健康检查,F5发送SYN包与服务器建立TCP连接,服务器响应SYN包,同时服务器TCP状态变为SYN_RCVD,回复SYN_ACK报文,F5在收到SYN_ACK后,向member服务器发送RST包,将该链接重置,服务器收到RST包后,TCP状态重新变为listen状态。

F5内置的monitor中,还有一个TCP monitor,他与TCP_HALF_OPEN的区别,主要是TCP monitor是通过发送FIN包的方式,正常中断连接的。TCP_HALF_OPEN相对于TCP的方式,发送包的数量更少。但是由于采用RST的方式中断连接,可能会出现问题(目前还没有碰到),需要前期进行测试。

需要注意的是:

tcp_half_open和tcp这种健康检查方式,只能判断目标服务器的tcp端口是否处于listen状态,判断目标服务器是否有建立TCP连接的能力,不能完全用来判断应用的可用性。这并不是一种理想的健康检查方式。

######################################################
2、TCP ECV模式

前文已经讲过,TCP ECV模式是一种定制化的监控模式,通过F5发送定制化的TCP报文,之后在返回值中匹配指定内容,判断应用状态。

目前,已经在我工作的公司中,已存在通过F5发送定长报文和XML格式报文。同时已知的F5支持的报文格式还有16进制构造的字符串等。

进行TCP ECV模式的健康检查的案例。通过这种方式进行应用健康检查,往往需要应用系统开发人员首先提供可用来进行健康检查的探测报文。F5发送该探测报文,应用收到后,响应该报文。这时,如果该探测报文,可以由应用直接回复,无需经过数据库,则该健康检查只检查到应用层面。若该探测报文,是需要在数据库中进行查询等操作,则可通过在这种健康检查方式,探测这个目的member的应用可用性和其对数据库的可用性。所以,采用这种模式的健康检查,与应用系统开发人员的沟通将极为重要。这可能包括了,探测频度的商定、判断应用程序状态指定特征码的唯一性等。

下面来看一个例子,

已知x.x.61.55通过TCP 38001端口对外提供服务

开发提供的健康检查探测报文如下:

可以首先通过sockettool软件,判断该报文的正确性,判断该报文是否被服务器接受。

在F5中,创建monitor,并命名,选择tcp作为父monitor,如下图:

将开发提供的报文粘贴进Send String一栏中。同时我们得知,该应用系统在收到可识别的报文后,会返回带有00000特征码的报文,我们就可以通过这个特征码,判断应用是否可用。在Receive String中输入000000,F5会在收到的返回报文中查找该字符,若查到则健康检查通过,反之失败。

下面我们看一下具体数据包:

红底部分为F5作为客户端发送的探测报文,我们可以看到F5发送由开发提供的探测报文,在收到返回报文中,匹配到指定的000000特征码,则健康检查通过。

其中在具体的配置过程中,有几点需要注意:

探测报文中不能带有换行符

探测报文中部分字符需要进行转义,例如双引号,其中xml报文中标记了xml版本和编码格式的字段中的的双引号可以由单引号代替。

推荐使用火狐浏览器,进行该项配置。

新建monitor需要管理员权限。

#######################################################
HTTP GET

针对HTTP应用的健康检查,常用的是通过HTTP GET的方式,获取指定页面,通过判断页面中是否有指定的字符串,判断http应用的健康状态。

配置页面如下,其中父monitor选择为http

下面来看一个具体的案例,http get的内容为:

GET /ibxx/ HTTP/1.1 \r\n

下面看具体数据包,如下图:

可以看到,F5首先与目标服务器建立TCP连接,之后通过HTTP GET的方式,获取指定页面。服务器响应该请求,如下图:

在这里,我们常通过判断收到200,作为判断http服务正常的依据。

200状态码:表示请求已成功,请求所希望的响应头或数据体将随此响应返回。

我们也可以通过其他字符,作为判断http应用运行正常的依据。

最后,F5会通过发送RST包的方式,将该连接复位。

其中需要注意的是:

F5发送的是http 0.9的get请求,所以我们需要针对应用工作的http版本,构造get内容,例如:

HTTP version 1.1:GET /index.html HTTP/1.1 \r\n

HTTP version 1.0:GET /index.html HTTP/1.0 \r\n

F5同样支持HTTP POST,作为健康检查的一种方式。

#############################################################

至此,我们介绍了F5常用的TCP_HALF_OPEN、TCP ECV、HTTP GET这三种健康检查的方式,除此以外,F5还支持多种健康检查方式,包括访问特定应用的健康检查方式,如FTP、Oracle等。目前在我司还未应用,有待后续进一步探索。
 ————————————————  
版权声明:本文为CSDN博主「BBIE」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_17736151/article/details/82720288

《浅谈F5健康检查常用的几种方式》—那些你应该知道的知识(二)的更多相关文章

  1. 浅谈Spring解决循环依赖的三种方式

    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一种: ...

  2. 浅谈MySQL同步到ElasticSearch的几种方式及其优缺点

    同步双写 优点:业务逻辑简单. 缺点: 硬编码,有需要写入mysql的地方都需要添加写入ES的代码: 业务强耦合: 存在双写失败丢数据风险: 性能较差:本来mysql的性能不是很高,再加一个ES,系统 ...

  3. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  4. tomcat的虚拟目录映射常用的几种方式

      我们在项目部署的时候,可以采用多种方式,接下来我们将在实际中比较常用的几种方式总结如下. 1.可以直接将我们的项目丢到tomcat的webapps目录下,这样当tomcat重启的时候,我们就可以访 ...

  5. js页面跳转常用的几种方式(转)

    js页面跳转常用的几种方式 转载  2010-11-25   作者:    我要评论 js实现页面跳转的几种方式,需要的朋友可以参考下. 第一种: 复制代码代码如下: <script langu ...

  6. Jmeter中的参数化常用的几种方式

    Jmeter中的参数化常用的几种方式,这里讲一下前两个方式,最后一个在csv参数化里已详细讲解. 1.用户参数 2.函数助手 3.CSV Data Set Config  一.用户参数 位置:添加-前 ...

  7. String常用使用方法,1.创建string的常用3+1种方式,2.引用类型使用==比较地址值,3.String当中获取相关的常用方法,4.字符串的截取方法,5.String转换常用方法,6.切割字符串----java

    一个知识点使用一个代码块方便查看 1.创建string的常用3+1种方式 /* 创建string的常用3+1种方式 三种构造方法 public String():创建一个空字符串,不含有任何内容: p ...

  8. 针对后台TCP服务F5健康检查配置

    1.TCP-HALF-OPEN方式 TCP-HALF-OPEN的探测方式,实际是F5每隔一个固定的时间,发送一个SYN包给资源池pool中的一个member,等待服务器返回SYN_ACK,在收到SYN ...

  9. F5健康检查导致的服务端连接异常RST

    1. TCP健康检查 比如阿里云,F5负载设备当前都有这种机制. 该实现机制可能会导致后端ECS认为相关TCP连接出现异常(非正常退出),并在业务软件如Java连接池等日志中抛出相应的错误信息,如Co ...

随机推荐

  1. 【转】spring 自定义注解(annotation)与 aop获取注解

    首先我们先介绍Java自定义注解. 在开发过程中,我们实现接口的时候,会出现@Override,有时还会提示写@SuppressWarnings.其实这个就是Java特有的特性,注解. 注解就是某种注 ...

  2. 学习markdown(一)

    转:https://www.jianshu.com/p/81e1608ea2d8 ----------------------------------------------------------- ...

  3. 题解 洛谷P1281 【书的复制】

    蒟蒻的\(DP\)很菜,\(SO\)我准备上一套二分的玄学操作 一.简单的二分答案 二分主要是用来解决一些最值问题,它可以有效的优化暴力,使复杂度减少到\(O(logn)\). 我先给大家介绍一下二分 ...

  4. 【Python学习】Python3 基本数据类型

    参考学习地址:https://www.runoob.com/python3/python3-data-type.html Python3 基本数据类型 Python 中的变量不需要声明.每个变量在使用 ...

  5. oracle 查询表重复数据 并 删除保留一条

    语法:select count(字段名),字段名  from  表名 group by 字段名 having count(字段名)>1 实例: select  count(name),name ...

  6. Java - 框架之 MyBites

    一. 开发步骤: 1. 创建 PO (model) 类,根据需求创建. 2. 创建全局配置文件 sqlMapConfig.xml. 3. 编写映射文件. 4. 加载映射文件, 在 SqlMapConf ...

  7. Ubuntu16.04 install hadoop-2.8.1.tar.gz Cluster Setup

    环境说明: ip地址 用户名称 机器名称 机器角色 192.168.3.150 donny  donny-Lenovo-B40-80 Master + Salve 192.168.3.167 cqb ...

  8. JS AJAX和JSONP的基础功能封装以及使用示例;

    1.代码: function ajax(options){ options = options || {}; options.type = options.type || "get" ...

  9. python 使用 jt400.jar

    jt400helper.py #coding=utf-8 import jpype import os class JT400Helper(object): def __init__(self, se ...

  10. 表述数据的手段——json

    一.JSON 语法规则 在 JS 语言中,一切都是对象.因此,任何支持的类型都可以通过 JSON 来表示,例如字符串.数字.对象.数组等.但是对象和数组是比较特殊且常用的两种类型: 对象表示为键值对 ...