1. 程式人生 > >百度自動內網流量排程方案解析

百度自動內網流量排程方案解析

從事服務管理、監控、平臺可用性建設相關工作。在分散式系統、大規模資料處理、可用性工程方向有廣泛的實踐經驗。

乾貨概覽

我們在百度自動內網流量排程實踐一文中提到,百度的內網流量由服務模組間的通訊構成。百度內網流量排程要解決的核心問題是:通過控制流量,保障系統的可用性效能

我們的服務部署在多個地域、多個機房中,服務間流量排程可能會在跨地域、跨機房和機房內呼叫場景。本文將詳細介紹百度智慧雲IOP團隊針對服務間流量排程需求提出的解決方案。

流量排程

服務間流量排程的需求&解決思路

服務間流量排程需要滿足以下需求:

  • 跨機房按比例流量排程

由於服務部署在多地域、多機房,在故障止損等流量排程場景,會產生跨機房和跨叢集的流量。因此需要綜合考量

容量跨機房請求的延遲等因素,根據這些因素對系統服務能力的影響,實現按比例的流量排程,使機房間流量與容量匹配,避免服務可用性受損。

大多數情況下, 下游容量的冗餘都可以滿足流量排程的需求。但存在少部分情況,下游冗餘不足以支援全量的上游流量排程,這時需要丟棄多餘的負載。

  • 負載均衡

我們通過按比例流量排程解決了跨機房負載均衡的問題。在叢集內部, 也要保證例項的負載均衡,避免造成慢節點等問題導致服務整體可用性受損。

另外,隨著虛擬化部署的普及,資源得到充分的利用。單個叢集中異構例項的比例有了很大的提升,需要對不同例項設定權值保證容量的匹配。

  • 請求失敗處理

上游的流量需要接入到可用例項上,否則請求失敗會導致可用性受損。

在資源定位過程中,我們提供了可用例項列表。但實際情況是,硬體故障、斷電、軟體bug都會導致例項不可用,造成請求超時或失敗,資源定位並不能實時反饋最新的可用例項資訊。因此,仍然需要在流量接入環節完成不可用例項的剔除,剔除之後選擇新的例項,進行重試。重試的過程中,我們還要通過某些退避策略,避免下游的過載。

因此,需要請求發起方(例如RPC和代理伺服器)具備這些能力。

  • 配額管理和限流

配額管理限流,是系統容量管理和可用性保障的重要手段。

由於業務的複雜性,我們需要從使用者產品源端地址請求週期請求方式等多個維度實現配額能力。

結合配額管理系統,在服務間流量排程環節進行流量統計和控制,可以很好地滿足配額管理和限流的需求。

  • 其它

除以上需求以外,我們還希望能夠統一維護上下游關聯關係、邏輯機房和物理機房對映關係、流量排程的路由關係等元資料,供流量排程的決策過程使用。這部分需求可以用單獨的元資料儲存服務來解決。

服務間流量排程的解決方案

綜合以上需求和解決思路,我們認為實現服務間流量排程的關鍵在於流量配置接入

下面我們以實際的線上服務:事件資料庫為例,解析流量排程的具體實現。

在我們的業務中, 資料儲存和查詢是一種常見的應用。例如我們的報警服務,需要將異常事件資料寫入事件資料庫,供其它服務查詢。事件資料庫提供http API,使用者通過libcurl或其它http client發起請求。

針對業務需求,我們參考了多種開源方案, 並且從效能可用性擴充套件性等方面進行評估,最終決定基於openresty進行二次開發,實現了流量接入層服務:qproxy

openresty是一個基於nginx開發的高效能web平臺,支援使用lua編寫擴充套件,用於實現高併發的web服務和閘道器,並且在百度內網服務中大量應用。openresty的可用性和效能在生產環境下得到了驗證。

考慮到實現的通用和簡單性,我們使用BNS(Baidu Naming Service,百度名字服務)服務完成流量配置資訊的託管分發

BNS是在百度內部通用的名字服務,使用被稱為“服務單元”的運維實體來管理執行的服務例項,提供運維實體的託管和查詢服務,類似的開源實現可以參考consul、etcd。

  • 下游服務端將叢集資訊同步到BNS
    • 包含可用例項服務埠流量排程權值等資訊,還有用於流量排程的路由表,全部託管在BNS服務中。
    • BNS內部實現了流量排程引擎,可以根據路由表和請求來源,返回可用例項列表
  • qproxy定期更新配置資訊
    • 根據BNS返回的可用例項服務埠流量排程權值資訊生成upstream列表並載入。

最終通過調整路由表和流量排程權值,實現按比例流量排程叢集間負載均衡,例如,將33%流量接入downstream.service下游。

內網流量

在這個框架基礎上,我們還實現了流量復丟棄等策略,滿足了容量壓測, 過載保護等需求。

總結

我們在本文中介紹了基於開源模組二次開發的http七層代理服務,結合通用的資源定位和配置分發手段,我們實現了配置和流量接入層的邏輯解耦,用比較簡單可遷移的方式實現了七層流量排程。

原文來自微信公眾號:AlOps智慧運維