对于A10的aFelx脚本,相信很多人都知道,甚至用过,但是实际上很多工程师在各种项目中的使用可能都是按照模板进行修改,虽然能ok,但是却缺乏对aFelx脚本本质上的了解,所以在用户实际场景与脚本应用场景不完全一致的时候,就会碰到问题,不知如何修改。而更多的技术人员或者用户更是知其然,不知其所以然,这样一来,其实未必真的理解aFlex的工作原理,以及到底aFlex能做些什么事。本篇文章的目的是以我自己的理解对aFlex的一些基本原理,功能及典型案例进行简单的分析,让大家能够相对深入的了解aFlex,从而能更加充分的发挥aFlex这柄利器。
当我们在A10上建立一个virtual server的时候,可能主要包含如下几个因素:
1、VIP(当然包含具体的协议及端口)
2、server-group(当然包含具体的server、负载均衡算法、健康状态检测)
3、会话保持
正常的负载均衡流程如下:
1、client发起对VIP的请求,命中该VIP上的某个协议端口,从而命中某个virtual server
2、A10考察该请求命中的virtual server,找到和该virtual server关联的server-group,从而了解到对该server-group中的server的负载均衡算法
3、如果该virtual server建立了会话保持,且该请求满足会话保持的条件,则直接将请求转发到特定的server;如果未满足会话保持的条件,则按照server-group的负载均衡算法进行请求的分发。
aFlex无法单独生效,必须绑定在virtual server上,可以在以上3步流程的第一步之后介入,改变正常的流程行为,从而达到根据客户应用进行定制行为的目的。
一个完整的aFlex会包含3个组成部分:
1、Events(事件) aFlex生效的事件上下文环境
2、operators(操作) 在该事件上下文环境中需要满足的条件
3、commands(命令) 满足指定条件以后进行的行为
这3个部分之间的关系,简单来说,可以理解如下:
当发生某个事件的时候{
{ [如果满足某个条件]} {
执行某个命令}
}
所以要清楚的了解aFlex能做什么,只需要分别了解events、operators、commands的详细内容即可。
以下依次介绍events、operators、commands这3个组成部分。
1、events
events是aFlex被触发的先决条件,重要程度不言而喻,从aFlex支持的events种类和数量就能看出aFlex的作用范围
aFlex的events主要分为4个大类:
a、Global b、IP,TCP,UDP C、HTTP D、SSL
(这里插入介绍2个很重要的概念,clientside,serverside。对于一个正常的应用流程而言,client向server发起请求,经过A10建立连接的过程,可以分为3个部分:
1、client向A10的VIP发起连接请求,通过TCP 3次握手,client和A10之间建立了连接,这个时候A10还未和server建立TCP连接。随后client发送一个数据请求。
2、client发送一个数据请求到达A10之后,A10会向与server通过TCP 3次握手建立连接,然后A10会通过负载均衡算法选择一台合适的server,并对数据请求进行一定的修改,随后将数据请求发送到一台合适的server上,这个时候server会进行响应,且响应的数据包会返回到A10上。
3、A10接受到server响应数据之后,会进行适当的修改,然后把请求发送回client
在以上3个过程中,我们定义client与A10之间的交互都属于clientside,server与A10之间的交互都属于serverside,之所以在介绍events之前插入这段介绍,是因为一些events可以同时使用在clientside和serverside两个部分,而虽然是相同的events,但是在这2个部分中,一些相同变量却可以分别表达出不同的含义,这在后面篇幅中会介绍)
这里我们着重以b和c为例说明,因为这两类events是使用频率最高的。
在b类中,events有如下内容:
1、CLIENT_ACCEPTED
当client与A10建立了一个连接的时候触发
2、CLIENT_DATA
当client与A10建立了连接之后并收到一个新的数据应答且连接状态处于collect status的时候触发
3、LB_FAILED
当AX设备不能为client发出的请求选择一个合适的real server进行分发的时候,比如所有的server健康状态检测的结果都是down的时候或者所有server的连接上线都已经达到的时候触发
4、LB_SELECTED
当AX已经为client的请求选择了一个pool member的时候触发
5、CLIENT_CLOSED
当一个clientside端连接关闭的时候触发
6、SERVER_CLOSED
当一个serverside段连接关闭的时候触发
7、SERVER_CONNECTED
当AX设备和目标server建立了连接的时候触发
8、SERVER_DATA
当AX设备从目标server接收到一个新数据且连接处于hold status时候触发
在c类events中,events有如下内容:
1、HTTP_REQUEST
当AX设备完整的接收并解析出client的http request header时候触发
2、HTTP_RESPONSE
当AX设备从server的response中解析出了所有状态码以及header信息的时候触发
3、HTTP_RESPONSE_CONTINUE
当AX设备从server接收到状态码 100 continue的response时候触发
4、HTTP_REQUEST_DATA
当连接请求接收到一个新的http内容数据的时候触发
5、HTTP_RESPONSE_DATA
当AX从response中接收到新的http内容数据的时候触发
6、HTTP_REQUEST_SEND
在一个request被发送往server之前立即触发
未完待续
t.d.
转载于:https://blog.51cto.com/virtualadc/599194