背景

基于每次调用的负载均衡

需要注意的是,gRPC的负载均衡发生在每次调用时,而不是每次连接时。换句话说,就算所有的请求来自于同一个客户,我们也希望可以将它们负载均衡到所有的服务器。

负载均衡的方法

在讨论gRPC所使用的负载均衡之前,我们讨论一下常规的负载均衡方式。

代理方式

使用代理作为可信任的客户端,向负载均衡系统发送请求。因为它们需要有RPC请求和回复的临时副本,代理通常需要更多的资源来进行这个操作。这个也会增加RPCs请求的延迟。代理模式在处理heavy services (像存储)一类的时,被认为是低效的。

客户端处理负载均衡

复杂的客户端可以有负载均衡的逻辑。例如,客户端可以有许多负载均衡的算法(轮询,随机等)来从一组服务器中选择一个来发送请求。这组服务器可以是直接在客户端进行静态配置,通过name resolution系统提供,或者通过一个外部的负载均衡器来提供。无论是哪种方式,客户端需要从一组服务器中选择一个来发送请求。

这种方式有一个缺点,你需要维护多个语言,甚至每个语言多个版本的负载均衡算法,这些算法可能很复杂。一些算法需要客户端和服务端进行通信,来获取服务器的健康状态和负载信息,这些都会使客户端的逻辑变得更复杂,而不只是发送客户的rpc请求。

外部负载均衡服务

这种方式下,客户端会有比较简单和可移植性的代码,会实现一些用于服务器选择的很常用的算法(例如轮询)。复杂的负载均衡算法由负载均衡器来实现,并提供给客户端会用。客户端依赖于负载均衡器来获取负载均衡的配置信息和一组可以用来处理客户rpc请求的服务器列表。负载均衡器可能会收集服务器的负载和健康状态信息,处理这些信息,然后均衡器通过更新服务器列表来均衡负载。在必要的时候,均衡器会把这些修改告知给客户端。

构架

概况

当前grpc负载均衡的主要机制是外部负载均衡,也就是说使用外部负载均衡服务来提供一组可用的服务器。

当前grpc的做法是,客户端自带很少的一些负载均衡策略,复杂的负载均衡策略依赖于外部负载均衡服务。

工作流

复杂均衡的策略通过如下方式集成到name resolution和连接服务端之间的客户端工作流中。下面是其工作方式:

  1. 开始时,grpc客户端使用服务器名发送一个name resolution的请求。这个名字将会解析成一个或者多个IP地址,每一个地址会指出这个是一个服务器地址还是一个负载均衡器地址,还会返回一个服务器配置,用来给出使用哪种客户端负载均衡策略(例如round_robin或者grpclb)。
  2. 客户端创建这个负载均衡的实例。

    注意:如果resolver返回的任意一个地址是负载均衡器的地址,那么客户端将会使用grpclb的负载均衡策略,而不是关心服务器配置上给出的负载均衡策略, 否则客    户端会使用服务器配置上给出的负载均衡策略. 如果服务器配置上没有给出负载均衡策略,那么客户端将会使用默认策略,也就是选择第一个可用的服务器地址.

    3. 负载均衡策略创建一个子管道到每一个服务器地址

    (1) 对于除了grpclb之外的所有策略,这意味着根据resolver返回的每一个地址,创建一个子管道. 注意,这些策略会忽略resolver返回的负载均衡器的地址.

    (2) 对于grpclb策略,工作流如下:

      a. 客户端从resolver返回的负载均衡器地址中选择一个创建数据流. 客户端询问询问负载均衡器, 获取可以用于服务的服务器地址(针对于之前请求的服务器

        名, 即最初传入name resolver那个服务器名).

        注:在grpclb策略中,可以返回不是负载均衡器的地址,这个用来防止连不上负载均衡器.

      b. 如果负载均衡器调度需要的话, 客户端连接的服务器可能会向负载均衡器发送负载相关的信息.

      c. 负载均衡器向grpc客户端的grpclb模块返回服务器列表. grpclb模块然后和返回的服务器列表中的每个服务器创建一个子管道.

   4. 对于每一个rpc请求, 负载均衡策略决定使用哪个子管道发送这个请求.

    在grpclb策略中, 客户端会按照负载均衡器返回的服务器列表中的顺序发送请求. 如果服务器列表为空, 这个调用将会阻塞, 一直等到存在可用的服务器为止.

