背景

基于每次调用的负载均衡

需要注意的是,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. Java学习-059-Jsoup爬虫获取中国所有的三级行政区划数据(四),生成相应的 JSON 数据并输出

    还是直接上马,对应的源码如下所示: 生成的三级行政区划部分 JSON 数据如下所示:

  2. 012-MySQL 索引添加以及优化说明

    一.索引概述 数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度. 如果查询语句使用索引(通常是wher ...

  3. html5 video标签播放视频流

    从文件服务器读取音视频文件,以流的方式传给前台,并能够播放视频. 做了一个demo,用html5的video,audio标签实现. 后台实现代码: @GetMapping(value = " ...

  4. ssh_exchange_identification: read: Connection reset by peer 解决思路

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Jdk_yxs/article/deta ...

  5. DRF概述

    目录 一. REST 1. 什么是编程? 2. 什么是REST? 二. 知识准备 1. CBV(class based view) 2. 类方法 classmethod和classonlymethod ...

  6. 【Spring Boot学习之八】发布打包

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.打jar类型1.指定主程序入口,否则运行报错:没有主清单属性pom.xml: <build> < ...

  7. mysql 5.7开启sql日志的配置

    今天把数据库换成了5.7的,想查通过sql日志定位下问题,但是发现和以前的方式不一样了,特意记录下来 通过开启mysql的日志功能,可以记录所有别执行过的sql语句记录,便于维护数据库数据. 在数据库 ...

  8. C# 拷贝文件夹到指定文件夹并更改文件夹名称

    using System; using System.Collections.Generic; using System.Text; namespace ClientPrintServer.Tools ...

  9. SQL"已更新或者删除的行值要么不能使该行成为唯一行,要么改变了多个行(X行)“解决办法

    这种问题大多是由于没有主键(PK)导致同一张表中存在若干条相同的数据.DBMS存储时,只为其存储一条数据,因为DBMS底层做了优化,以减少数据冗余.所以删除或更新一条重复数据就牵一发而动全身. 解决方 ...

  10. PHP 跨域资源共享 CORS 设定

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...