Envoy的负载均衡与限流设计

时间:2023-01-01 13:11:10

负载均衡是高性能和高并发的基础,通过负载均衡,可以将流量均匀分布到集群的多个节点上,Envoy负载均衡的设计和实现如下。

1.优先级

Envoy集群管理也是以优先级为基础进行组织的,单个集群按照优先级划分为不同的节点集合,集群成员信息变化时也会按照优先级进行重新组织和整理。

负载均衡选取时,Envoy默认只在最高优先级的候选集中进行选取,出于高可用的考虑,一般都会指定比最高优先级小的可用优先级为备选,这样当最高优先级的候选集中的服务节点均不可用时,可以通过故障转移机制将流量转移到备选优先级对应的候选集中。

2.恐慌阈值

负载均衡选取过程中,Envoy默认优先选择健康的节点,但由于故障等,一个集群的健康节点比例过低时,按照健康节点的选取策略,集群的全部流量会全部涌向为数不多的健康节点上,容易引发健康节点因为流量过大而雪崩的现象,导致整个集群全部不可用。

为了解决这个问题,Envoy引入了恐慌阈值的概念,默认的恐慌阈值是50%,当健康节点占所有节点的比例下降到恐慌阈值时,选取节点时不再局限于健康节点范围内,而是在所有节点范围内选取。

3.区域感知负载均衡

区域感知负载均衡,顾名思义,负载均衡时优先选取和当前区域相同的服务节点,区域感知特性是Envoy中所有负载均衡算法的基石。

hostSourceToUse是区域感知路由的核心实现,首先基于优先级选取初始候选集,默认采用选取健康节点的策略,如果触发恐慌阈值,则退化到选取当前所有节点;然后判断当前是否满足区域感知负载均衡的条件,如果不满足,则直接返回,否则通过区域感知路由算法获取合适的节点列表。综合来看,目标候选节点集合的选取条件包括优先级、区域和是否需要健康节点这几个核心因素。

4.资源限制机制

任何系统的资源都是有一定限度的,如果使用超过一定限度,就会出现各种各样的问题,影响系统的整体可用性,因此为了保障系统的可用性,需要有相应的资源管理机制,保障关键资源的合理使用。

Envoy针对Upstream集群的一些关键资源,比如Upstream集群最大连接数、最大请求数等,通过resource manager进行管理。

resource manager进行资源管理的方式很简单,在资源创建时指定资源的配额限制,同时提供相应的资源更新和配额检查接口。当使用和归还资源时更新相应的资源计数;通过资源配额检查接口判断资源当前是否还有富余。

为了实现资源管理的灵活性,resource manager针对每个资源设置一个开关变量key,从而通过开关特性机制动态修改资源的当前值。

另外,针对每个资源设置一个stats项,当资源超过限额时设置stats状态为超出配额,这样外界通过HTTP管理接口实时查看Envoy运行状态时,也可以查看当前所有的资源状态,比如是否超出资源配额等。

5.全局限流机制

尽管Envoy提供了完善的资源限制机制,可以很大程度上保证顺利访问Upstream的资源和应对压力情况,但对于有大量客户端的服务端程序来说,从任何一个客户端都很难确切地了解服务端程序的真实压力情况,并进行准确的资源限制,因此需要有一个从服务端角度出发的全局视角,对客户端/服务器之间的通信和链路情况进行限制与管控,全局限流就是解决这个问题的一个很好的机制。

Envoy当前支持网络层面和HTTP层面两种限流方式。网络层面的限流可以针对需要限流的连接设置网络限流过滤器,这样当新连接创建时,Envoy会通过gRPC远程访问全局限流服务判断是否允许访问,如果不允许,限流插件会在新数据到来时直接返回出错提示。HTTP层面的限流是针对请求级别的,每个HTTP请求会有相应的路由,路由访问前,通过gRPC远程访问全局限流服务判断是否允许访问,如果不允许,则返回失败。