全鏈路壓測自動化實踐

美團技術團隊發表於2019-02-15

境內度假是一個低頻、與節假日典型相關的業務,流量在節假日較平日會上漲五到十幾倍,會給生產系統帶來非常大的風險。因此,在2018年春節前,基於美團基礎的壓測平臺Quake,我們把整個境內度假業務接入了全鏈路壓測,來系統性地評估容量和發現隱患,最終確保了春節期間系統的穩定。

在整個過程中,我們意識到,全鏈路壓測在整個系統穩定性建設中佔有核心重要的位置,也是最有效的方案。結合實際業務節假日的頻率(基本平均一個月一次),如果能夠把它作為穩定性保障的常規手段,我們的系統質量也能夠得到很好的保障。同時,為了解決週期常態化壓測過程中人力成本高、多個團隊重複工作、壓測安全不可控,風險高等痛點,我們提出了全鏈路壓測自動化的設想。

透過對壓測實施的具體動作做統一的梳理,在壓測各個階段推進標準化和自動化,盡力提升全流程的執行效率,最終達到常態化的目標,如圖1所示:

全鏈路壓測自動化實踐

另外,在全鏈路壓測的整個週期中,壓測安全和壓測有效性也是需要一直關注的質量屬性。基於這些思考,如圖2所示,我們把壓測自動化需要解決的關鍵問題進行了歸類和分解:

  • 基礎流程如何自動化,提高人效;

  • 如何自動做好壓測驗證,保障壓測安全;

  • 壓測置信度量化如何計算,保證壓測有效。

全鏈路壓測自動化實踐

最終,基於美團基礎的壓測平臺Quake(在整個系統,主要提供流量錄製、回放、施壓的功能),設計並實現了全鏈路自動化壓測系統,為不同業務實施全鏈路壓測提效,並確保壓測安全。該系統:

  • 提供鏈路梳理工具,能夠自動構建壓測入口鏈路完整的依賴資訊,輔助鏈路梳理;

  • 支援鏈路標註和配置功能,對於無需壓測觸達的依賴介面,可以透過配置化手段,完成相關介面的Mock配置,不用在業務程式碼中嵌入壓測判斷邏輯;

  • 提供抽象的資料構造介面,透過平臺,使用者可以配置任意的資料構造邏輯和流程;

  • 在壓測前/壓測中,自動對壓測服務和流量做多項校驗,保障壓測安全性;

  • 在平日,基於壓測計劃提供週期性小流量的壓測校驗,使得業務迭代變更帶來的壓測安全風險被儘早發現;

  • 提供壓測計劃管理功能,透過系統自動排程和控制施壓過程,解放人力;同時強制前置預壓測,也提高了安全性;

  • 一鍵壓測,自動生成報告,收集鏈路入口和告警資訊,提供問題記錄和跟進功能。

系統設計

系統總體設計

全鏈路壓測自動化實踐

系統的總體邏輯架構,如圖3所示,主要包括鏈路構建/比對、事件/指標收集、鏈路治理、壓測配置管理、壓測驗證檢查、資料構造、壓測計劃管理、報告輸出等功能模組。透過這些模組,為全鏈路壓測的整個流程提供支援,盡力降低業務部門使用全鏈路壓測的門檻和成本。

鏈路構建/比對:負責服務介面方法呼叫鏈路的構建、更新、儲存。

鏈路治理:基於構建的鏈路關係,提供鏈路中核心依賴、出口Mock介面等標註、上下游分析、展示,以及出口Mock的配置等功能。

壓測配置管理:自動發現註冊服務的Mafka(美團基於Kafka開發的一個分散式訊息中介軟體綜合解決方案)/Cellar(基於Tair開發的分散式KV儲存服務)/Squirrel(基於Redis-Cluster模式進行二次開發的分散式快取系統)/Zebra(美團資料庫訪問層中介軟體)的壓測配置,輔助壓測方核查和配置相關配置項。

壓測驗證檢查:確保系統可壓測,透過多種校驗手段和機制設計,來保證壓測的安全性。

資料構造:為不同業務壓測實施準備基礎和流量資料。

壓測計劃管理:設定壓測執行計劃,並依賴“壓測控制”模組,自動排程整個壓測執行過程。

故障診斷:依據收集的關鍵業務/服務指標、報警等資訊,判斷分析服務是否異常,以及是否終止壓測。

置信度評估:從資料覆蓋、鏈路覆蓋、技術指標等維度評估壓測結果的置信度,即與真實流量情況下各評估維度的相似性。

非功能性需求說明:

  • 可擴充套件性

    • 能夠相容不同業務線資料構造邏輯的差異性。

    • 能夠支援不同的流量錄製方式。

  • 安全性

    • 整合SSO,按使用者所屬團隊分組,展示所屬的壓測服務資訊。對關鍵操作留存操作日誌。

    • 壓測驗證檢查,是確保壓測安全的關鍵。支援週期性壓測驗證,能發現待壓測服務可壓測性隨時間的退化。

  • 可重用性

    • 長遠看,鏈路構建、事件/指標收集/故障診斷等模組,在穩定性領域是可重用的基礎設施,按獨立通用模組建設。

