gRPC Load Balancing

翻译自:https://grpc.io/blog/grpc-load-balancing/

这是gRPC负载均衡的第一篇,后续会给出基于golang XDS服务发现的例子,了解golang XDS的工作原理。

本文描述了在部署gRPC时可能会采用的几种负载均衡场景。

大规模gRPC部署下,通常会有大量相同的后端实例以及大量客户端。由于每个服务的容量是有限的,因此会使用负载均衡在可用的服务器之间均衡来自客户端的请求。

为什么使用gRPC

gRPC是一个先进的RPC协议,它是基于HTTP/2实现的。HTTP/2是一个7层协议,运行在TCP协议之上。相比传统的HTTP/REST/JSON机制,gRPC有很多优点,如:

  1. 它使用了二进制协议(HTTP/2)
  2. 在一个连接(HTTP/2)上复用多个请求
  3. 头部压缩(HTTP/2)
  4. 强类型服务和消息定义(Protobuf)
  5. 为多种语言实现了常用的客户端/服务器库

此外,gRPC无缝集成了如服务发现,命名解析,负载均衡,追踪和监控等生态组件。

负载均衡选项

代理负载均衡还是客户端侧负载均衡?

注:某些文章中会把代理负载均衡称为服务端侧负载均衡。

使用代理负载均衡还是客户端测负载均衡是一个主要的架构上的抉择。使用代理负载均衡时,客户端会像负载均衡(LB)代理发起RPCs,LB会将RPC请求分发到实现了该调用的可用的后端服务器上。LB会持续跟踪每个后端,并实现公平分配负载的算法。客户端本身并不知道后端服务的信息。客户端可能是不可信的。该架构通常用于面向用户的服务,开放网络下的客户端可以连接到数据中心的服务器上,如下图所示,这种场景下,客户端会像LB发生请求(#1),LB将请求分发给某个后端(#2),最后后端将结果返回给LB(#3)。

当使用客户端侧的负载均衡时,客户端会知道多个后端服务器的情况,然后为每个RPC从中选择一个处理服务器。客户端会从后端服务器接收RPC结果,且客户端会实现负载均衡算法。在更简单的配置中,可以不考虑服务器负载,客户端仅需要在可用的服务器之间进行轮询即可。如下图,客户端会向指定的服务器发送请求(#1),后端会相应负载信息(#2),客户端通常会在相同的连接上执行RPC。客户端负责更新内部状态。

下表展示了每种模型的优劣势:

Proxy Client Side
优势 简化客户端配置
客户端侧无需了解后端信息
可以配合不可信的客户端
由于消除了多余的条数,提升了性能
劣势 LB位于数据路径上
较高的延迟
LB的吞吐量可能会限制可扩展性
复杂的客户端
客户端需要持续跟踪服务端的负载和健康情况
客户端需要实现负载均衡
每个语言的实现和维护负担
需要可信的客户端,或信任边界需要由备用的LB进行处理

代理负载均衡选项

代理负载均衡可以工作在L3/L4或L7。在传输层的负载均衡,服务端会终止TCP连接,然后打开到选择的后端的另外一个连接。应用数据(HTTP/2个gRPC帧)会在客户端连接和后端连接之间进行拷贝。相比L7 LB,L3/L4 LB仅会进行很少的处理,且消耗的资源也更少。

在使用L7负载均衡时,LB会终结连接并解析HTTP/2协议。LB会检查每个请求并根据请求内容将其分配给一个后端。例如,带session cookie的HTTP首部可以关联一个特定的后端,因此该session的所有请求都会被该后端处理。一旦LB选择了一个合适的后端,它会跟这个后端创建一条新的HTTP/2连接,然后转发接收到的客户端到该后端的HTTP/2流。使用HTTP/2,LB可以将一个客户端的流分配给多个后端。

L3/L4 vs L7
使用场景 建议
RPC的负载在连接之间变化很大 使用应用层的LB
存储或计算亲和性比较重要 使用应用层LB,并使用cookie类似的功能来路由请求到正确的后端
减小代理的资源利用率比使用其特性更重要 使用L3/L4 LB
注重延迟 使用L3/L4 LB

客户端侧的LB选项

胖客户端

胖客户端方式意味着在客户端实现负载均衡。客户端负责持续跟踪可用的服务器,以及服务器负载,并实现选择服务器的算法。客户端通常会集成与其他基础设施通信的库,如服务发现,命名解析,配额管理等。

备用负载均衡

注:备用负载均衡也被称为外部负载均衡或单路并联负载均衡

使用备用负载均衡时,会将其实现为一个特定的LB服务器。客户端或请求备用LB,备用LB会返回最合适的服务器。在后备LB中实现了跟踪服务器状态和LB算法实现的繁重工作。注意,客户端可能会选择在LB中实现的复杂算法之上实现简单算法。gRPC为该模型定义了一个协议,用于客户端和LB之间的通信,参见 doc

下图展示了这种方式。客户端从备用LB中获得至少一个地址(#1),客户端会使用该地址发起RPC(#2),服务器会将结果发送给LB(#3),备用LB会与其他基础设施通信,如命名解析,服务发现等(#4)。

建议和最佳实现

基于特定部署和限制,建议如下:

配置 建议
客户端和服务器之间流量很高
客户端可信
使用胖客户端负载均衡
客户端侧使用ZooKeeper/Etcd/Consul/Eureka,ZooKeeper example
传统配置--很多客户端连接到位于代理之后的服务
服务器和客户端之间需要配置信任边界
代理负载均衡
L3/L4 LB,使用GCLB
L3/L4 LB,使用haproxy - config file
Nginx
如果需要会话粘性,可以使用Envoy L7 LB作为代理
微服务,数据中心有N个客户端,N个服务器
很高的性能要求(低延迟,大流量)
客户端可能是不可信的
备用负载均衡
客户端侧LB,使用 gRPC-LB protocol
现有的服务网格,例如使用Linkerd或Istio进行的设置 Service Mesh
使用内置的LB,如 Istio, 或Envoy.

gRPC Load Balancing的更多相关文章

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

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

  2. 【架构】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 ...

  3. 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 ...

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

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

  5. UVA 12904 Load Balancing 暴力

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

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

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

  7. [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 ...

  8. 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 ...

  9. Network Load Balancing Technical Overview--reference

    http://technet.microsoft.com/en-us/library/bb742455.aspx Abstract Network Load Balancing, a clusteri ...

随机推荐

  1. draggable()拖拽时限制移动区域

    jQuery-UI为我们提供了一个非常便捷的拖拽方法:draggable(),在使用此方法时,我们可能会希望控件只在某一区域中移动,不能被拖出边界,这样的话我们可以使用下面的方法: 调用draggab ...

  2. Matplotlib处理csv文件

    csv模块包含在python标准库中,可用于分析CSV文件中的数据行,让我们能够快速提取感兴趣的值.首先绘制一个简单的折线图: 1 #!usr/bin/env python 2 #*-*Coding= ...

  3. 安装篇二:CentOS 6.9系统安装

    具体安装流程,请查下面安装图片 安装时五个选项说明如下:                                                                  

  4. Django中关于“CSRF verification failed. Request aborted”的问题

    遇到该问题的情境 在Django中采用Ajax提交表单,涉及到跨域问题. 解决措施 在html页面中的表单内添加如下代码: {% csrf_token %} 在视图函数所在的py文件中添加如下代码: ...

  5. 返回前端页面的属性名称和实体类的名称不一致用@JsonProperty

    场景:比如前端要求你返回一个json数据类型,但是这个json类型的里面属性有的值重复了,比如 { name:zhangsan, age:12, teacher:[ name:Mrs Liu subj ...

  6. ElasticSearch设置用户名密码访问

    版本号:7.3.1 1.需要在配置文件中开启x-pack验证, 修改config目录下面的elasticsearch.yml文件,在里面添加如下内容,并重启. xpack.security.enabl ...

  7. Oracle dd-m月-yy转yyyy-mm-dd

    表名称:TEST_LP 字段:PROD_DATE 1 SELECT '20' || SUBSTR(T.PROD_DATE, INSTR(T.PROD_DATE, '-', 1, 2) + 1, 2) ...

  8. 分布式零基础之--分布式CAP理论

    研究到分布式系统CAP理论,记录下来下回详细分析它: CAP是指三个单词的简称 C: 一致性(Consistence) 所有节点访问的都是同一份最新的数据副本. A: 可用性(Availability ...

  9. java数组之binarySearch查找

    /** * 1.如果找到目标对象则返回<code>[公式:-插入点-1]</code> * 插入点:第一个大与查找对象的元素在数组中的位置,如果数组中的所有元素都小于要查找的对 ...

  10. springboot 启动jar正确方式

    首先需要pom.xml配置一个插件: IDEA 在右侧执行顶上m图片按钮 在command Line 中执行clean package命令 执行打包注意 打完jar包后最好解压jar查看一下META- ...