【譯】gRPC負載均衡

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

gRPC負載均衡


範圍


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

背景


每次調用的負載均衡


值得注意的是gRPC的負載均衡是發生在每次調用的基礎上,而不是每條鏈接的基礎上。換言之,即便全部請求都來自於同一個客戶端,咱們仍舊想要它們被負載到全部的服務器上。github

負載均衡的方式


在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策略下,客戶端按負載均衡器返回的順序發送請求到服務器。若是服務器列表爲空,調用將會阻塞直到收到一個非空的列表。
相關文章
相關標籤/搜索