原文:Load Balancing in gRPC
翻译整理: 陈进涛 译文链接:【译】gRPC负载均衡。 转载请保留原文出处和译文译者和出处。
范围
这篇文档解释了gRPC中的负载均衡设计
背景
基于每次调用的负载均衡
值得注意的是,gRPC中的负载平衡是基于每个调用,而不是基于每个连接。换句话说,即使所有请求都来自一个客户端,我们仍然希望它们在所有服务器上实现负载平衡。
负载均衡方法
在讨论gRPC细节之前,我们先探讨一些实现负载平衡的常用方法。
代理模型
使用代理提供了可靠可信赖的客户端,可以向负载平衡系统报告负载。代理通常需要更多的资源来操作,因为它们有RPC请求和响应的临时副本。此模型还增加了rpc调用的延迟。
代理模式被认为是低效的,当请求像存储这样的“重”服务
平衡自感知客户端
这种“胖”客户端在自身放置了许多负载均衡逻辑。例如,客户端可以包含许多负载均衡策略(Round Robin轮询、随机等等), 通过使用这些策略,客户端从一个列表中选择服务端(servers)。在这种模型中,servers列表要么可以静态配置到客户端,要么可以由名称解析服务提供,或者由外部负载均衡器提供,等等。在任何情况下,由客户端负责从列表中选择首选服务器。
这种方法的其中一个缺点是为多种语言和或版本的客户端编写和维护负载均衡策略。这些策略可能相当复杂。一些算法同时需要客户端和服务端的通信,所以客户端需要变得更“胖”以支持用户rpc请求之外的rpc请求来获得健康和负载的信息。
它还会显著地使客户机的代码复杂化:新的设计隐藏了多层负载平衡的复杂性,并将其作为一个简单的服务器列表呈现给客户机。
外部负载均衡服务
客户端负载平衡代码保持简单和轻便,实现了用于服务器选择的众所周知的算法(例如,轮询调度)。复杂的负载平衡算法由负载平衡器提供。客户端依赖于负载平衡器来提供负载平衡配置,以及客户端应该向其发送请求的服务器列表。负载均衡器根据需要更新服务器列表,以平衡负载并处理服务器不可用或运行状况问题。负载均衡器将做出任何必要的复杂决策并通知客户端。负载平衡器可以与后端服务器通信,以收集负载和运行状况信息。
需求
简单的接口和客户端
gRPC客户端负载平衡代码必须简单轻便。客户端应该只包含用于服务器选择的简单算法(例如,轮询调度)。对于复杂的算法,客户端应该依赖于一个负载均衡器来提供负载平衡配置,以及客户端应该向其发送请求的服务器列表。平衡器将根据需要更新服务器列表,以平衡负载并处理服务器不可用或运行状况问题。负载均衡器将做出任何必要的复杂决策并通知客户端。负载平衡器可以与后端服务器通信,以收集负载和运行状况信息。
安全
负载均衡器可能与实际的服务器后端分离,负载均衡器的破坏只会导致负载均衡功能的破坏。换句话说,与没有负载平衡的可比情况相比,一个损坏的负载均衡器不应该使客户机更信任(潜在恶意的)后端服务器。
架构
一览
gRPC中负载平衡的主要机制是外部负载平衡,其中外部负载平衡器为简单的客户端提供服务器的最新列表。
gRPC客户端确实支持用于内置负载平衡策略的API。 但是,其中只有少数(其中一个是grpclb策略,该策略实现了外部负载平衡),并且不鼓励用户尝试通过添加更多策略来扩展gRPC。 相反,应在外部负载均衡器中实施新的负载均衡策略。
工作流
适合于gRPC客户端工作流的负载均衡策略,运行在名称解析和与服务器的连接之间。运作方式如下:
1.启动时,gRPC客户端发出服务器名称的名称解析请求。 该名称将解析为一个或多个IP地址,每个IP地址将指示它是服务器地址还是负载平衡器地址,以及一个服务配置,该服务配置指示要使用哪种客户端负载平衡策略(例如,round_robin或grpclb )。
2.客户端实例化负载平衡策略。
- 注意:如果解析程序返回的任何地址之一是平衡器地址,则客户端将使用grpclb策略,而不管服务配置请求哪种负载平衡策略。 否则,客户端将使用服务配置请求的负载平衡策略。 如果服务配置未请求任何负载平衡策略,则客户端将默认为选择第一个可用服务器地址的策略。
3.负载平衡策略创建到每个服务器地址的子通道
对于除grpclb以外的所有策略,这意味着解析程序返回的每个地址都有一个子通道。 请注意,这些策略会忽略解析器返回的任何平衡器地址。
对于grpclb策略,工作流程如下:
a. 该策略打开一个流,指向名称解析器返回的其中一个均衡器地址。它向均衡器请求最初由客户端请求的服务器名称对应的服务器地址(即,最初传递给名称解析器的相同名称)
注意:在grpclb策略中,名称解析器返回的非负载均衡器地址用于在启动LB策略后无法连接到均衡器时的回退措施。
b. 如果负载均衡器需要这些信息,那么负载均衡器导向到客户端的gRPC服务器可以将负载上报到负载均衡器。
c. 负载平衡器将服务器列表返回给gRPC客户端的grpclb策略。然后grpclb策略将创建到列表中每个服务器的子通道。
4.对于每一个RPC请求,负载均衡器策略决定RPC应该被发送到哪一个子通道(即:哪一个服务器)
- 在grpclb策略的情况下,客户端将按照负载均衡器返回请求的顺序向服务器发送请求。如果服务器列表为空,调用将阻塞,直到收到一个非空列表。
-------------本文结束,感谢您的阅读-------------