1. 程式人生 > >【譯】gRPC負載均衡

【譯】gRPC負載均衡

github bsp 服務器配置 維護 外部 服務 size 響應 均衡器

原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md

gRPC負載均衡


範圍


本文檔解釋了gPRC的負載均衡的設計。

背景


每次調用的負載均衡


值得註意的是gRPC的負載均衡是反生在每次調用的基礎上,而不是每條連接的基礎上。換言之,即使所有請求都來自於同一個客戶端,我們仍舊想要它們被負載到所有的服務器上。

負載均衡的方式


在gPRC的負載均衡之前,先研究一下一些常見的負載均衡方式。

代理模式

代理提供一個可靠的可以上報負載情況到負載均衡系統的客戶端,因為代理會暫時的保留RPC請求和響應的副本,所以通常它們需要更多的資源。這個模式也增加了PRC的延遲。

在考慮到請求壓力較重的服務,例如存儲服務,代理模式被認為是效率低下的。

客戶端感知負載

這個更厚的客戶端將更多的負載均衡邏輯放在客戶端。例如,客戶端會包含許多負載均衡策略(輪詢,隨機等)用於在一個列表中選擇服務。這個模式下,一個由名稱解析系統或外部的負載均衡器等提供的服務器的列表會被靜態的配置在客戶端,這種情況下,客戶端負責從列表中選擇最佳的服務器

這個方法的其中一個缺點是需要編寫和維護包含多種語言或版本的負載均衡策略的客戶端。那些策略可能會非常的復雜。一些算法需要客戶端與服務端的交互,所以客戶端可能需要變得更厚來提供額外的RPC用來健康檢查或從用戶發送的RPC請求中獲取額外的負載信息。

它也會使客戶端的代碼變得復雜:新的設計要隱藏多層負載均衡的復雜性使之就像是一個對於客戶端的簡單的服務端列表。

外部負載均衡服務

客戶端負載均衡代碼保持簡單且可移植,實現了眾所周知的算法(例如:輪詢調度)用於選擇服務。負載均衡器提供更復雜的負載均衡算法。客戶端依賴於負載均衡器提供負載均衡配置以及一個客戶端要發送請求到的服務器列表。當服務不可用或健康問題出現時,均衡器會更新需要均衡負載的服務器列表。負載均衡器會做出任何復雜的必須的決定並通知客戶端。負載均衡器會和後端的服務器交互來收集負載和健康信息。

需求


簡單的API和客戶端


gRPC客戶端負載均衡代碼必須簡單且可移植的。客戶端應該只包含簡單的算法(例如:輪詢調度)來選擇服務器。對於復雜的算法,客戶端應該依賴於一個負載均衡器來提供負載均衡配置和客戶端應該發送請求到的服務器列表。當服務不可用或健康問題出現時,均衡器會更新需要均衡負載的服務器列表。負載均衡器會做出任何復雜的必須的決定並通知客戶端。負載均衡器會和後端的服務器交互來收集負載和健康信息。

安全性


負載均衡器會和後臺服務分開且一個折衷的負載均衡器會導致負載均衡器的負載均衡功能受到損害。換言之,一個折衷的的負載均衡器不應該導致客戶端信任一個(可能是惡意的)後端服務器,而不是在沒有負載均衡的情況下。

架構


綜述


gRPC主要的負載均衡機制是外部負載均衡器,一個外部的負載均衡器提供簡單的客戶端和一個最新的服務器列表

gPRC客戶端提供一個API來支持內置的負載均衡策略,然而,只有很少數(其中一個是grpclb策略實現了一個外部負載均衡器),並且不鼓勵用戶嘗試添加更多的來擴展gRPC。相反的,新的負載均衡策略應該實現在外部的負載均衡器上。

工作流


在名稱解析和服務器鏈接中,負載均衡策略適合gPRC客戶端工作流。以下是它如何工作的:

技術分享圖片

技術分享圖片

1. 啟動時,gPRC客戶端通過服務名發起一個名稱解析請求。名稱會被解析為一個或更多的IP地址,每個地址指明它是一個服務器地址或一個負載均衡器地址,並且包含一個服務器配置指明那一個客戶端的負載均衡策略應該被使用(例如: 輪詢調度或grpclb)

2. 客戶端實現一個負載均衡策略。

  • 註意:如果任何一個被解析器返回的地址是均衡器地址,那麽這個客戶端會使用grpclb策略,而不管請求的服務配置是那種負載均衡策略。否則,客戶端會使用一個請求的服務配置負載均衡策略。如果沒有負載均衡策略,那麽客戶端會使用默認的取第一個可用服務器地址的策略。

3. 負載均衡策略對每一個服務器地址創建一個子通道。

  • 除了grpclb以外的所有策略,這意味每個被解析器返回的地址的子通道。需要註意的是這些策略會忽略任何被解析器返回的均衡器地址。
  • grpclb策略,工作流如下:
    • 這個策略打開一個從解析器返回的均衡器地址之一的流。它使用客戶端請求的服務器名稱請求均衡器來獲取服務器地址(例如: 和傳遞給名稱解析器的相同的名稱)
      • 註意:在grpclb策略中,解析器返回的非解析器地址用於後備來防止在負載均衡策略啟動後沒有均衡器能夠用來交互。
    • 負載均衡器給客戶端指向的gRPC服務器應該在負載均衡器的配置需要報告負載信息信息時報告負載信息給負載均衡器
    • 負載均衡器返回一個服務器列表給gRPC客戶端的grpclb策略。grpclb策略對每個列表中的服務器創建一個子通道。

4. 對於每個PRC發送請求,負載均衡策略決定應該發送到哪個子通道(例如: 哪個服務器)。

  • grpclb策略下,客戶端按負載均衡器返回的順序發送請求到服務器。如果服務器列表為空,調用將會阻塞直到收到一個非空的列表。

【譯】gRPC負載均衡