Envoy源码分析之Load balancing基础

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: # 什么是Load balancing? > Load balancing is a way of distributing traffic between multiple hosts within a single upstream cluster in order to effectively make use of available resources. There are man

什么是Load balancing?

Load balancing is a way of distributing traffic between multiple hosts within a single upstream cluster in order to effectively make use of available resources. There are many different ways of accomplishing this, so Envoy provides several different load balancing strategies. At a high level, we can break these strategies into two categories: global load balancing and distributed load balancing.

上面是Envoy官方文档对于Load balancing的一个解释,说通俗点就是一种将流量分布到一个upstream集群中的多台机器上的方法。而实现的方式有很多种,Envoy提供了几种Load balancing的策略,主要是分为global load balancing distributed load balancing两类。前者是通过一个中心的控制节点来决策流量到底分布到哪些机器,比如通过控制节点来调节权重、优先级、区域等,而后者则是Envoy自己根据自定义的规则来决定流量到底分布到哪些机器上,比如根据区域来决策、或者根据自己使用的负载均衡算法、又或者是根据机器的健康状况来决策,Envoy是同时支持这两种策略的。

Envoy中Load balancer的类型

load-balancer-type.jpg

上面这张图是Envoy中的Load balancer的实现类图,蓝色部分是各个Load balancer实现所依赖的基类,每一种颜色代表一种Load balancer实现。根据它们所实现的基类可以知道这些Load balancer的类型。在Envoy中大致可以分为五类。

  1. 带有权重支持的Load balancer(EdfLoadBalancerBase)
  2. 带有区域感知支持的Load balancer(ZoneAwareLoadBalancerBase)
  3. 每一个worker线程包含一个Load balancer实例(LoadBalancerBase)
  4. 所有线程共享同一个Load balancer实例(ThreadAwareLoadBalancerBase)
  5. 自定义的Load balancer(LoadBalancer)

根据Load balancer所继承的基类就可以知道这个Load balancer所属于的类别,接下来我具体分析下这五个基类。EdfLoadBalancerBase这是借助EDF算法(后面的文章会介绍这个算法)实现对权重的支持,这个类继承自ZoneAwareLoadBalancerBase,所以说支持权重的同时也支持区域感知,区域感知简单来说就是可以将流量分布到和Envoy运行所在区域相同的机器上。LoadBalancerBase继承这个基类的Load balancer是每一个worker线程一个实例,在进行load balancing的时候每一个线程从各自的实例中进行获取,这么做的好处就是避免了锁,但是带来的问题就是存在冷启动的问题,因为load balancer的算法的结果是固定的,所以每一个实例在启动的时候都是会选择相同的机器,如果线程数很多的话会导致启动的时候流量都达到相同的机器上。但是如果是所有的线程共享同一个实例就不会有这个问题,这类load balancer需要继承ThreadAwareLoadBalancerBase,最后一类是继承LoadBalancer,这类load balancer有自己的一整套算法,目前Envoy中主要是subset load balancer,它会根据机器中携带的元信息进行选择。

Envoy中支持的Load balancer

  1. 基于权重的RR
  2. 基于权重的最小连接数
  3. Ring Hash
  4. Maglev
  5. 随机
  6. subset

基于权重的RR和最小连接数是支持区域感知路由的,而且是每一个线程一个load balancer实例,而Ring Hash和Maglev则是全局一个实例并且不支持区域感知,随机则不支持权重,但是支持区域感知。subset则是安全一套自己的算法。

Envoy中关于Load balancing的基本概念

在正式开始分析Envoy中的Load balancing的时候,我们需要介绍下Envoy关于这个部分的一些基本概念,Envoy首先会根据指定的路由规则选取集群,而Load balancing的对象就是集群下面的机器列表。Envoy中有很多概念是为了加强Load balancing机制的,下面我们来一个个介绍下。首先是Priority,一个集群下面可以配置多个Priority,每一个Priority会存在一些机器,是用来表示一组机器的优先级的,默认从0开始,优先级最高。下一个概念就是Locality,用来表示机器所在的位置,主要的用途就是用来实现区域感知路由。最后通过一张图来表示下ClusterPriorityLocalityHost这几个的关系。

