写点什么

Envoy 负载均衡与限流设计

作者:阿泽🧸
  • 2022 年 7 月 20 日
  • 本文字数:1446 字

    阅读完需:约 5 分钟

Envoy负载均衡与限流设计

负载均衡是高性能和高并发的基础,通过负载均衡,可以将流量均匀分布到集群的多个节点上,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 远程访问全局限流服务判断是否允许访问,如果不允许,则返回失败。


发布于: 刚刚阅读数: 3
用户头像

阿泽🧸

关注

还未添加个人签名 2020.11.12 加入

还未添加个人简介

评论

发布
暂无评论
Envoy负载均衡与限流设计_7月月更_阿泽🧸_InfoQ写作社区