xDS标准引入gRPC生态

gRPC小组正在努力扩展当前的gRPCLB功能。其不再使用自定义负载均衡协议,而是采用基于Envoy xDS API的xDS协议。这将允许与支持xDS API的开源控制
平面(例如Istio Pilot,go-control-plane和java-control-plane)进行交互。其他优化如下所示:

  • 更加灵活和先进的负载均衡策略配置功能
  • 基于LRS(负载报告服务)的负载报告功能等

客户端侧实现的xDS负载均衡插件与当前的gRPCLB协议不兼容。因此,我们可以认为当前的gRPCLB实现已被废弃。我们正在积极致力于新协议的推进。预计在接下来的几
个季度中会看到更多的进展,其中包括有关新设计的gRFC。下述将介绍gRPC关于负载均衡的设计。


一、需求背景

值得注意的是,gRPC中的负载均衡是在每个调用而不是每个连接的基础上进行的。 换句话说,即使所有请求都来自单个客户端,我们仍然希望在所有服务器之间实现负载均衡。

负载均衡方案

在介绍gRPC之前,我们将探讨一些常用的方法来实现负载平衡。

  1. 代理模式

该方案使用代理来提供稳定可靠的客户端,其可以将负载报告上报给负载均衡系统。 代理通常需要更多资源以维持运行,因为它们需要保存RPC请求和响应的临时副本。
此模型还增加了RPC的延迟。

在高并发应用场景下(例如存储),代理模型效率比较低下。

  1. 客户端动态均衡

该方案将大多的负载均衡逻辑放置在客户端侧。例如,客户端可能包含许多用于服务器的负载均衡策略(如Round Robin,Random等)。
在该方案中,服务器列表将由名称解析系统(如DNS等解析),或者由外部负载均衡器等静态配置,无论如何,客户端负责从列表中选择首选服务器。

这种方案的缺点之一是以多种语言/版本的客户端维护负载均衡策略。这些策略可能相当复杂。一些算法还需要客户端与服务器之间的通信,因此,除了
RPC用于用户请求之外,客户端可能变得更加厚重,以满足获取运行状况或加载信息等需求。

这将使客户端的代码复杂化:新的设计需要隐藏多层负载均衡的复杂性,而将其以简单的服务器列表反馈给客户端。

  1. 外部负载均衡服务

客户端负载均衡代码保持简洁且可移植,实现选择服务器的通用算法(如Round Robin等)。复杂的负载均衡算法由外部负载均衡器提供。客户端依靠
外部负载均衡器提供负载均衡配置以及客户端应向其发送请求的服务器列表。均衡器根据需要更新服务器列表,并且负责处理服务器不可用或运行故障等问题。负载均
衡器将做出最终研判,并通知客户端。负载均衡器可以与后端服务器通信以收集负载和健康等信息。


二、要求

简洁的API和客户端

gRPC客户端的负载均衡代码必须保持简洁且可移植性。客户端应仅包含用于选择服务器的简单算法(如Round Robin等)。对于复杂算法,客户端应依靠负载均衡器来提供
以及客户端应向其发送请求的服务器列表。均衡器将根据需要更新服务器列表,并且负责处理服务器不可用或运行故障等问题。负载均衡器将做出最终研判,并通知客户。
负载均衡器可以与后端服务器通信以收集负载和健康等信息。

安全

负载均衡器可能与实际的服务器后端分离,并且负载均衡器的安全风险仅局限于负载均衡组件。换句话说,与没有负载均衡功能的相比,受到攻击的负载均衡器
应该不能让客户端取信(可能是恶意的)后端服务器。


架构

gRPC中负载均衡的主要机制是外部负载均衡,其中外部负载均衡器为客户端提供服务器的最新列表。

gRPC客户端支持用于操作内置负载均衡策略的API。 其中只有少数支持(如grpclb策略,该策略支持外部负载均衡),但是不鼓励用户通过添加
更多代码来扩展gRPC。 而是,推荐用户在外部负载均衡器中实现新的负载均衡策略。

工作流程

在域名解析和与服务器的连接之间,负载均衡策略适配gRPC客户端工作流。 运作方式如下:

1.在启动时,gRPC客户端发出域名解析请求,解析服务器名称。该名称将解析为一个或多个IP地址,每个都将指示它是服务器地址还是一个负载均衡器地址及
一个服务配置(标明使用的客户端负载均衡策略,如round_robin或grpclb等)。

2.负载均衡策略

注意:如果解析程序返回的地址中的任何一个是负载均衡器地址,那么客户端将使用grpclb策略,无论服务配置请求什么负载均衡策略。
否则,客户端将使用请求的负载均衡策略进行服务配置。如果未请求负载平衡策略通过服务配置,客户端将使用策略选择第一个可用的服务器地址。

3.负载均衡策略为每个服务器实例创建了一个子通道

  • 对于所有策略(grpclb除外),这意味着解析器返回的每个地址都有一个子通道。 请注意,这些策略会忽略解析器返回的任何均衡器地址。
  • 对于grpclb策略,工作流程如下:
    1. 该策略在解析器返回的均衡器地址间开辟一个流通道。它需要均衡器提供服务器地址以用于客户端最初发起请求。
      注意:在grpclb策略中,在负载均衡策略启动时,如果没有均衡器可以正常通信,那么返回的非负载均衡器地址可以作为后备选项。
        2.负载均衡器将客户端定向到的gRPC服务器,gRPC服务器根据负载均衡器的配置,可以向其上报负载等信息。
        3.负载均衡器将服务器列表返回到gRPCgrpclb策略的客户端,然后,grpclb策略将为列表中的每个服务器建立子通道。

4.对于每个发送的RPC,负载均衡策略决定RPC应该发送到的哪个子通道(哪个服务器)。

  • 对于grpclb策略,客户端将把请求发送到服务器。如果服务器列表为空,则呼叫阻塞,直到出现非空。

参考资料