cluster-priority.jpg

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
JSON Rust 安全
Istio Ambient Mesh Ztunnel实现剖析(1)配置解析
前言在Istio Ambient Mesh中,社区引入了名为ztunnel的新组件,ztunnel的名字来源于Zero-Trust Tunnel,即零信任管道,Ztunnel 旨在专注于Ambient Mesh中工作负载4层安全能力,例如 mTLS、身份验证、L4 授权,而无需进行七层流量解析。ztunnel 确保流量高效、安全地传输到负责七层处理的Waypoint Proxy或在对端无waypo
566 0
|
存储 Rust 安全
服务网格eBPF应用探索之(一)eBPF基础知识
1)技术背景在eBPF诞生之前,对内核的调试和开发有着相当高的门槛,不仅要十分熟悉庞大的内核代码及开发流程,同时重新编译内核后若希望生效还需要重启OS,开发效率也相当低下。而eBPF提供了相当友好的内核开发/观测机制,即:由用户编写符合一定规范的代码,编译后加载至内核,内核会在指定的时机执行这段代码,内核同时还会将Hook点相关的上下文传递给这段代码供使用,代码可以修改上下文,或是通过返回值来改变
1046 0
服务网格eBPF应用探索之(一)eBPF基础知识
|
12月前
|
存储 负载均衡 算法
一致性哈希汇总
本文介绍了多种一致性哈希算法,包括Consistent Hashing Ring、Rendezvous、Jump、Multi-probe、Maglev、Anchor和Dx。这些算法各有特点,如Jump Hash实现了完美的key分布,而DxHash结合了多种算法的优点,支持动态扩缩容。文章还分析了各算法的性能指标,如内存使用、初始化时间、查询时间和调整集群大小的效率,以及均衡性和单调性。最后讨论了副本、权重和负载均衡策略的应用。
472 62
一致性哈希汇总
|
11月前
|
监控 Java 开发者
源码二次开发真的能提升开发效率与降低成本吗?
源码二次开发是在现有软件源代码基础上进行修改、扩展或定制,以满足新需求或改进功能的过程。这种方式能显著节省时间和成本,提高开发效率,同时支持高度定制,但需注意兼容性、版权和技术债务等问题。
229 0
|
供应链 监控 搜索推荐
ERP系统中的订单管理与供应链协作解析
【7月更文挑战第25天】 ERP系统中的订单管理与供应链协作解析
967 6
|
存储 运维 监控
Entity Framework Core 实现审计日志记录超棒!多种方法助你跟踪数据变化、监控操作,超实用!
【8月更文挑战第31天】在软件开发中,审计日志记录对于跟踪数据变化、监控用户操作及故障排查至关重要。Entity Framework Core (EF Core) 作为强大的对象关系映射框架,提供了多种实现审计日志记录的方法。例如,可以使用 EF Core 的拦截器在数据库操作前后执行自定义逻辑,记录操作类型、时间和执行用户等信息。此外,也可通过在实体类中添加审计属性(如 `CreatedBy`、`CreatedDate` 等),并在保存实体时更新这些属性来记录审计信息。这两种方法都能有效帮助我们追踪数据变更并满足合规性和安全性需求。
489 0
|
负载均衡 算法
Envoy 负载均衡与限流设计
【2月更文挑战第29天】Envoy负载均衡策略包括优先级、恐慌阈值、区域感知和资源限制。它按优先级分配流量,使用恐慌阈值避免健康节点过载,实现区域内的首选服务选择,并通过资源管理限制上游集群的连接和请求数。此外,Envoy提供全局限流功能,在网络和HTTP层面对通信进行控制,确保服务器稳定性。
|
存储 安全 Linux
Envoy源码分析之ThreadLocal机制
# ThreadLocal机制 ​ Envoy中的`ThreadLocal`机制其实就是我们经常说的线程本地存储简称TLS(Thread Local Storage),顾名思义通过TLS定义的变量会在每一个线程专有的存储区域存储一份,访问TLS的时候,其实访问的是当前线程占有存储区域中的副本,因此可以使得线程可以无锁的并发访问同一个变量。Linux上一般有三种方式来定义一个TLS变量。
2081 0
|
存储 Kubernetes API
Kubernetes 的 secret 并不是真正的 secret(下)
Kubernetes 的 secret 并不是真正的 secret
338 0