阿里超大規模 Flink 集羣運維體系介紹

摘要 :本文整理自阿里雲實時計算高級運維專家王華 (尚付) 在 Flink Forward Asia 2021 生產實踐專場的演講。主要內容包括:

  1. 演進歷史和運維挑戰

  2. 集羣運維 Flink Cluster

  3. 應用運維 Flink Job

一、演進歷史和運維挑戰

阿里的實時計算經歷了近 10 年的快速發展,總體來說可以分成三大時代:

目前,阿里的實時計算已經擁有了幾百萬覈算力,幾萬臺物理機,幾萬個作業,真正形成了一個超大規模的實時計算平臺。而且在業務飛速發展過程中,平臺整體的架構從雲下的 Hadoop Flink 正在全面往雲原生 K8s 加 Flink 大規模演進中。

面對這樣一個實時計算的龐然大物,運維也隨着時代變遷面臨了不同的挑戰:

業務重要又敏感、平臺規模體量大且架構複雜,面臨這樣的雙重挑戰,如何去維護集羣的穩定性是一大難題。

一開始 Flink 集羣是用故障數來度量穩定性的,但實際上粒度很低,因爲有很多未達到故障時長標準的穩定性異常是沒有辦法在最終的故障數中體現的,導致穩定性存在着盲區。後面我們就打造了幾套基於分鐘級可用率的 SLA 可用率來度量整個集羣的穩定性。

SLI 是用來計算 SLA 的黃金指標,它代表着 Flink Cluster 的可用性,因爲集羣是一個虛擬的邏輯概念,所以我們定義了 Flink 作業狀態來代表 SLI。Flink 作業狀態本身非常複雜,但是我們可以簡單抽象出三種狀態:調度中、運行正常、運行異常,每個作業都能計算出這三種狀態,然後匯聚到集羣層面形成作業的比例,一旦異常的比例超過某個閾值,就代表集羣不可用,從而度量出 SLI 再算出全年的不可用時長。

最終 SLA 的可用率度量可以表示成一個簡單的數學公式,SLA 可用率 = SLA 異常數 * SLA 平均每次異常時長,來實現分鐘級可用率精細度量衡集羣穩定性。

有了精細的量化,接下來就是提升的路徑,也可以從上述公式入手去優化兩個因子:分別是既做好穩定性的預防,來減少 SLA 次數;同時也做好了 SLA 的快速恢復,縮短 SLA 時長,最終提升整體的可用率。

首先是 SLA 異常預防部分,關鍵的思路是做好集羣的巡檢,主動發現異常隱患,及時消滅隱患,從而減少 SLA 異常的次數。

導致 SLA 異常隱患有哪些?比如一堆超大作業突然啓動,導致集羣幾百臺機器 load 打高或者磁盤打滿,引發大量作業心跳超時;再比如說某一個 Flink 版本存在重大的穩定性問題或缺陷,影響了線上近千個作業。這些看上去很冷門的故障場景,實際上在一個超大規模的集羣裏和豐富的業務場景形態下幾乎每天都在發生,這是平臺發展到一定規模必然會出現的挑戰。而且集羣規模越大,越容易出現蝴蝶效應,影響面往往更大。此外,每次集羣異常定位的複雜度和耗時都非常久,如何去消滅這些 SLA 異常?

我們的思路是打造一個 Flink Cluster 的異常自愈服務,通過定期掃描線上全量作業的行爲數據比如作業的延時、Failover、反壓,然後對這些海量數據做異常分析和決策找到隱患。總的來說可以分爲兩大類異常:

最終在平臺側和用戶側雙管齊下,形成 SLA 異常自愈的閉環,從而減少 SLA 異常次數。

在異常自愈服務裏,其實最複雜的是背後規則的識別和決策。經過大量的積累,我們沉澱了幾十種業務側最高頻的異常規則和治理方案,來全自動化地識別和消滅之前 “看不見” 的隱患,真正做到穩定性預防。

根據 SLA 異常的公式,除了預防來減少 SLA 次數,另外一個手段就是縮短 SLA 發生後的異常時長。

