十分鐘看懂時序資料庫(II) 預處理

2021-09-19 07:30:46 字數 2582 閱讀 3323

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

使用者對時序資料的查詢場景多種多樣,總的來說時序資料的查詢分為兩種:原始資料的查詢和時序資料聚合運算的查詢。前者是對歷史高精度時序資料的查詢,查詢結果粒度太細,並不利於發現其規律性,趨勢性;也不適合展現給使用者,主要用於大資料分析的元資料。後者主要用來對資料做分析,例如dashboard等ui工具使用聚合查詢展示資料分析結果。通常資料分析的查詢範圍廣,查詢的資料量大,從而導致查詢的延時比較高,而往往分析工具又要求查詢延時低,大資料量低延時是時序資料查詢面臨的主要問題,本文主要**聚合分析查詢的優化。

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

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

聚合運算查詢:資料分片的查詢合併 + 聚合運算 + 資料返回

圖1 時序資料查詢流程

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

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

l  批處理

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

圖2 批處理

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

單機環境:任務排程模組邏輯相對簡單,排程模組通過程序內訊息或者輪詢多個任務佇列,順序獲取佇列內未執行的預處理任務,提交任務到執行緒池執行。

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

a)    訊息佇列方式: 時序資料庫輪詢預處理規則,建立預處理任務時,新增任務訊息到訊息佇列,同時設定訊息分組,相同的規則使用相同的分組。計算節點消費任務訊息,組內訊息順序執行,組外訊息併發執行。

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

c)    排程模組方式: 由排程模組統一進行任務佇列的排程,相同規則任務提交到相同的計算單元,保證其順序執行。

l  流式處理

流式處理框架同樣能夠支援對資料流做聚合運算,不同於批處理方式,時序資料需要路由到流式處理框架例如spark,flink等,當資料時間戳到達取樣視窗時,在記憶體中實時計算,寫入時序資料庫。

圖3 流式預處理

流式處理屬於分布式記憶體計算,相同的取樣視窗資料需要在同樣的計算單元中聚合運算,因此需要將相同資料流對映到相同的計算單元,資料流任務排程是流式處理需要解決的核心問題。

a)中心化的排程:由排程模組統一排程資料流,將相同的資料流使用同一的計算單元處理。

b) 一致性hash方法:通過使用分片(使用規則資訊),將相同的預處理規則資料流對映到相同的計算單元來保證記憶體資料計算的正確性。

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

l  opentsdb時序資料庫

opentsdb當前最新版本並不支援資料預處理,但是在opentsdb的roadmap中可以看到,在opentsdb2.4以及後續版本中準備使用新的api來支援,主要使用批處理以及流式處理。

批處理:根據取樣視窗,定時查詢原始資料進行聚合運算,儲存計算結果。

流式處理:結合spark、flink等流式處理框架,對時序資料流做實時計算。

opentsdb期望預處理能夠提供使用者更加高效的查詢體驗,同時解決大資料查詢計算時系統崩潰的問題。

l  influxdb時序資料庫

influxdb支援cq(continous query)的功能,cq通過定期pull原始時序資料進行計算,將計算結果儲存在內部特殊metric中。使用者通過建立cq來實現對資料預處理,influxdb的cq主要引數包含:聚合函式名稱、儲存metric的名稱、查詢度量的名稱、取樣時間視窗以及標籤索引。

select into from [where ] group by time()[,]

但是對大量原始資料的查詢,時序資料庫依然會遇到效能、高延時等挑戰,後續文章將會對此做深入分析。

注1:**

注2:**

**:

十分鐘看懂時序資料庫(III) 壓縮

壓縮對於時序資料庫是至關重要的。因為時序資料庫面對的物聯網場景每天都會產生上億條資料。眾所周知,在大資料時代的今天資料的重要性是不言而喻的,資料就是公司的未來。但如果無法對這些時序資料進行很好的管理和壓縮,那將給客戶帶來非常高的成本壓力。如前文提到的,工業物聯網環境監控方向的客戶,一年產生1p的資料...

十分鐘看懂時序資料庫(III) 壓縮

壓縮對於時序資料庫是至關重要的。因為時序資料庫面對的物聯網場景每天都會產生上億條資料。眾所周知,在大資料時代的今天資料的重要性是不言而喻的,資料就是公司的未來。但如果無法對這些時序資料進行很好的管理和壓縮,那將給客戶帶來非常高的成本壓力。如前文提到的,工業物聯網環境監控方向的客戶,一年產生1p的資料...

十分鐘看懂時序資料庫(IV) 分級儲存

本文將介紹通過對資料進行分級儲存,從使用不同儲存介質,以及減少資料的副本數的方面,介紹如何在保證時序資料的查詢效能的前提下,降低時序資料的儲存成本。1.分級儲存 分級儲存,就是按某一特徵,將資料劃分為不同的級別,每個級別的資料儲存在不同成本的儲存介質上。為什麼需要對資料進行分級儲存?為什麼不把所有的...