ccf 智能运维 裴丹_智能运维 聊一聊实时计算系统
本文是我在實時數據計算系統的設計、開發、運維生涯的一部分經驗總結。主要介紹一些設計思路和常見問題的解決方案,不關注具體計算框架的使用。
本人主要致力于監控系統數據計算方向,主要業務場景有:監控數據的ETL、數據匯聚、分析、異常檢測等。
由于監控系統對時效性有較高需求,所以我們的計算系統更偏向實時系統,根據業務場景的不同,延遲從數百毫秒到分鐘不等。下文提到的計算架構更多是指整個計算處理通路,主要以監控場景下的系統設計為例,相信與其他場景下的架構也有相通之處。
文章從以下幾個方面展開:
首先,在第1節,我們簡述不同數據規模和場景下,監控系統計算架構的可選方案。在公司、業務發展的不同階段,主要矛盾不同,能夠投入人力物力資源不同,需要選擇合適的架構方案。
實時計算系統的設計有一個核心問題:如何同時滿足高時效性和數據準確性?在現實環境中,高時效性和準確性很難同時達到,第2節中介紹了Watermark機制以實現兩者的平衡。
第3節介紹百度監控系統的實時計算系統架構,描述了其基本組成、思路和實現中一些常見問題的解決方案。
最后,簡單討論了實時計算系統可用性建設。
監控系統計算架構選型
對于包含數百到千級別節點的小集群,數據規模有限,所有采集、存儲、計算邏輯都可以集成在一個模塊中實現,這種多為領域專用系統。監控系統中,典型的有Prometheus,其采用單服務節點架構,提供簡單的HA模式進行容錯,這種架構的優點是部署使用簡單。受限于單機資源,適合部署自治的多個實例,每個實例監控不同服務。大規模集群情況下,要實現全局的監控,需要合并多個監控實例的數據,在配置分發、可用性、容錯、自動化部署管理等方面都需要更多的工作。從開發角度考慮,由于功能耦合嚴重,不利于開發升級。
比起領域專用系統,還有一種架構是使用通用性更強的OLAP系統來實現實時或者近實時的計算功能,如TSDB、ElasticSearch等系統都有一定的聚合計算能力。這些分布式系統都有水平擴展能力和容錯能力,但難以實現復雜業務計算,同時延遲不可控,復雜查詢或大批量數據查詢的延遲可能會達到分鐘級別。
更多的情況下我們采用存儲計算分離的方案,以便存儲和計算的各自演進和平臺化。通常由一個提供精細查詢能力的存儲服務與一個計算模塊組成。計算模塊根據計算規則從存儲系統中拉取數據并進行計算,這個架構的瓶頸在于存儲系統能夠支持的查詢規模。根據我們的經驗,基于精心設計的內存數據庫集群,能夠承受百萬級別的并發查詢。這種架構下計算任務多為周期性調度,當查詢性能下降時會造成任務的堆積。這個模型不方便處理延遲數據,需要一定機制預測數據完整時間,調度任務進行重算,任務調度的復雜度高?;谒饕樵兊挠嬎阆到y的延遲取決于計算輪詢的周期,適用于聚合類的涉及時間窗口的運算操作。
在更高數據量和計算規則的情況下,流式計算是一個自然的選擇,降低了寫存儲、索引、查詢的消耗,計算延遲大幅降低。
當數據量進一步上升,需要的網絡吞吐、計算能力驟增,后端的算力難以跟上數據量的增長。這時候可以將計算能力分散到全鏈路,將計算提前到數據產生端。在監控系統中,通過在采集端進行預計算和ETL操作,提取或整合有用信息,對于實時日志采集,能大幅度降低傳輸到后端的數據量。放到更大的視角上,這種將算力下放到數據源的思想,是目前大熱的邊緣計算的一個主要思路。
近年來,Serverless計算架構得到了更多的重視。這個模型將計算抽象為事件以及觸發的計算邏輯,計算邏輯實際由框架調度、分配資源執行。用戶只需要編寫計算邏輯,而不用關心可用性、可擴展、負載均衡等后端代碼,極大的降低了開發成本。通過按需調度,自動擴縮容,業務運維方不再關心容量規劃等問題。私以為當前常見計算框架的Serverless化是一個值得嘗試的方向。目前的Serverless框架還存在很多問題,例如調度初始化虛機、容器的成本高,缺乏狀態存儲等,比較適用于無狀態的計算。
一般來說根據場景需求,通常對不同的架構會組合使用。例如百度監控系統內部是以流式計算與近線計算相結合的方式提供服務的,近線計算從時序數據庫(TSDB)中拉取數據進行計算。對于Trace、在線數據分析等具有比較復雜查詢需求但是相對比較低頻的操作,更適合基于索引查詢的架構。
準確性與時效性
對于實時系統,我們對時效性有更嚴格的需求,但是通常高時效性伴隨著低準確度,二者不可兼得。在分布式環境下,天然存在長尾的延遲數據,這可能是原始數據自身的延遲,也可能是由采集點異常、網絡延遲、網絡抖動、數據通路中負載等造成的延遲。數據源越多,分散的越廣,這個長尾效應就會越嚴重,等待數據完整所需要的時間也越長。我們需要在最終數據的準確性和時效性間做折中。
不同場景對兩者的需求不一致,通常來說報警、自動止損等操作需要最高的時效性,能夠容忍一定的精度缺失,在審計、訂單等數據上我們更多的追求準確性,時效性可以適當放寬。解決這個折衷的常用機制是Watermark。
Watermark是在數據流中增加標志信息,用以指示一個窗口內的數據已經“完全”到達,可以進行計算。
示例:
假設我們要統計10s內到達的事件數目,以事件時間(Event Time,即事件攜帶的時間,多為事件產生時間)作為時間基準。如下圖所示,橫線為Wall Time時間線,單位為s。圓球表示事件,圓球里面的數字為事件時間,其虛線指向產生時間,圓球正對的Wall Time時間線上的點為被計算系統處理的時間(Process Time),兩個時間之間的差值為實際延遲。每個事件都或多或少存在延遲,其中數字為45的圓球延遲最大。對于事件時間[40, 50]這個匯聚窗口,假設我們將Watermark線畫在53處,則我們認為數據在53之前已經完全到達,已經接收到的那些數據可以參與匯聚,Watermark之后到來的事件則忽略。
具體怎么確定Watermark通常取決于需求,對于數據點數量級比較穩定的場景,可以設置一個到達的數據點的比例,在某一個判斷周期內,只要到達的數據點比例滿足閾值則可添加Watermark。主流開源計算框架對Watermark的實際定義不盡相同,具體使用參考對應計算框架的定義。
私以為Watermark機制隱含的一個重要思想是將數據準確性的定義交還給用戶,讓用戶決定。產品或者架構上的功能,存在多種方案的情況下,選擇最泛化的那個方案,暴露出參數然后讓用戶來選擇,不要自己替用戶做決定。當然為了簡化實現成本和用戶使用成本,可以設置固定的一些選項,并選擇一個需求最大的作為默認值。
通常Watermark之后的過期數據點會被丟棄。經常的,除了滿足高時效性需求外,我們也需要在之后保證數據的最終準確性,即在一定時間段之后的數據是準確的。常用思路是部署兩套計算系統,流式計算用以實現低延遲但是準確性低的需求,批量計算用于補償計算數據的準確性,這就是Lambda架構。最典型的使用Lambda架構的場景是從日志中統計PV/UV,通常是一個流式采集系統和流式計算框架進行實時的PV/UV計算,同時有一套離線系統,定期拉取原始日志,通過批量計算系統統計準確的PV/UV數值。通常這種架構的缺點是兩套系統的資源消耗,開發運維成本高。
當前主流計算框架如Spark和Flink對流式和批量計算進行了統一抽象??梢砸欢ǔ潭冉档蛢商紫到y的開發運維成本,降低了不同框架的開發運維成本,兩次計算的的資源消耗依舊存在。
對于滿足交換率和結合率的算子,如常見的統計方法(MAX/MIN/SUM/COUNT),在存儲側支持相同運算的情況下,可以將兩次運算合并成一次。我們內部稱這個方案為多版本,即數據生產一部分就匯聚一部分,每次匯聚產生一個數據版本,由存儲在寫入時合并,或者在查詢時合并。本質上,這是將匯聚的功能遷移了一部分至存儲。
百度監控實時計算系統架構
百度監控系統的實時計算系統承擔了監控系統數據處理棧的主要計算功能,每天處理數千億條消息。本節在實際系統的基礎上,進行了一定的抽象,介紹一個較為通用的系統架構。
如圖所示,架構主要包含以下組件:
接入模塊:包括數據拉取和數據接收,前者主動拉取數據,后者接收由上游模塊推送的數據。
分發模塊:根據配置的計算規則,過濾訂閱的數據,并根據調度策略、集群狀態將規則對應的數據分配到一個或多個處理單元進行計算。
處理單元:包括一個物理計算模塊和對應的輸入輸出消息隊列。物理計算模塊執行實際的業務計算邏輯,不同處理單元間可以是同構的也可以是異構的,根據不同的業務場景和用戶需求,可以使用不同的技術棧。
控制模塊:接收用戶提交的計算規則和管理操作,分配調度資源,產生對其他模塊的控制信息。
數據推送模塊:拉取計算結果,根據計算規則將數據分發到下游模塊。
每個物理計算模塊都對應一個輸入和輸出消息隊列,以將數據接入、據輸出與計算層隔離,增加一個新的第三方系統的交互不會影響計算功能。升級變更物理框架不會影響其他組件。
由于大數據處理框架,在其數據規模、節點數目達到一定規模時,其處理性能以及異?;謴退俣榷紩陆怠N覀儗⒁粋€固定計算能力以及配套的資源(如消息隊列)抽象為一個處理單元,每個處理單元處理一部分的數據,取決于計算功能的物理實現,這個處理單元可以對應一個集群或者一個作業。一個處理單元的具體規模取決于具體的技術選型和硬件條件。確認處理單元的好處是便于容量規劃,可以以一個處理單元作為粒度進行擴縮容。如果需要嫌粒度過大,分層次進行擴縮容,先在一個處理單元內部擴展直到極限,之后啟動一個新的處理單元。
實現中需要考慮以下幾個點:
1、負載均衡
負載均衡發生在系統的每一個層次。
數據接入層與和分發模塊之間的采用隨機發送的策略以均衡分發模塊的壓力。
數據拉取和數據推送模塊需要動態平衡每個實例上的拉取或推送任務,常用的策略是一致性哈希,以每個任務的實際數據量作為權重。
計算過程是最需要考慮負載均衡的場景,聚合計算通常會遭遇數據傾斜問題,即某些key的數據量遠大于其他,這就造成匯聚該Key的任務OOM。下面提供幾種常用解決思路:
對于滿足交換率和結合率的計算方法,如MAX/MIN/SUM/COUNT等,可以添加多層預聚合,降低最終聚合的數據量。預聚合層次間可以隨機方式,最終匯聚之前按Key哈希。
負載均衡或者說任務調度對應Bin Packing等一系列等價的最優化問題。這些問題是NP-Hard的,可以通過近似算法來逼近,典型的有First Fit算法。實現時一般需要自定義計算框架的分區邏輯,如Spark可以通過自定義Partitioner來實現。
2、控制節點扇入扇出規模
無論是具備狀態副本的分布式存儲系統、基于DAG的分布式計算系統還是Stateless的接入集群,當集群規模持續增大時,節點間交互會顯著增大,最差的情況下全連接,擴容節點會有指數級的連接增長。這會嚴重影響系統對水平擴容能力,擴容帶來的收益跟不上單機資源消耗的增長。
對于分布式系統,通過控制集群或者作業規模可以實現一定程度的控制,對于接入模塊,可以限制下游連接到上限。
可用性
對于可用性要求高的服務可以多集群熱備的方式,在上述架構中,可以通過運行多個并行的處理單元處理相同的數據流來實現。也可以部署整個集群,通過采集端多寫的方式復制數據流。最后需要根據輸出結果的延遲、準確度等判斷策略選擇一個計算結果輸出。
服務無損升級,可以通過啟動一個新的計算單元,并行處理數據,待數據“預熱”后,進行切換。
在部署時,接入模塊盡可能的靠近數據源,保證每個地域一套。系統多地域部署,每個地域內部模塊間盡量自治。接入端發送數據時優先發送本地域,異常時嘗試其他地域。模塊間交互可以打QoS(服務質量)標簽增加網絡優先級以降低網絡丟包。
監控上,除了基礎資源、流量等監控外,最重要的是全通路時延監控,常見方案是構造業務流量,統計在系統中的延遲。這個延遲指標通常是多維度的,根據部署和業務使用情況可能需要關注不同地域,不同業務,不同處理通路的延遲。這些延遲指標,可以指示系統進行流量調度或者資源的重分配。
總 結
本文簡單介紹了百度的分布式監控計算系統架構的演進和當前的實時計算架構,并提供了部分常見問題點解決思路。架構是不斷在演進的,我們的系統僅僅是“夠用”,還有更多的工作需要開展,如架構的輕量化,統一易用的計算表示層,計算的自動優化等。
由于個人水平有限,如果行文中有錯誤,或者有需要進一步探討的,請在留言中指出。
總結
以上是生活随笔為你收集整理的ccf 智能运维 裴丹_智能运维 聊一聊实时计算系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ffmpeg-win32-v3.2.4
- 下一篇: c语言逆波兰计算器程序,C语言实现的简单