挑戰在於線上一個集羣就有近萬個作業,但凡是集羣級的故障都表現爲定位困難、恢復時間久,再加上集羣數量衆多、分佈廣,故障的概率又增大,兩者疊加,一年發生幾次故障幾乎就成了常態,穩定性整體很被動。我們需要轉被動爲主動,如果能在故障場景將業務的快速切流做到集羣級的容災能力,SLA 異常恢復不僅能夠縮短,而且還能增加其確定性。

容災體系主要分成三部分:

Flink 作業都是長生命週期的,帶着 state 中間計算結果。首先要在集羣的部署架構上做到計算和存儲集羣在物理部署上分離。計算集羣出現故障時,比如基礎設施出現異常等,可以通過切流將所有 Flink 作業平遷到另外一個災備集羣,但是 state 存儲還是指向老的存儲集羣,就可以從原來的 state 點位恢復來實現真正透明的遷移,對用戶做到無感。

除了日常的穩定性以外,雙 11 更是穩定性的一場大考。Flink 雙 11 的專項保障可以總結爲 4 大塊 8 個字,分別是壓測、限流、降級、熱點。每一塊背後我們都沉澱了一套成熟的保障體系。

上圖第一個圖顯示,集羣調度層面所有機器資源水位非常平均,CPU 和內存幾乎在一條線上。但實際運行在集羣上的所有機器的物理水位卻參差不齊,因爲調度是不感知物理使用的,所以隨着集羣水位不斷提升,比如大促零點峯值的到來,集羣的熱點機器就會往更高去平移,某些機器在某一維度的資源會達到性能的瓶頸比如 CPU 使用了 95% 或者更高,從而就導致了熱點機器。

而在分佈式系統裏,所有機上的業務是有狀態並且有關聯的,局部的熱點機器不僅會影響集羣穩定性,還會成爲集羣性能提升的瓶頸、造成成本浪費,也就是說,熱點機器會是集羣穩定性和水位提升的短板。

熱點機器的解決是一個很棘手的問題,一般需要經歷 4 個過程:

  1. 第一步是發現熱點機器,包括熱點機器的 CPU、內存、網絡、磁盤,難點在於熱點機器的閾值是來自 SRE 線上豐富的經驗。

  2. 第二步是分析,我們做了一系列的機器診斷工具來定位熱點的進程,包括 CPU 到進程、IO 到進程,難點在於要求用戶對於 Linux 整個系統的原理有深入的理解和分析。

  3. 第三步是業務的決策和策略,從熱點機器進程關聯到業務的數據做決策,不同的優先級能接受的策略是不一樣的。

  4. 最後一步,纔是真正的解決熱點機器,低優先級通過降級或均衡,中高優先級則通過徑流來實現熱點機器的下降。

這個過程背後涉及的東西包括對業務的理解比如優先級、資源、配置畫像,對調度的原理的理解比如資源的分配策略、調度的策略,以及對系統內核的深度排查分析,還有業務的經驗和策略 —— 到底是限流還是降級。這樣全鏈路的界定和分析決策是一個非常複雜的技術難題。

我們正在做的是將熱點機器的完整解決方案全部沉澱下來,打造一個基於 K8s 雲原生的 Flink Cluster AutoPilot 來實現熱點機器的全自動化自愈。

從部署形態上來看,AutoPilot 的服務是基於 K8s 進行全託管,按集羣維度進行輕量化的部署,通過配置文件來方便地管理和運維。而執行階段則是由 K8s 來保證面向終態,保證最終一致性。從 AutoPilot 的技術能力上來看,它是通過將熱點機器的全面度分析流程抽象成 6 個階段,包括熱點機器的定義、感知、分析、決策、執行及全過程的可觀測性,來實現整個熱點機器全自動化自愈和高可觀測性,提升集羣的穩定性以及降低成本。

