劉宏偉
美團北京102208
美團外賣業務在互聯網行業是非常獨特的,其定位是“圍繞在線商品交易與及時送達的O2O電商交易平臺”。不僅流程復雜,歷經用戶下單→系統發給商家→商家準備外賣→配送,到最后用戶收到商品(比如熱乎乎的盒飯),整個過程的時間需要控制在半小時之內,而且壓力和流量在午、晚高峰時段非常集中。在這背后,整個產品線上還會涉及很多數據分析、統計、結算、合同等各個端的交互,對一致性的要求高。同時,外賣業務的增長非常迅猛,自2013年11月上線到最近峰值突破1 600萬,還不到4年。在這種情況下,一旦出現事故,單純靠人工排查解決問題,存在較多的局限性。為了提升效率需要盡可能自動化,而自動化的前提需要有足夠準確的檢測與診斷結果,檢測與診斷結果又需要有貼近真實業務場景的工具不斷驗證。
系統在日常的業務運維工作中經常會碰到一些問題困擾著開發人員,如圖1所示。
1)各種維度的事件通知、報警事件充斥著開發人員的IM,需要花很多精力去配置和優化報警閾值、報警等級才不會出現很多誤報。希望可以將各種服務的報警指標和閾值標準化、自動化,然后自動收集這些事件進行統計。一方面可以幫助開發人員提前發現問題潛在的風險,另一方面為能夠找出問題的根本原因提供有力的數據支持。
2)公司有多套監控系統,它們有各自的職責定位,但是互相沒有關聯,所以開發人員在排查問題時需要帶著參數在不同的系統之間切換,這就降低了定位的效率。
3)項目代碼中會有大量的降級限流開關,在服務異常時進行相應的保護操作。這些開關隨著產品快速地迭代,并不能確定它們是否還有效。另外,需要較準確地進行容量規劃以應對快速增長的業務量。這些都需要通過全鏈路壓測進行不斷地驗證,并發現性能瓶頸,有效地評估服務容量。
4)開發人員收到各種報警之后,通常都會根據自己的經驗進行問題的排查,這些排查經驗完全可以標準化(比如對某個服務的平均耗時異常,需要進行的排查操作),問題排查流程標準化之后,就可以通過計算機自動化。為了提高診斷的準確度,就需要將這個流程更加智能化,減少人為參與。
公司希望通過一些自動化措施提升運維效率,從而將開發人員從日常的業務運維工作中解放出來,先來看一個用戶使用場景,如圖2所示,觸發服務保護有兩條路徑。

圖2 自動化業務運維系統核心建設目標
1)第一條,當用戶在前期接收到診斷報警后,直接被引導進入該報警可能會影響到業務大盤。這時要查看業務圖表,如果影響到業務,引導用戶直接進入該業務圖表對應的核心鏈路,定位出問題的根本原因,進而再判斷是否要觸發該核心鏈路上對應的服務保護開關或預案。
2)第二條,用戶也可以直接通過診斷報警進入對應的核心鏈路,查看最終引起異常的根本原因,引導用戶判斷是否需要觸發相應的服務保護預案。
發現問題→診斷問題→解決問題,這個過程每一步都需要不斷地提升準確度,具體數據可以通過全鏈路壓測來獲得,當某些場景準確度非常高的時候,就可以變為自動化方案;因此,核心目標是,當整個方案可以自動化進行下去之后,對于用戶來說的使用場景就變成了:收到異常報警→收到業務服務恢復通知。隨著自動化方案越來越完備,開發人員可以更加關注業務邏輯的開發。
如圖3所示,在自動化業務運維系統中,業務大盤與核心鏈路作為用戶使用的入口,一旦用戶查看業務指標出現問題,就需要快速定位該業務指標異常的根本原因。系統通過對核心鏈路上服務狀態的分析,幫助開發人員定位最終的問題節點,并建議開發人員需要觸發哪些服務保護預案。業務大盤的預測報警、核心鏈路的紅盤診斷報警以及已經收集到各個維度的報警事件,如果能對它們做進一步的統計分析,可以幫助開發人員從更加宏觀的角度提前發現服務可能存在的問題,相當于提前對服務做健康檢查。開發人員需要定期通過全鏈路壓測來不斷驗證問題診斷和服務保護是否有效,在壓測時可以看到各個場景下的服務健康狀態,對服務節點做到有效的容量規劃。