約束說明:

  • 基於Quake搭建,流量的錄製、回放、施壓等依賴Quake。

以下對部分關鍵模組設計做詳細介紹。

鏈路治理模組設計

全鏈路壓測自動化實踐

鏈路治理模組是基於鏈路構建模組實現的。鏈路構建模組,底層是以閉包表的方式儲存兩個維度(服務和介面)的鏈路關係的,會週期自動地構建或更新。

鏈路治理模組主要提供鏈路入口選取、鏈路標註、服務出口分析、出口Mock配置等功能。如圖4所示,註冊壓測的服務構成了壓測服務的範圍,也就確定了各個鏈路的邊界。透過系統自動構建的樹結構方式的鏈路關係,可以輔助壓測方對整個鏈路的梳理,它解決了以往鏈路梳理靠翻程式碼等低效手段,缺少全鏈路視角無法做到完備梳理等問題。

全鏈路壓測自動化實踐

同時,針對整個壓測範圍,依賴介面可以做人工標註。哪些需要Mock,哪些不需要Mock,如此壓測特有的鏈路資訊能夠得到持續的維護。

對於需要Mock的外部介面(如圖4中的介面C),待壓測系統透過引入專有SDK的方式,獲得出口配置化Mock的能力。如圖5所示,這裡使用了美團酒旅Mock平臺的基礎能力,採用JVM-Sandbox作為AOP工具,對配置的需要Mock的外部介面做動態能力增強。在介面呼叫時,判斷是否是壓測流量,是的話走Mock邏輯,做模擬時延處理,返回提前配置的響應資料。這樣的話,第一,簡化了出口Mock的操作,業務程式碼裡Mock邏輯0侵入;第二,把之前本地Mock與藉助Mockserver的兩種解決方案用一種方案替代,便於統一管理;第三,在實際壓測時,平臺還可以透過SDK收集Mock邏輯執行的資料,自動與後臺標註的Mock資料對比,來確保應該被Mock的出口確實被Mock掉。

資料構造模組設計

全鏈路壓測自動化實踐

資料構造模組是為了解決不同業務對於基礎資料和流量資料的差異化構造流程。提出了兩個關鍵的概念:資料構造邏輯和資料構造流程。資料構造邏輯,是資料構造的細粒度可複用的基本單元,由一段Java程式碼表示。平臺提供統一抽象的資料構造介面,基於Java動態編譯技術,開發了一個Java版的指令碼引擎,支援構造邏輯的線上編輯與更新。同時,基於美團RPC中介軟體泛化呼叫能力,構建了泛化呼叫工具,幫助使用者把外部基礎資料構造介面的呼叫整合到一個資料構造邏輯中。

資料構造流程,定義了壓測基礎資料和流量資料生成的整個流程。透過與Quake的互動,獲取原始真實的線上資料;構建了一個簡版的流程引擎,在統一設定的流程中,如圖6所示,透過在標準擴充套件槽中,配置不同型別的資料構造邏輯和執行順序,來定義整個資料構造執行的流程;最後,把構造的流量資料與Quake壓測場景繫結,作為後續Quake壓測施壓中,場景回放流量的來源。

透過這樣的設計,能夠支援任意資料構造邏輯,通用靈活。同時整合了Quake已有的流量錄製功能,一鍵執行資料構造流程,大大地提升了效率。

壓測驗證模組設計

全鏈路壓測自動化實踐

對於壓測安全性的保障,一直是自動化的難點。之前的經驗多是在非生產環境壓測或預壓測過程中,依靠不同服務相關負責人的人工確認。這裡針對壓測驗證,提供兩條新的思考角度:一個是從待壓測服務系統可壓測性的角度看;一個是從壓測流量特徵的角度看。對於第一個角度,一個服務支援壓測需要滿足壓測資料和流量的隔離。對於不同的系統生態,需要滿足的點是不同的,對於美團生態下的服務,可壓測的條件包括元件版本支援壓測、影子儲存配置符合預期等等。

從這些條件出發,就可以得到下面這些靜態的校驗項:

  • 服務依賴中介軟體版本要求校驗;

  • Zebra壓測配置校驗;

  • Cellar/Squirrel壓測配置校驗;

  • Mafka壓測開關同步及校驗;

  • 服務Mock邏輯存在性校驗。

而從第二個角度來看,就是關注壓測流量下會產生哪些特有的流量特徵資料,透過這些特有的資料來確保壓測的安全性。這裡主要有三類資料:美團分散式追蹤系統(MTrace)中呼叫鏈路的壓測標記資料(正常的壓測鏈路應該是一直帶有壓測標記,直到壓測範圍的邊界節點,可參考圖4);標記Mock的外部介面被呼叫時,上報的執行資料;基於監控系統得到的壓測流量特有的監控資料。利用這些資料,我們設計了三種動態的校驗項,發現壓測標記丟失、Mock出口被呼叫等異常情況:

  • MTrace鏈路標記校驗,從壓測鏈路入口出發,收集壓測鏈路資訊,校驗壓測標記資訊傳遞是否符合預期。