Load Balancing in gRPC的更多相关文章

  1. gRPC Load Balancing

    gRPC Load Balancing 翻译自:https://grpc.io/blog/grpc-load-balancing/ 这是gRPC负载均衡的第一篇,后续会给出基于golang XDS服务 ...

  2. Load Balancing with NGINX 负载均衡算法

    Using nginx as HTTP load balancer Using nginx as HTTP load balancer http://nginx.org/en/docs/http/lo ...

  3. 【架构】How To Use HAProxy to Set Up MySQL Load Balancing

    How To Use HAProxy to Set Up MySQL Load Balancing Dec  2, 2013 MySQL, Scaling, Server Optimization U ...

  4. CF# Educational Codeforces Round 3 C. Load Balancing

    C. Load Balancing time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  5. Codeforces Educational Codeforces Round 3 C. Load Balancing 贪心

    C. Load Balancing 题目连接: http://www.codeforces.com/contest/609/problem/C Description In the school co ...

  6. UVA 12904 Load Balancing 暴力

    Load Balancing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vi ...

  7. Load Balancing 折半枚举大法好啊

    Load Balancing 给出每个学生的学分.   将学生按学分分成四组,使得sigma (sumi-n/4)最小.         算法:   折半枚举 #include <iostrea ...

  8. [zz] pgpool-II load balancing from FAQ

    It seems my pgpool-II does not do load balancing. Why? First of all, pgpool-II' load balancing is &q ...

  9. How Network Load Balancing Technology Works--reference

    http://technet.microsoft.com/en-us/library/cc756878(v=ws.10).aspx In this section Network Load Balan ...

随机推荐

  1. jQuery 取值操作

    模板使用: https://startbootstrap.com/themes/sb-admin-2/ 使用的 bootstrap 模块 ,上面的这个网站可以下载 select 取值 <sele ...

  2. 用python批量下载图片

    一 写爬虫注意事项 网络上有不少有用的资源, 如果需要合理的用爬虫去爬取资源是合法的,但是注意不要越界,前一阶段有个公司因为一个程序员写了个爬虫,导致公司200多个人被抓,所以先进入正题之前了解下什么 ...

  3. Nginx修改时间戳

    1.安装nginx,注意不要安装nginx-common或者nginx-full sudo apt-get install nginx sudo apt-get install nginx-commo ...

  4. Python - importlib 模块

    importlib 模块可以根据字符串来导入相应的模块 目录结构: 在根目录下创建 importlib_test.py 和 aaa/bbb.py bbb.py: class Person(object ...

  5. Spark实战系列目录

    1 Spark rdd -- action函数详解与实战 2 Spark rdd -- transformations函数详解与实战(上) 3 Spark rdd -- transformations ...

  6. oracle 高级用法, DECODE 排序, OVER(PARTITION BY X ORDER BY Y DESC) 开窗函数

    场景 01 (IN 语句 排序 decode() 函数): 1,我们在查询中会经常使用这样的用法, select * from table_name t where t.id in (1, 3, 7, ...

  7. cshtml 中的 AppState = Context.Application 和 控制器中的 Application 也相等

    AppState = Context.Application @{ ViewBag.Title = "Home Page"; AppState["s1"] = ...

  8. ECharts 避免变窄

    var roomPercentChart = echarts.init(document.getElementById('room_percent')); function ajaxGetRoomPe ...

  9. 如何改变 select 元素的高度

    mozilla 对于美化 select 元素的样式有这样一段描述(用 CSS 美化 Select 元素): 众所周知,select 元素很难用 CSS 进行高效的设计.你可以影响任何元素的某些方面 - ...

  10. Python2 和 Python3区别

    字符串类型不同 py3: str bytes py2: unicode str 默认解释器编码 输入输出 int int long 除法 range和xrang 模块和包 字典 keys py2:列表 ...