深入淺出時序數據庫之預處理篇——批處理和流處理,用戶可定制,但目前流行influxdb沒有做


時序數據是一個寫多讀少的場景,對時序數據庫以及數據存儲方面做了論述,數據查詢和聚合運算同樣是時序數據庫必不可少的功能之一。如何支持在秒級對上億數據的查詢分組聚合運算成為了時序數據庫產品必須要面對的挑戰。

 

本文會從時序數據庫的查詢以及聚合運算角度展開,最后會從如何解決時序數據的查詢問題入手深入分析。

1. 時序數據的查詢

用戶對時序數據的查詢場景多種多樣,總的來說時序數據的查詢分為兩種:原始數據的查詢和時序數據聚合運算的查詢。

前者是對歷史高精度時序數據的查詢,查詢結果粒度太細,並不利於發現其規律性,趨勢性;也不適合展現給用戶,主要用於大數據分析的元數據。

后者主要用來對數據做分析,例如 dashboard 等 UI 工具使用聚合查詢展示數據分析結果。通常數據分析的查詢范圍廣,查詢的數據量大,從而導致查詢的延時比較高,而往往分析工具又要求查詢延時低,大數據量低延時是時序數據查詢面臨的主要問題,本文主要探討聚合分析查詢的優化。

2. 時序數據的查詢的優化

從前文可了解到,時序數據的存儲主要包含單機和分布式存儲。時序數據根據分片規則(通常使用 metric+tags+ 時間范圍),將分片存儲在單機或者分布式環境中。聚合運算查詢時,根據查詢條件查詢所有的數據分片,所有的分片按照時間戳合並形成原始數據結果,當查詢條件包含聚合運算時,會根據采樣窗口對數據進行聚合運算,最后返回運算結果。

數據聚合運算查詢延時的計算可以粗略的描述如下:

聚合運算查詢:數據分片的查詢合並 + 聚合運算 + 數據返回

圖 1 時序數據查詢流程

針對聚合運算的查詢可以從兩個方向進行優化:分布式聚合查詢和數據預處理。分布式聚合查詢通過並發使用多個節點並行查詢和計算來提高性能,減少了分片查詢以及聚合運算的時間,保證了時序數據分析結果秒級返回。而數據預處理則是通過空間換時間的思路,將數據根據查詢規則預先計算,查詢時直接返回少量的聚合運算結果來保證更低的查詢延時。時序數據庫可以分別從二種方式進行查詢優化,本文之后主要針對數據預處理做深入分析。

3. 時序數據查詢的預處理

時序數據的預處理根據實時性可以分為二種:批處理和流式處理。

批處理

批處理是使用 pull 的方式查詢時序原始數據,預先進行聚合運算獲取數據結果寫入時序數據庫,當進行聚合查詢時直接返回預處理后數據結果。時序數據庫定期輪詢規則,根據采樣窗口創建預處理任務,任務根據規則信息形成多個任務隊列。隊列內任務順序執行,隊列間任務並發執行,多任務隊列保證了多租戶對計算資源共享。

圖 2 批處理

預處理任務的執行主要分為二種環境:單機環境以及分布式環境。

單機環境:任務調度模塊邏輯相對簡單,調度模塊通過進程內消息或者輪詢多個任務隊列,順序獲取隊列內未執行的預處理任務,提交任務到線程池執行。

分布式環境:多個計算節點共享任務隊列,對預處理任務進行搶占執行,能夠支持計算節點的線性擴展,分布式環境可以包含多種實現。

  1. 消息隊列方式: 時序數據庫輪詢預處理規則,創建預處理任務時,添加任務消息到消息隊列,同時設置消息分組,相同的規則使用相同的分組。計算節點消費任務消息,組內消息順序執行,組外消息並發執行。

  2. 一致性 hash 方式:多個計算節點通過一致性 hash 算法,形成一個一致性 hash 環,預處理任務根據分片算法(使用規則信息)將相同的任務隊列提交到相同的計算節點,保證任務隊列順序執行。

  3. 調度模塊方式: 由調度模塊統一進行任務隊列的調度,相同規則任務提交到相同的計算單元,保證其順序執行。

流式處理

流式處理框架同樣能夠支持對數據流做聚合運算,不同於批處理方式,時序數據需要路由到流式處理框架例如 Spark,Flink 等,當數據時間戳到達采樣窗口時,在內存中實時計算,寫入時序數據庫。

圖 3 流式預處理

流式處理屬於分布式內存計算,相同的采樣窗口數據需要在同樣的計算單元中聚合運算,因此需要將相同數據流映射到相同的計算單元,數據流任務調度是流式處理需要解決的核心問題。

  1. 中心化的調度:由調度模塊統一調度數據流,將相同的數據流使用同一的計算單元處理。

  2. 一致性 hash 方法:通過使用分片 (使用規則信息),將相同的預處理規則數據流映射到相同的計算單元來保證內存數據計算的正確性。

批處理的優點是支持對歷史時序數據的處理,實現簡單。但是批處理具有查詢數據量大,非實時的缺點。流式處理的優點是數據實時計算,無需查詢原始數據。但是流式處理需要特殊處理寫入的歷史數據,也需要處理運算過程中崩潰的計算單元。批處理和流程處理各有優缺點,通常時序數據庫需要結合二種方式對數據進行預處理。

4. 真實用例 OpenTsdb 時序數據庫

OpenTsdb 當前最新版本並不支持數據預處理,但是在 OpenTsdb 的 RoadMap 中可以看到,在 OpenTsdb2.4 以及后續版本中准備使用新的 API 來支持,主要使用批處理以及流式處理。

批處理:根據采樣窗口,定時查詢原始數據進行聚合運算,存儲計算結果。

流式處理:結合 Spark、Flink 等流式處理框架,對時序數據流做實時計算。

OpenTsdb 期望預處理能夠提供用戶更加高效的查詢體驗,同時解決大數據查詢計算時系統崩潰的問題。

InfluxDB 時序數據庫

InfluxDB 支持 CQ(continous query) 的功能,CQ 通過定期 pull 原始時序數據進行計算,將計算結果存儲在內部特殊 metric 中。用戶通過創建 CQ 來實現對數據預處理,InfluxDB 的 CQ 主要參數包含:聚合函數名稱、儲存 metric 的名稱、查詢度量的名稱、采樣時間窗口以及標簽索引。

SELECT <function[s]> INTO <destination_measurement> 
FROM <measurement> [WHERE <stuff>]
GROUP BY time(<interval>)[,<tag_key[s]>]

5. 結束語

使用預處理能有效的降低采樣聚合函數查詢對系統的瞬時查詢壓力,實現數據計算一次多次查詢,同時也能有效的降低查詢延遲,提高用戶體驗。百度天工時序數據庫平台也早在 2016 年末就推出了預處理功能,滿足了物可視對聚合查詢高頻和低時延的需求。但是對大量原始數據的查詢,時序數據庫依然會遇到性能、高延時等挑戰,后續文章將會對此做深入分析。

 

摘自:http://www.infoq.com/cn/articles/pretreatment-in-sequential-databases


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM