美團下一代服務治理系統 OCTO2.0 的探索與實踐
本文根據美團基礎架構部服務治理團隊工程師郭繼東在2019 QCon(全球軟體開發大會)上的演講內容整理而成,主要闡述美團大規模治理體系結合 Service Mesh 演進的探索實踐,希望對從事此領域的同學有所幫助。
一、OCTO 現狀分析
已成為美團高度統一的服務治理技術棧,覆蓋了公司90%的應用,日均呼叫超萬億次。
經歷過大規模的技術考驗,覆蓋數萬個服務/數十萬個節點。
協同周邊治理生態提供的治理能力較為豐富,包含但不限於 SET 化、鏈路級複雜路由、全鏈路壓測、鑑權加密、限流熔斷等治理能力。
一套系統支撐著多元業務,覆蓋公司所有事業線。
目前美團已經具備了相對完善的治理體系,但仍有較多的痛點及挑戰:
對多語言支援不夠好。美團技術棧使用的語言主要是 Java,佔比到達80%以上,上面介紹的諸多治理能力也集中在 Java 體系。但美團同時還有其他近10種後臺服務語言在使用,這些語言的治理生態均十分薄弱,同時在多元業務的模式下必然會有增長的多語言需求,為每一種語言都建設一套完善的治理體系成本很高,也不太可能落地。
中介軟體和業務繫結在一起,制約著彼此迭代。一般來說,核心的治理能力主要由通訊框架承載,雖然做到了邏輯隔離,但中介軟體的邏輯不可避免會和業務在物理上耦合在一起。這種模式下,中介軟體引入Bug需要所有業務配合升級,這對業務的研發效率也會造成損害;新特性的釋出也依賴業務逐個升級,不具備自主的控制能力。
異構治理體系技術融合成本很高。
治理決策比較分散。每個節點只能根據自己的狀態進行決策,無法與其他節點協同仲裁。
針對以上痛點,我們考慮依託於 Service Mesh 解決。Service Mesh 模式下會為每個業務例項部署一個 Sidecar 代理,所有進出應用的業務流量統一由 Sidecar 承載,同時服務治理的工作也主要由 Sidecar 執行,而所有的 Sidecar 由統一的中心化控制大腦控制面來進行全域性管控。這種模式如何解決上述四個問題的呢?
Service Mesh 模式下,各語言的通訊框架一般僅負責編解碼,而編解碼的邏輯往往是不變的。核心的治理功能(如路由、限流等)主要由 Sidecar 代理和控制大腦協同完成,從而實現一套治理體系,所有語言通用。
中介軟體易變的邏輯儘量下沉到 Sidecar 和控制大腦中,後續升級中介軟體基本不需要業務配合。SDK 主要包含很輕薄且不易變的邏輯,從而實現了業務和中介軟體的解耦。
新融入的異構技術體系可以透過輕薄的 SDK 接入美團治理體系(技術體系難相容,本質是它們各自有獨立的執行規範,在 Service Mesh 模式下執行規範核心內容就是控制面和Sidecar),目前美團線上也有這樣的案例。
控制大腦集中掌控了所有節點的資訊,進而可以做一些全域性最優的決策,比如服務預熱、根據負載動態調整路由等能力。
總結一下,在當前治理體系進行 Mesh 化改造可以進一步提升治理能力,美團也將 Mesh 化改造後的 OCTO 定義為下一代服務治理系統 OCTO2.0(內部名字是OCTO Mesh)。
二、技術選型及架構設計
2.1 OCTO Mesh 技術選型
OCTO 體系已經歷近5年的迭代,形成了一系列的標準與規範,進行 Service Mesh 改造治理體系架構的升級範圍會很大,在確保技術方案可以落地的同時,也要遮蔽技術升級或只需要業務做很低成本的改動。
治理能力不能減弱,在保證對齊的基礎上逐漸提供更精細化、更易用的運營能力。
能應對超大規模的挑戰,技術方案務必能確保支撐當前量級甚至當前N倍的增量,系統自身也不能成為整個治理體系的瓶頸。
儘量與社群保持親和,一定程度上與社群協同演進。
針對上述考量,我們選擇的方式是資料面基於 Envoy 二次開發,控制面自研為主。
截止發稿前,美團容器化主要採用富容器的模式,這種模式下強行與 Istio 及 Kubernetes 的資料模型匹配改造成本極高,同時 Istio API也尚未確定。
截止發稿前,Istio 在叢集規模變大時較容易出現效能問題,無法支撐美團數萬應用、數十萬節點的的體量,同時數十萬節點規模的 Kubernetes 叢集也需要持續最佳化探索。
Istio 的功能無法滿足 OCTO 複雜精細的治理需求,如流量錄製回放壓測、更復雜的路由策略等。
專案啟動時非容器應用佔比較高,技術方案需要相容存量非容器應用。
2.2 OCTO Mesh 架構設計
上面這張圖展示了 OCTO Mesh 的整體架構。從下至上來看,邏輯上分為業務程式及通訊框架 SDK 層、資料平面層、控制平面層、治理體系協作的所有周邊生態層。
OCTO Proxy (資料面Sidecar代理內部叫OCTO Proxy)與業務程式採用1對1的方式部署。
OCTO Proxy 與業務程式採用 UNIX Domain Socket 做程式間通訊(這裡沒有選擇使用 Istio 預設的 iptables 流量劫持,主要考慮美團內部基本是使用的統一化私有協議通訊,富容器模式沒有用 Kubernetes 的命名服務模型,iptables 管理起來會很複雜,而 iptables 複雜後效能會出現較高的損耗。);OCTO Proxy 間跨節點採用 TCP 通訊,採用和程式間同樣的協議,保證了客戶端和服務端具備獨立升級的能力。
為了提升效率同時減少人為錯誤,我們獨立建設了 OCTO Proxy 管理系統,部署在每個例項上的 LEGO Agent 負責 OCTO Proxy 的保活和熱升級,類似於 Istio 的 Pilot Agent,這種方式可以將人工干預降到較低,提升運維效率。
資料面與控制面透過雙向流式通訊。路由部分互動方式是增強語義的 xDS,增強語義是因為當前的 xDS 無法滿足美團更復雜的路由需求;除路由外,該通道承載著眾多的治理功能的指令及配置下發,我們設計了一系列的自定義協議。
控制面(美團內部名稱為Adcore)自研為主,整體分為:Adcore Pilot、Adcore Dispatcher、集中式健康檢查系統、節點管理模組、監控預警模組。此外獨立建設了統一後設資料管理及 Mesh 體系內的服務註冊發現系統 Meta Server 模組。每個模組的具體職責如下:
Adcore Pilot 是個獨立叢集,模組承載著大部分核心治理功能的管控,相當於整個系統的大腦,也是直接與資料面互動的模組。
Adcore Dispatcher 也是獨立叢集,該模組是供治理體系協作的眾多子系統便捷接入 Mesh 體系的接入中心。
不同於 Envoy 的 P2P 節點健康檢查模式,OCTO Mesh 體系使用的是集中式健康檢查。
控制面節點管理系統負責採集每個節點的執行時資訊,並根據節點的狀態做全域性性的最優治理的決策和執行。
監控預警系統是保障 Mesh 自身穩定性而建設的模組,實現了自身的可觀測性,當出現故障時能快速定位,同時也會對整個系統做實時巡檢。
與Istio 基於 Kubernetes 來做定址和後設資料管理不同,OCTO Mesh 由獨立的 Meta Server 負責 Mesh 自身眾多元資訊的管理和命名服務。
三、關鍵設計解析
系統水平擴充套件能力方面,可以支撐數萬應用/百萬級節點的治理。
功能擴充套件性方面,可以支援各類異構治理子系統融合打通。
能應對 Mesh 化改造後鏈路複雜的可用性、可靠性要求。
具備成熟完善的 Mesh 運維體系。
圍繞這四點,便可以在系統能力、治理能力、穩定性、運營效率方面支撐美團當前多倍體量的新架構落地。
3.1 大規模系統 Mesh 化系統能力建設
對於社群 Istio 方案,要想實現超大規模應用叢集落地,需要完成較多的技術改造。主要是因為 Istio 水平擴充套件能力相對薄弱,內部冗餘操作較多,整體穩定性建設較為薄弱。針對上述問題,我們的解決思路如下:
控制面每個節點並不承載所有治理資料,系統整體做水平擴充套件,在此基礎上提升每個例項的整體吞吐量和效能。
當出現機房斷網等異常情況時,可以應對瞬時流量驟增的能力。
只做必要的 P2P 模式健康檢查,配合集中式健康檢查進行百萬級節點管理。
按需載入和資料分片主要由 Adcore Pilot 配合 Meta Server 實現。
Meta Server 管控每個Pilot節點負責應用 OCTO Proxy的歸屬關係。當 Pilot 例項啟動會註冊到 Meta Server,此後定時傳送心跳進行續租,長時間心跳異常會自動剔除。在 Meta Server 內部實現了較為複雜的一致性雜湊策略,會綜合節點的應用、機房、負載等資訊進行分組。當一個 Pilot 節點異常或釋出時,隸屬該 Pilot 的 OCTO Proxy 都會有規律的連線到接替節點,而不會全域性隨機連線對後端註冊中心造成風暴。當異常或釋出後的節點恢復後,劃分出去的 OCTO Proxy 又會有規則的重新歸屬當前 Pilot 例項管理。對於關注節點特別多的應用 OCTO Proxy,也可以獨立部署 Pilot,透過 Meta Server 統一進行路由管理。
對於剛剛提到的場景,隔離一層後1000個節點僅需註冊100個 Watcher,一個 Watcher 變更後僅會有一條變更資訊到 Data Cache 層,再根據索引向1000個 OCTO Proxy 通知,從而極大的降低了註冊中心及 Pilot 的負載。
Snapshot 層除了減少不必要互動提升效能外,也會將計算後的資料格式化快取下來,一方面瞬時大量相同的請求會在快照層被快取擋住,另一方面也便於將存在關聯的資料統一打包到一起,避免併發問題。這裡參考了Envoy-Control-Plane的設計,Envoy-Control-Plane會將包含xDS的所有資料全部打包在一起,而我們是將資料隔離開,如路由、鑑權完全獨立,當路由資料變更時不會去拉取並更新鑑權資訊。
Istio 預設每個 Envoy 代理對整個叢集中所有其餘 Envoy 進行 P2P 健康檢測,當叢集有N個節點時,一個檢測週期內(往往不會很長)就需要做N的平方次檢測,另外當叢集規模變大時所有節點的負載就會相應提高,這都將成為擴充套件部署的極大障礙。
3.2 異構治理系統融合設計
OCTO Mesh 需要對齊當前體系的核心治理能力,這就不可避免的將 Mesh 與治理生態的所有周邊子系統打通。Istio 和 Kubernetes 將所有的資料儲存、釋出訂閱機制都依賴 Etcd 統一實現,但美團的10餘個治理子系統功能各異、儲存各異、釋出訂閱模式各異,呈現出明顯的異構特徵,如果接入一個功能就需要平臺進行儲存或其他大規模改造,這樣是完全不可行的。一個思路是由一個模組來解耦治理子系統與 Pilot ,這個模組承載所有的變更並將這個變更下發給 Pilot,但這種方式也有一些問題需要考慮,之前介紹每個 Pilot 節點關注的資料並不同,而且分片的規則也可能時刻變化,有一套機制能將訊息傳送給關注的Pilot節點。
具體執行機制如上圖所示:各系統變更時使用客戶端將變更通知推送到訊息佇列,只推送變更但不包含具體值(當Pilot接收到變更通知會主動Fetch全量資料,這種方式一方面確保Mafka的訊息足夠小,另一方面多個變更不需要在佇列中保序解決版本衝突問題。);Adcore Dispatcher 消費資訊並根據索引將變更推送到關注的 Pilot 機器,當 Pilot 管控的 Proxy 變更時會同步給 Meta Server,Meta Server 實時將索引關係更新並同步給Dispatcher。為了解決 Pilot 與應用的對映變更間隙出現訊息丟失,Dispatcher 使用回溯檢驗變更丟失的模式進行補償,以提升系統的可靠性。
3.3 穩定性保障設計
Service Mesh 改造的系統避不開“新”和“複雜”兩個特徵,其中任意一個特徵都可能會給系統帶來穩定性風險,所以必須提前做好整個鏈路的可用性及可靠性建設,才能遊刃有餘的推廣。美團主要是圍繞控制故障影響範圍、異常實時自愈、可實時回滾、柔性可用、提升自身可觀測性及迴歸能力進行建設。
這裡單獨介紹控制面的測試問題,這塊業界可借鑑的內容不多。xDS 雙向通訊比較複雜,很難像傳統介面那樣進行功能測試,定製多個 Envoy 來模擬資料面進行測試成本也很高。我們開發了 Mock-Sidecar 來模擬真正資料面的行為來對控制面進行測試,對於控制面來說它跟資料面毫無區別。Mock-Sidecar 把資料面的整體行為拆分為一個個可組合的 Step,機制與策略分離。執行引擎就是所謂的機制,只需要按步驟執行 Step 即可。YAML 檔案就是 Step 的組合,用於描述策略。我們人工構造各種 YAML 來模擬真正 Sidecar 的行為,對控制面進行迴歸驗證,同時不同 YAML 檔案執行是並行的,可以進行壓力測試。
3.4 運維體系設計
為了應對未來百萬級 Proxy 的運維壓力,美團獨立建設了 OCTO Proxy 運維繫統 LEGO,除 Proxy 保活外也統一集中控制發版。具體的操作流程是:運維人員在 LEGO 平臺發版,確定發版的範圍及版本,新版本資源內容上傳至資源倉庫,並更新規則及發版範圍至 DB,發升級指令下發至所要釋出的範圍,收到發版命令機器的 LEGO Agent 去資源倉庫拉取要更新的版本(中間如果有失敗,會有主動 Poll 機制保證升級成功),新版本下載成功後,由 LEGO Agent 啟動新版的 OCTO Proxy。
四、總結與展望
4.1 經驗總結
服務治理建設應該圍繞體系標準化、易用性、高效能三個方面開展。
大規模治理體系 Mesh 化應該關注以下內容:
適配公司技術體系比新潮技術更重要,重點關注容器化 & 治理體系相容打通。
建設系統化的穩定性保障體系及運維體系。
OCTO Mesh 控制面4大法寶:Meta Server 管控 Mesh 內部服務註冊發現及後設資料、分層分片設計、統一接入中心解耦並打通 Mesh 與現有治理子系統、集中式健康檢查。
4.2 未來展望
完善體系:逐漸豐富的 OCTO Mesh 治理體系,探索其他流量型別,全面提升服務治理效率。
大規模落地:持續打造健壯的 OCTO Mesh 治理體系,穩步推動在公司的大規模落地。
中心化治理能力探索:新治理模式的中心化管控下,全域性最優治理能力探索。
作者簡介
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559353/viewspace-2669334/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫治理的探索與實踐資料庫
- 美團多場景建模的探索與實踐
- Flutter包大小治理上的探索與實踐Flutter
- 美團BERT的探索和實踐
- 美團配送資料治理實踐
- Kotlin程式碼檢查在美團的探索與實踐Kotlin
- 美團搜尋多業務商品排序探索與實踐排序
- Node 呼叫 dubbo 服務的探索及實踐
- 美團外賣廣告智慧算力的探索與實踐(二)
- 美團酒旅起源資料治理平臺的建設與實踐
- 金融系統IT運維監控的探索與實踐運維
- 微服務的服務間通訊與服務治理微服務
- 異構廣告混排在美團到店業務的探索與實踐
- 美團深度學習系統的工程實踐深度學習
- 美團知識圖譜問答技術實踐與探索
- 愛奇藝微服務監控的探索與實踐微服務
- 螞蟻金服 DB Mesh 的探索與實踐
- 美團儲存雲原生探索和實踐
- 深度學習在美團配送ETA預估中的探索與實踐深度學習
- 美團外賣小程式的探索與實踐丨掘金開發者大會
- 美團搜尋中查詢改寫技術的探索與實踐
- Flutter原理與美團的實踐Flutter
- Android系統服務DropBoxManagerService詳解與實踐應用Android
- 小米大資料儲存服務的資料治理實踐大資料
- 廣告平臺化的探索與實踐 | 美團外賣廣告工程實踐專題連載
- 系統設計實踐(01) - 短鏈服務
- 美團外賣推薦情境化智慧流量分發的實踐與探索
- Nydus —— 下一代容器映象的探索實踐
- 美團配送系統架構演進實踐架構
- 美團叢集排程系統的雲原生實踐
- 美團針對Redis Rehash機制的探索和實踐Redis
- ChatGPT的探索與實踐ChatGPT
- 系統設計實踐(02)- 文字儲存服務
- iOS App冷啟動治理:來自美團外賣的實踐iOSAPP
- 聲網下一代視訊引擎架構探索與實踐架構
- 業務資料治理體系化思考與實踐
- Flutter探索與實踐Flutter
- Vue 探索與實踐Vue