圖3 業務監控運維體系架構
外賣業務會有非常多的業務指標進行監控,業務指標和系統指標、服務指標不同,需要業務方根據不同的業務自行上報監控數據[1]。業務大盤作為業務運維系統的使用入口,可以讓開發人員快速查看自己關心的業務指標的實時狀態以及最近幾天的走勢。
如圖4所示,業務大盤不光需要展示業務監控指標,還需要有很強的對外擴展能力。

圖4 業務監控大盤及拓展能力
1)當出現業務指標異常時,根據后臺的監控數據分析,可以手動或自動進行事件標記,告知開發人員是什么原因引起業務指標的波動,做到用戶信息快速同步。
2)可以帶著時間戳與類型快速引導開發人員進入其它監控系統,提高開發人排查問題的效率。該系統會定期進行全鏈路壓測,同時為了壓測數據不污染真實的業務數據,會對壓測流量監控進行隔離。外賣業務場景使大多數業務監控數據都呈現出很強的周期性,針對業務數據可以利用歷史數據使用Holt-Winters等模型進行業務數據預測,當實際值與預測值不在置信區間內將直接進行告警。因為是更加偏向業務的運維系統,項目針對敏感的業務指標進行了相應的權限管理。為了增加系統使用場景,需要支持移動端,使用戶可以在任何地方通過手機就可以查看自己關心的監控大盤并觸發服務保護預案。
核心鏈路也是系統主要的使用入口,用戶可以通過核心鏈路快速定位是哪一個調用鏈出現了問題。如圖5所示,這里會涉及兩個步驟。

圖5 核心鏈路產品建設路徑
1)需要給核心鏈路上的服務節點進行健康評分,根據評分模型來界定問題嚴重的鏈路。這里會根據服務的各個指標來描繪一個服務的問題畫像,問題畫像中的指標也會有權重劃分[2],比如:當服務出現了失敗率報警、平均耗時報警、大量異常日志報警則會進行高權重的加分。
2)當確認完某條鏈路出現了問題,在鏈路上越往后的節點越可能是引起問題的根節點,系統會實時獲取該節點更多相關監控指標來進行分析診斷,這里會融合開發人員日常排查問題的標準流程,最終可能定位到是這個服務節點某些服務器的磁盤或者CPU等問題。
系統最終會發出問題診斷結果,這個結果在發出之后,還需要收集用戶的反饋,判斷診斷結果是否準確,為后續優化評分定位模型與診斷模型提供有力的數據支持[3]。在核心鏈路建設前期,系統會建議開發人員進行相應的服務保護預案觸發,當診斷結果足夠準確之后,可以針對固定問題場景自動化觸發服務保護預案,以縮短解決問題的時間。
服務保護&故障演練模塊是讓該業務運維體系形成閉環的重要部分,該模塊需要具備的核心功能如圖6所示。針對不同的保護需求,會有不同類型的服務保護開關,這里主要有如下3種。
1)降級開關。由于業務快速發展,在代碼中會有成百上千的降級開關。在業務出現異常時需要手動進行降級操作。
2)限流開關。有些特定業務場景需要有相應的限流保護措施。比如針對單機限流主要是對自身服務器的資源保護,針對集群限流主要是針對底層的DB或者Cache等存儲資源進行資源保護,還有一些其他限流需求都是希望可以在系統出現流量異常時有效地進行保護。
3)服務自動熔斷。可以通過監控異常數、線程數等簡單指標,快速保護服務健康狀態不會急劇惡化。
根據以往的運維經驗,在出現生產事故時可能會涉及到多個開關的切換,這里就需要針對不同的故障場景預先設置服務保護預案,可以在出現問題時通過一鍵操作對多個服務保護開關進行預設狀態的變更。既然有了應對不同故障場景的服務保護預案,就需要時不時來驗證這些服務保護預案是否真的可以起到預期的效果。
生產對應的事故不常有,肯定也不能只指望生產真的出現問題才進行預案的驗證,還需要針對不同的故障進行模擬。當生產服務出現問題時,不管是因為網絡原因還是硬件故障,大多數表現在服務上的可能是服務超時或者變慢、拋出異常。針對這幾點,做到可以對核心鏈路上任一服務節點進行故障演練,生產故障可能會同時多個節點出現故障,所以需要故障演練也支持預案管理。
服務保護是業務運維終端措施,需要在軟件上可以讓用戶很方便地直達對應的服務保護,可以很容易地將服務保護與業務大盤、核心鏈路進行整合,在開發人員發現問題時可以方便地進入對應的服務保護預案。有了這些保護措施與故障演練功能,結合與核心鏈路的關系,就可以與故障診斷與全鏈路壓測進行自動化方面的建設了。

