Envoy源码分析之Load balancing基础

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月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

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
4月前
|
负载均衡 算法 网络协议
gRPC Load Balancing
gRPC Load Balancing
64 5
|
4月前
|
微服务 Windows
【Azure微服务 Service Fabric 】在SF节点中开启Performance Monitor及设置抓取进程的方式
【Azure微服务 Service Fabric 】在SF节点中开启Performance Monitor及设置抓取进程的方式
|
负载均衡 应用服务中间件 Nacos
最全解决:微服务之间调用出现Load balancer does not have available server for client
最全解决:微服务之间调用出现Load balancer does not have available server for client
2146 1
最全解决:微服务之间调用出现Load balancer does not have available server for client
|
负载均衡 算法 Java
Ribbon 核心组件 IRule|学习笔记
快速学习 Ribbon 核心组件 IRule
|
运维 算法 Cloud Native
Envoy Adaptive-Concurrency Filter浅解
1. Why在通常情况下,我们希望服务在超出负载能力时能主动拒绝掉超额的请求,从而防止服务被击垮。达到这一目的传统手段是使用熔断能力,通过服务网格的DestinationRule可以配置基础的熔断能力,但这要求用户必须给出一个触发熔断的阈值,例如给出具体的pending requests数量,服务网格数据平面将在网络访问超出熔断配置时拒绝请求。这种做法对运维人员提出了要求:必须事先知道或估算出服务
438 0
Envoy Adaptive-Concurrency Filter浅解
|
Kubernetes 负载均衡 监控
kube-proxy源码分析:深入浅出理解k8s的services工作原理
在进行k8s实践中, services 是经常碰到的资源对象,services 充当了 k8s 集群 pod 服务抽象的功能,为后端pod 提供了负载均衡和服务发现,那他到底是如何工作的呢,这里从 services 的具体实现 kube-proxy 出发解读 services 的工作机制。
2355 1
kube-proxy源码分析:深入浅出理解k8s的services工作原理
|
存储 网络协议 前端开发
Envoy源码分析之Stats基础
# 简介 Envoy官方文档中提到`One of the primary goals of Envoy is to make the network understandable`,让网络变的可理解,为了实现这个目标Envoy中内置了`stats`用于统计各类网络相关的指标,Envoy没有选择使用`Prometheus`SDK,而是选择自己实现了`stats`,[目的是为了适配Envoy的线
1639 0
Envoy源码分析之Stats基础
|
存储 缓存 安全
Envoy源码分析之Stats Scope
# Scope 在上一篇文章中提到Envoy中通过`Scope`来创建`Metrics`,为什么要搞一个`Scope`的东西出来呢?`Scope`诞生的目的其实是为了更好的管理一组`stats`,比如关于集群的`stats`,这类`stats`的名称有个特点就是都是以`cluster.`作为前缀,那么可以以`cluster.`来创建一个`Scope`,这样就可以通过这个`Scope`来管理
1111 0
|
存储 Web App开发 Linux
Envoy源码分析之Stats符号表
# Symbol 在前面几篇文章中我们介绍了`Scope`,通过`Scope`可以使得我们共享相同的`stats`前缀,例如下面两个stats, ![share-scope.jpg](https://ata2-img.cn-hangzhou.oss-pub.aliyun-inc.com/db6cfdfa57dd322f79dd87c89b354dff.jpg) 这两个stats可
980 0
|
消息中间件 运维 Linux
下一篇
DataWorks