全鏈路壓測自動化實踐

圖8 MTrace鏈路標記校驗示意

  • 服務Mock邏輯壓測標記校驗,透過增強的校驗邏輯,把執行資訊上報到平臺,與Mock配置時的標註資料對比驗證。

全鏈路壓測自動化實踐

圖9 服務Mock壓測校驗示意

  • 壓測與真實鏈路比對校驗,利用鏈路治理模組構建鏈路的能力,採集壓測監控資料重構鏈路,與真實鏈路對比驗證。

全鏈路壓測自動化實踐

除了明確靜態和動態兩類壓測校驗規則,在具體流程安排上,在壓測時和平日兩個時期執行這些規則。既能把壓測校驗的壓力分散到平時,也能儘快地發現服務因程式碼迭代引入的新風險。

在壓測時,透過強制前置預壓測的流程設計以及靜態/動態壓測校驗項的自動執行,保障安全這個事情。校驗不透過,給出告警,甚至在允許的情況下直接終止設定的壓測計劃。

在平日,透過執行週期性小流量壓測校驗,在施壓過程中對QPS做個位數的精細控制,以儘量小的代價快速發現壓測範圍內壓測安全性的退化。

壓測計劃管理模組設計

壓測計劃管理模組,提供壓測計劃的提前設定,然後模組能夠自動排程和控制整個施壓過程。如圖11所示,這裡的壓測計劃是多個壓測場景的組合,包含QPS的增長計劃等資訊,主要分為預壓測和正式壓測兩個階段。壓測計劃的自動實施,能夠解決尤其多場景組合壓測,操作耗時多、多場景壓測QPS無法同步變更、壓測方無法兼顧操作和觀測等問題,提升了效率。同時,在壓測計劃執行狀態機裡,預壓測正常執行完成,狀態才能遷移到正式壓測的開始狀態,提高了壓測安全性。

全鏈路壓測自動化實踐

從圖11可以看到,壓測計劃模組,是整個自動化壓測的核心,協同起了各個模組。透過具體的計劃任務執行產生的事件,觸發了壓測驗證檢查、壓測進展播報、收集壓測監控/告警等資料,來檢測服務是否異常,並根據配置來終止壓測,能夠故障時及時止損。最後,報告生成模組收到壓測終止事件,彙總各種資訊,自動生成包括壓測基本資訊等多維度資訊的壓測報告,節省了一些壓測後分析的時間。

案例分享

以下以實際壓測的過程來做個案例分享。

團隊/服務註冊

  • 設定實施壓測的虛擬團隊和壓測覆蓋範圍的應用服務。

全鏈路壓測自動化實踐

鏈路治理

  • 選定壓測鏈路入口,可以得到入口以下的介面鏈路關係樹,便於梳理。

  • 明確需要Mock的外部介面,並做配置,參考“鏈路治理模組設計”一節。

全鏈路壓測自動化實踐

應用改造與壓測配置

  • 對待接入壓測應用改造,滿足“服務的可壓測條件”,參考圖7。

  • 壓測應用依賴中介軟體配置,系統依據構建的鏈路資訊,能夠自動發現。提供統一配置和核對的頁面功能。

全鏈路壓測自動化實踐

Quake準備

  • 壓測自動化系統是基於Quake構建的,流量錄製、回放、施壓等依賴於此。因此需要到Quake上配置流量錄製的“流量任務”和壓測執行的“壓測場景”。

全鏈路壓測自動化實踐
全鏈路壓測自動化實踐

資料構造

  • 配置資料構造邏輯,當然已有的邏輯都是可複用的單元,可以先檢視已有邏輯是否能滿足自己的需要。

全鏈路壓測自動化實踐
  • 配置資料構造流程。

全鏈路壓測自動化實踐

壓測實施

  • 設定壓測計劃,到啟動時間,系統會自動啟動壓測。

全鏈路壓測自動化實踐
  • 壓測中,注意關注壓測驗證校驗的告警資訊,及時處理。

全鏈路壓測自動化實踐
  • 壓測後,可檢視壓測報告。記錄和跟進發現的問題。

全鏈路壓測自動化實踐

總結與展望

目前,壓測自動化系統已經投入使用,美團酒店和境內度假的全部團隊已經接入,有效地提升了壓測效率。後續會在兩個大方向上持續建設升級,一個是把全鏈路壓測放到“容量評估與最佳化”領域來看,不僅關注整體系統的穩定性,同時也期望兼顧成本的平衡;另一個是與穩定性其他子領域的生態整合,比如故障演練、彈性伸縮等等,在更多場景發揮壓測的作用。最後,透過這些努力,使得線上系統的穩定性成為一個確定性的事情。

參考資料

[1] 全鏈路壓測平臺(Quake)在美團中的實踐

[2] 阿里JVM-Sandbox

[3] Dubbo的泛化呼叫

[4] Java的動態編譯

作者簡介

歐龍,美團研發工程師,2013年加入美團,目前主要負責境內度假交易穩定性建設等工作。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559353/viewspace-2636125/,如需轉載,請註明出處,否則將追究法律責任。

相關文章