Envoy源码分析之Load balancing基础-阿里云开发者社区

开发者社区> jeff216> 正文

Envoy源码分析之Load balancing基础

简介: # 什么是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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
k8s与网络--Flannel源码分析
之前在k8s与网络--Flannel解读一文中,我们主要讲了Flannel整体的工作原理。今天主要针对Flannel v0.10.0版本进行源码分析。首先需要理解三个比较重要的概念: 网络(Network):整个集群中分配给 flannel 要管理的网络地址范围 子网(Subnet):flanne.
1604 0
深度分析Java的ClassLoader机制(源码级别)
深度分析Java的ClassLoader机制(源码级别) 写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoader的loadClass()方法来加载class的,loadClass使用双亲委派模式。
1248 0
[Android]从Launcher开始启动App流程源码分析
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5017056.html 从Launcher开始启动App流程源码分析 com.
601 0
网络安全数据包分析
preface,数据库分析; 1,nmap
477 0
android(cm11)状态栏源码分析(一)
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50216563 (一):写在前面 最近由于工作需要,需要了解CM11中的有关于StatusBar相关的内容。
932 0
golang 系列:RWMutex 读写锁分析
在上一篇文章 [golang 重要知识:mutex](https://blog.csdn.net/h_l_f/article/details/118462433) 里我们介绍了互斥锁 mutex 的相关原理实现。而且在 Go 里除了互斥锁外,还有读写锁 RWMutex,它主要用来实现读共享,写独占的功能。今天我们也顺便分析下读写锁,加深对 Go 锁的理解。
30 0
+关注
jeff216
专注与Linux C++、Linux内核、高性能网络编程、DevOps、Docker等
16
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载