在過去的幾年裏,圍繞着運維穩定、成本、效率三大核心價值,SRE 在 Flink Cluster 超大規模集羣運維上沉澱了大量運維能力和更好的運維平臺。但是隨着雲原生化大浪潮的到來,運維能力如何基於雲原生變得更標準化,運維的交互界面、操作模式、執行模式以及運維過程的可觀測性如何建立更加統一的標準,都會成爲我們未來的重點發展方向。Flink Cluster AutoPilot 會成爲雲原生下新技術的載體,來承載運維體系的不斷演進和升級。

伴隨着實時計算的大趨勢,Flink 的用戶和作業數經歷了飛速增長,現在平臺上的作業數已經達到了幾萬個。但是衆所周知 Flink 作業的運維是一個非常複雜的問題,列舉一些日常用戶最高頻的諮詢,比如爲什麼我的作業啓動慢,爲什麼 Failover,爲什麼反壓,爲什麼延時,如何調整資源配置來減少成本?這些看似簡單的問題其實都非常複雜。

Flink 的作業運維難點有兩個方面:一方面是分佈式系統全鏈路組件很多,依賴很複雜。另一方面是 Flink 自身尤其是涉及到 RunTime 層面時,原理很複雜。所以我們希望將我們自身豐富的運維知識,包括對系統全鏈路的調用流程,各個組件工作原理的深入理解,也包括日常和雙 11 大促中豐富的排查問題的經驗,以及優秀的排查思路,全部轉化爲數據和規則算法,沉澱爲運維產品功能。

這個產品主要有兩個功能,一個是 Flink Job Adviser,用來發現和診斷作業的異常;另一個是 Flink Job Operator,用來修復作業的異常。兩者配套一起來解決 Flink 作業運維的難題。

上圖是 Flink Job Adviser 最終呈現給用戶的效果。用戶只需輸入作業名或鏈接,@一個機器人,就會調用 Adviser 服務。

比如 Case1,作業由於資源不足無法啓動,Adviser 會給出診斷結果,是由於某個作業資源不足,並附上改進建議,讓用戶去控制檯擴容對應的資源數量。

比如 Case2,用戶的某一個作業 failover 了,他想知道爲什麼。通過全域數據的關聯,Adviser 給出的結果是由於平臺側機器下線或硬件故障自愈導致的,建議用戶無需做任何操作,等待自動化的恢復即可。

再比如 Case3,由於用戶作業內存配置不合理,頻繁出現 OOM 導致 failover。Adviser 就會建議用戶去調整對應計算節點的內存配置,避免新的 failover。

Filnk job Adviser 背後還有幾十種針對複雜場景的異常診斷能力,構成了一個龐大的經驗決策樹。它不僅能夠定位正在發生的異常,還有能力預防異常,主要由三部分組成:

在決策樹的具體實現裏,選擇了幾個典型的、有複雜度的節點來進行分享。

最早決策樹的實現都是靜態的規則,但隨着場景的複雜化,尤其是數據的暴增以及個性化場景的出現,靜態規則無法再滿足我們的需求,比如每個作業的延遲都是個性化的、報錯無法再通過正則匹配來維護。我們正在積極嘗試引入各種 AI 來解決這些個性化的問題。

通過 Filnk job Adviser 定位異常後,就需要 Filnk job Operator 來修復異常,形成一個閉環。

Operator 能力主要由 4 大部分組成:

隨着實時計算的發展,運維也經歷了從人肉、工具化、平臺化、智能化到雲原生化的演進升級,我們一直秉承的思路是將豐富的實時計算運維經驗能力全部沉澱到實時計算管控產品上,來解決超大規模實時計算運維的難題。

在整個體系中,最中間是集羣和應用兩個運維對象,外圍的運維的目標和運維的價值一直都是圍繞着穩定、成本、效率三大目標。運維的體系、技術和產品的載體,則是實時計算管控,通過實時計算管控來服務好上層的實時計算用戶和產研、SRE 還有我們自己。同時運維管控的技術內核正在全力往智能化和雲原生化演進。

一句話總結,以智能和雲原生爲技術內核,建設實時計算運維管控產品,來解決超大規模 Flink 平臺運維和應用運維碰到的穩定、成本、效率三大難題。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/nnmdC0pMgf8Wa6Yb47GH4Q