圖6 服務保護&故障演練模塊的核心功能
目前,對外賣全鏈路的定期壓測每次都會涉及很多人的配合,如果可以針對單一壓測場景進行壓測將會大大縮短組織壓測的成本。如圖7所示,在全鏈路壓測的時候,針對壓測流量進行不同場景的故障演練,在制造故障的同時,驗證服務保護預案是否可以像預期那樣啟動以達到保護服務的目的。

圖7 全鏈路壓測帶來的收益
前面主要介紹了開發基于業務的運維系統時需要的各個核心功能,下面重點介紹一下在整個系統建設中自動化方面的建設主要集中在什么地方。
進行核心鏈路建設的時候,需要收集各個服務節點的報警事件,這些報警事件有服務調用時端到端的監控指標,還有服務自身SLA的監控指標。通過跟開發人員進行溝通了解到他們平時配置這些監控指標的時候耗費了大量的人力,每個指標的報警閾值都需要反復調整才能達到一個理想狀態,基于這些監控痛點,希望可以通過分析歷史數據來自動檢測出異常點,并自動計算出應有的報警閾值并進行設置。如圖8所示,根據不同監控指標的特點,選擇不同的基線算法,并計算出其置信區間,用來幫助系統更加準確地檢測異常點。比如業務指標周期性比較強,大多數監控指標都是在歷史同期呈現出正太分布,這個時候可以拿真實值與均值進行比較,其差值在N倍標準差之外,則認為該真實值是異常點。

圖8 異常點自動檢測
系統的服務保護措施有一部分是通過自動熔斷框架Hystrix進行自動熔斷,另外一部分是已經存在的上千個降級、限流開關,這部分開關平時需要開發人員根據自己的運維經驗來手動觸發。如果能夠根據各種監控指標準確地診斷出異常點,并事先將已經確定的異常場景與服務保護預案進行關聯,就可以自動進行服務保護預案的觸發,如圖9所示。

圖9 異常檢測與服務保護聯動
定期進行的外賣全鏈路壓測,需要召集相關業務方進行準備和跟進,這其中涉及的數據構造部分會關聯到很多業務方的改造、驗證、準備工作[4]。如圖10所示,需要通過壓測計劃串聯整個準備、驗證過程,盡量減少人為活動參與到整個過程中。這其中需要進行如下工作的準備。

圖10 壓測計劃自動化
1)針對真實流量的改造,基礎數據構造、數據脫敏、數據校驗等盡可能通過任務提前進行。
2)進入到流量回放階段,可以針對典型的故障場景進行故障預案的觸發(比如:Tair故障等)。
3)在故障演練的同時,可以結合核心鏈路的關系數據準確定位出與故障場景強相關的問題節點。
4)結合典型故障場景事先建立的服務保護關系,自動觸發對應的服務保護預案。
5)在整個流程中,需要最終確認各個環境的運行效果是否達到了預期,就需要每個環節都有相應的監控日志輸出,并自動化產出最終的壓測報告[5]。
整個壓測計劃的自動化進程中,將逐漸減少系統運行中人為參與的部分,逐步提升全鏈路壓測效率。最終希望用戶點擊一個開關開始壓測計劃,然后等待壓測結果就可以了。
在整個業務運維系統建設中,只有更加準確定位問題根節點,診斷出問題根本原因才能逐步自動化去做一些運維動作(比如:觸發降級開關、擴容集群等)。如圖11所示,項目會在這些環節的精細化建設上進行持續投入,希望檢測到任意維度的異常點,向上推測出可能會影響哪些業務指標,影響哪些用戶體驗;向下依托于全鏈路壓測可以非常準確地進行容量規劃,節省資源。

圖11 自動化建設后期發力點
[1]侯明,李書領.智能監控網絡的系統集成及其應用[J].電子技術與軟件工程,2014(05):25
[2]田新廣,孫春來,段洣毅,等.基于機器學習的用戶行為異常檢測模型[J].計算機工程與應用,2006,42(19):101-103
[3]左申正.基于機器學習的網絡異常分析及響應研究[D].北京:北京郵電大學,2010
[4]李杰,屈玉貴,張英堂.一種自適應的Web壓力測試模型[J].計算機工程與應用,2006,42(02):90-92
[5]馬琳,羅鐵堅,宋進亮,等.Web系統性能測試及優化[J].計算機工程,2005,31(12):229-231