负载均衡
集群内负载均衡
概述
-
一个集群往往包含多个子集群。在BFE中,可以针对集群配置其多个子集群间的流量分配比例。
-
另外,对每个集群,还包含一个虚拟的子集群,BLACKHOLE(黑洞)。
- 分给黑洞子集群的流量会被主动丢弃
- 黑洞用来防止集群整体过载
-
子集群粒度的负载均衡,这是BFE的一个重要功能。这个功能在多IDC场景非常有用。
示例场景
-
示例场景如下图所示,包含:
-
两个IDC:IDC_1和IDC_2
-
两个BFE集群:BFE_1和BFE_2
-
后端集群有两个子集群:SubCluster_1和SubCluster_2
-
-
可以针对BFE集群,设置子集群的分流比例,如:
-
BFE_1集群的分流配置为:{SubCluster_1: W11,SubCluster_2: W12, Blackhole: W1B}
-
BFE_2集群的分流配置为:{SubCluster_1: W21,SubCluster_2: W22, Blackhole: W2B}
-
-
BFE实例根据上述配置做WRR调度(加权轮询),向子集群转发请求
- 例如,当BFE_1的分流配置{W11,W12, W1B}为{45,45,10}时,BFE_1转发给SubCluster_1、SubCluster_1、Blackhole的流量比例依次为:45%、45%、10%。
-
通过修改上述配置,可以将流量在不同的子集群之间切换,实现负载均衡、快速止损、过载保护等目的。
子集群内的负载均衡
- 在同一子集群内的多个实例间,BFE支持使用多种负载均衡算法:
- WRR: 加权轮询算法
- WLC: 加权最小连接数
- 如实例的处理能力不同,可以分配不同的权重。
健康检查
对于BFE下游的每一个实例,BFE会维护一个状态机,包含2个状态:
- 正常状态:这个实例可以正常处理BFE转发的请求
- 健康检查状态:实例暂时不可用,BFE对这个实例启动健康检查,直到这个实例恢复正常为止
从正常状态切换到健康检查状态的条件:
-
建立连接或转发请求的连续失败次数超过一定的阈值
-
在健康检查状态:
- BFE会定期向实例发送健康检查请求
从健康检查状态切换到正常状态的条件:
- BFE从该实例收到健康检查请求的正确响应
失败重试机制
BFE在转发时,支持以下两种失败重试机制:
-
同子集群重试
- 在原目标子集群内进行重试
-
跨子集群重试
- 在原目标子集群之外、使用另外一个子集群进行重试
连接池
BFE和下游实例的连接支持两种方式:
-
短连接方式:每次BFE向下游实例转发请求,均需要建立新的TCP连接
-
连接池方式:
-
BFE为每个下游实例维护一个连接池
-
当BFE需要向某个下游实例转发请求时:
- 如果连接池中有idle连接,则复用这个连接
- 如果连接池中没有idle连接,则会建立一个新的TCP连接
-
当BFE处理完一个请求时
- 如果连接池中的idle连接数量小于连接池的大小,则将当前使用的连接放入连接池
- 如果连接池中的idle连接数量大于等于连接池的大小,则关闭当前使用的连接
-
会话保持
BFE向下游转发请求时,支持将相同来源请求,转发至固定的业务后端(某个子集群或某个实例)
-
请求来源标识:
- 基于请求来源IP
- 基于请求特定头部,例如请求Cookie等
-
会话保持级别:
- 子集群级别:相同来源请求,被转发至固定的业务子集群(注:子集群中的任意实例)
- 实例级别:相同来源请求,被转发至固定的业务实例