• 集群间分流
    • 示例场景
    • 分流的配置方式
    • 配置分流规则的注意事项
  • 集群内负载均衡
    • 示例场景
  • 子集群内的负载均衡
  • 其他功能
    • 健康检查
    • 失败重试机制
    • 连接池
    • 会话保持

    集群间分流

    • 集群间分流是指BFE收到请求,基于收到消息内容进行路由,确定由产品线中哪一个集群来处理消息。

    示例场景

    • 对于一个产品线的流量,可能需要定义不同的集群来处理。例如,对产品线(demo),可以定义3种服务集群,实现对不同类型的流量的处理:

      • 静态集群(demo-static):服务静态流量
      • post集群(demo-post):服务post流量
      • main集群(demo-main):服务其他流量
    • BFE支持根据配置的分流规则, 将流量转发到以上不同的集群。

    分流的配置方式

    • BFE基于请求内容进行条件判断,来决定分流
      • 可以使用的信息包括:host,path, query,cookie,method等
    • BFE提供了一个称为Condition的描述机制

    对于上面的例子,我们可以demo这个产品线创建了3条分流规则

    • 第一条:对于path以”/static”作为前缀的,都发往demo-static

    • 第二条:请求方法为”POST”、并且path是以”/setting”为前缀的,都发往demo-post

    • 第三条:如果以上两条规则没有命中,则凡是这个产品的流量、都发往demo-main

    配置分流规则的注意事项

    在配置一个产品线的分流规则时,需要注意以下事项:

    • 多条分流规则之间是有序的

      • 对于一个HTTP请求,会按照从上至下的顺序,逐条去尝试匹配分流条件
      • 只要命中任何一个分流规则的条件,就会结束
    • 必须存在一个”default规则”

      • default规则永远处于规则列表的最后一条
      • 如果其他分流规则都没有命中,则请求会发往default规则所指定的集群

    集群内负载均衡

    • BFE可以配置一个集群中的子集群的流量分配比例。

    • 该配置中可以包含一个虚拟的子集群,BLACKHOLE(黑洞)。分向黑洞的流量会被丢弃。它可以用来防止子集群过载。

    示例场景

    • 假设基本场景如下图所示:

      • 共两个IDC:IDC1和IDC2

      • 两个BFE集群:BFE1和BFE2

      • 后端产品线的集群有两个子集群:子集群1和子集群2

    • BFE集群(BFE1和BFE2)可以根据子集群(外加Blackhole)分流比例的配置,分发流量。如:

      • BFE1集群的分流配置为:{子集群1:w11,子集群2:w12, Blackhole:w1B}

      • BFE2集群的分流配置为:{子集群1:w21,子集群2:w22, Blackhole:w2B}

    • BFE实例根据上述配置做WRR调度(加权轮询),向子集群转发请求。

      • 例如,当BFE1的分流配置{w11,w12, w1B}为{45,45,10}时,该集群在BFE1转发给子集群1、子集群2、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等
    • 会话保持级别:

      • 子集群级别:相同来源请求,被转发至固定的业务子集群(注:子集群中的任意实例)
      • 实例级别:相同来源请求,被转发至固定的业务实例