十分鐘看懂時序資料庫(I)-存儲

2021-01-03 donews

2017年時序資料庫忽然火了起來。開年2月Facebook開源了beringei時序資料庫;到了4月基於PostgreSQL打造的時序資料庫TimeScaleDB也開源了,而早在2016年7月,百度雲在其天工物聯網平臺上發布了國內首個多租戶的分布式時序資料庫產品TSDB,成為支持其發展製造,交通,能源,智慧城市等產業領域的核心產品,同時也成為百度戰略發展產業物聯網的標誌性事件。時序資料庫作為物聯網方向一個非常重要的服務,業界的頻頻發聲,正說明各家企業已經迫不及待的擁抱物聯網時代的到來。

本文會從時序資料庫的基本概念、使用場景、解決的問題一一展開,最後會從如何解決時序數據存儲這一技術問題入手進行深入分析。

1. 背景

百度無人車在運行時需要監控各種狀態,包括坐標,速度,方向,溫度,溼度等等,並且需要把每時每刻監控的數據記錄下來,用來做大數據分析。每輛車每天就會採集將近8T的數據。如果只是存儲下來不查詢也還好(雖然已經是不小的成本),但如果需要快速查詢「今天下午兩點在後廠村路,速度超過60km/h的無人車有哪些」這樣的多緯度分組聚合查詢,那麼時序資料庫會是一個很好的選擇。

2. 什麼是時序資料庫

先來介紹什麼是時序數據。時序數據是基於時間的一系列的數據。在有時間的坐標中將這些數據點連成線,往過去看可以做成多緯度報表,揭示其趨勢性、規律性、異常性;往未來看可以做大數據分析,機器學習,實現預測和預警。

時序資料庫就是存放時序數據的資料庫,並且需要支持時序數據的快速寫入、持久化、多緯度的聚合查詢等基本功能。

對比傳統資料庫僅僅記錄了數據的當前值,時序資料庫則記錄了所有的歷史數據。同時時序數據的查詢也總是會帶上時間作為過濾條件。

下面介紹下時序資料庫的一些基本概念(不同的時序資料庫稱呼略有不同)。

metric: 度量,相當於關係型資料庫中的table。

data point: 數據點,相當於關係型資料庫中的row。

timestamp:時間戳,代表數據點產生的時間。

field: 度量下的不同欄位。比如位置這個度量具有經度和緯度兩個field。一般情況下存放的是會隨著時間戳的變化而變化的數據。

tag: 標籤,或者附加信息。一般存放的是並不隨著時間戳變化的屬性信息。timestamp加上所有的tags可以認為是table的primary key。

如下圖,度量為Wind,每一個數據點都具有一個timestamp,兩個field:direction和speed,兩個tag:sensor、city。它的第一行和第三行,存放的都是sensor號碼為95D8-7913的設備,屬性城市是上海。隨著時間的變化,風向和風速都發生了改變,風向從23.4變成23.2;而風速從3.4變成了3.3。

3. 時序資料庫的場景

所有有時序數據產生,並且需要展現其歷史趨勢、周期規律、異常性的,進一步對未來做出預測分析的,都是時序資料庫適合的場景。

在工業物聯網環境監控方向,百度天工的客戶就遇到了這麼一個難題,由於工業上面的要求,需要將工況數據存儲起來。客戶每個廠區具有20000個監測點,500毫秒一個採集周期,一共20個廠區。這樣算起來一年將產生驚人的26萬億個數據點。假設每個點50Byte,數據總量將達1P(如果每臺伺服器10T的硬碟,那麼總共需要100多臺伺服器)。這些數據不只是要實時生成,寫入存儲;還要支持快速查詢,做可視化的展示,幫助管理者分析決策;並且也能夠用來做大數據分析,發現深層次的問題,幫助企業節能減排,增加效益。最終客戶採用了百度天工的時序資料庫方案,幫助他解決了難題。

在網際網路場景中,也有大量的時序數據產生。百度內部有大量服務使用天工物聯網平臺的時序資料庫。舉個例子,百度內部服務為了保障用戶的使用體驗,將用戶的每次網絡卡頓、網絡延遲都會記錄到百度天工的時序資料庫。由時序資料庫直接生成報表以供技術產品做分析,儘早的發現、解決問題,保證用戶的使用體驗。

4. 時序資料庫遇到的挑戰

很多人可能認為在傳統關係型資料庫上加上時間戳一列就能作為時序資料庫。數據量少的時候確實也沒問題,但少量數據是展現的緯度有限,細節少,可置信低,更加不能用來做大數據分析。很明顯時序資料庫是為了解決海量數據場景而設計的。

可以看到時序資料庫需要解決以下幾個問題

l 時序數據的寫入:如何支持每秒鐘上千萬上億數據點的寫入。

l 時序數據的讀取:又如何支持在秒級對上億數據的分組聚合運算。

l 成本敏感:由海量數據存儲帶來的是成本問題。如何更低成本的存儲這些數據,將成為時序資料庫需要解決的重中之重。

這些問題不是用一篇文章就能含蓋的,同時每個問題都可以從多個角度去優化解決。在這裡只從數據存儲這個角度來嘗試回答如何解決大數據量的寫入和讀取。

5. 數據的存儲

數據的存儲可以分為兩個問題,單機上存儲和分布式存儲。

單機存儲

如果只是存儲起來,直接寫成日誌就行。但因為後續還要快速的查詢,所以需要考慮存儲的結構。

傳統資料庫存儲採用的都是B tree,這是由於其在查詢和順序插入時有利於減少尋道次數的組織形式。我們知道磁碟尋道時間是非常慢的,一般在10ms左右。磁碟的隨機讀寫慢就慢在尋道上面。對於隨機寫入B tree會消耗大量的時間在磁碟尋道上,導致速度很慢。我們知道SSD具有更快的尋道時間,但並沒有從根本上解決這個問題。

對於90%以上場景都是寫入的時序資料庫,B tree很明顯是不合適的。

業界主流都是採用LSM tree替換B tree,比如Hbase, Cassandra等nosql中。這裡我們詳細介紹一下。

LSM tree包括內存裡的數據結構和磁碟上的文件兩部分。分別對應Hbase裡的MemStore和HLog;對應Cassandra裡的MemTable和sstable。

LSM tree操作流程如下:

1. 數據寫入和更新時首先寫入位於內存裡的數據結構。為了避免數據丟失也會先寫到WAL文件中。

2. 內存裡的數據結構會定時或者達到固定大小會刷到磁碟。這些磁碟上的文件不會被修改。

3. 隨著磁碟上積累的文件越來越多,會定時的進行合併操作,消除冗餘數據,減少文件數量。

可以看到LSM tree核心思想就是通過內存寫和後續磁碟的順序寫入獲得更高的寫入性能,避免了隨機寫入。但同時也犧牲了讀取性能,因為同一個key的值可能存在於多個HFile中。為了獲取更好的讀取性能,可以通過bloom filter和compaction得到,這裡限於篇幅就不詳細展開。

分布式存儲

時序資料庫面向的是海量數據的寫入存儲讀取,單機是無法解決問題的。所以需要採用多機存儲,也就是分布式存儲。

分布式存儲首先要考慮的是如何將數據分布到多臺機器上面,也就是 分片(sharding)問題。下面我們就時序資料庫分片問題展開介紹。分片問題由分片方法的選擇和分片的設計組成。

分片方法

時序資料庫的分片方法和其他分布式系統是相通的。

哈希分片:這種方法實現簡單,均衡性較好,但是集群不易擴展。

一致性哈希:這種方案均衡性好,集群擴展容易,只是實現複雜。代表有Amazon的DynamoDB和開源的Cassandra。

範圍劃分:通常配合全局有序,複雜度在於合併和分裂。代表有Hbase。

分片設計

分片設計簡單來說就是以什麼做分片,這是非常有技巧的,會直接影響寫入讀取的性能。

結合時序資料庫的特點,根據metric+tags分片是比較好的一種方式,因為往往會按照一個時間範圍查詢,這樣相同metric和tags的數據會分配到一臺機器上連續存放,順序的磁碟讀取是很快的。再結合上面講到的單機存儲內容,可以做到快速查詢。

進一步我們考慮時序數據時間範圍很長的情況,需要根據時間範圍再將分成幾段,分別存儲到不同的機器上,這樣對於大範圍時序數據就可以支持並發查詢,優化查詢速度。

如下圖,第一行和第三行都是同樣的tag(sensor=95D8-7913;city=上海),所以分配到同樣的分片,而第五行雖然也是同樣的tag,但是根據時間範圍再分段,被分到了不同的分片。第二、四、六行屬於同樣的tag(sensor=F3CC-20F3;city=北京)也是一樣的道理。

p5-時序數據分片說明

6. 真實案例

下面我以一批開源時序資料庫作為說明。

InfluxDB:

非常優秀的時序資料庫,但只有單機版是免費開源的,集群版本是要收費的。從單機版本中可以一窺其存儲方案:在單機上InfluxDB採取類似於LSM tree的存儲結構TSM;而分片的方案InfluxDB先通過+(事實上還要加上retentionPolicy)確定ShardGroup,再通過+的hash code確定到具體的Shard。

這裡timestamp默認情況下是7天對齊,也就是說7天的時序數據會在一個Shard中。

Kairosdb:

底層使用Cassandra作為分布式存儲引擎,如上文提到單機上採用的是LSM tree。

Cassandra有兩級索引:partition key和clustering key。其中partition key是其分片ID,使用的是一致性哈希;而clustering key在一個partition key中保證有序。

Kairosdb利用Cassandra的特性,將 ++<數據類型>+作為partition key,數據點時間在timestamp上的偏移作為clustering key,其有序性方便做基於時間範圍的查詢。

partition key中的timestamp是3周對齊的,也就是說21天的時序數據會在一個clustering key下。3周的毫秒數是18億正好小於Cassandra每行列數20億的限制。

OpenTsdb:

底層使用Hbase作為其分布式存儲引擎,採用的也是LSM tree。

Hbase採用範圍劃分的分片方式。使用row key做分片,保證其全局有序。每個row key下可以有多個column family。每個column family下可以有多個column。

上圖是OpenTsdb的row key組織方式。不同於別的時序資料庫,由於Hbase的row key全局有序,所以增加了可選的salt以達到更好的數據分布,避免熱點產生。再由與timestamp間的偏移和數據類型組成column qualifier。

他的timestamp是小時對齊的,也就是說一個row key下最多存儲一個小時的數據。並且需要將構成row key的metric和tags都轉成對應的uid來減少存儲空間,避免Hfile索引太大。下圖是真實的row key示例。

p7-open tsdb的row key示例(注3)

7. 結束語

可以看到各分布式時序資料庫雖然存儲方案都略有不同,但本質上是一致的,由於時序數據寫多讀少的場景,在單機上採用更加適合大吞吐量寫入的單機存儲結構,而在分布式方案上根據時序數據的特點來精心設計,目標就是設計的分片方案能方便時序數據的寫入和讀取,同時使數據分布更加均勻,儘量避免熱點的產生。

數據存儲是時序資料庫設計中很小的一塊內容,但也能管中窺豹,看到時序資料庫從設計之初就要考慮時序數據的特點。後續我們會從其他的角度進行討論。


相關焦點

  • 十分鐘看懂時序資料庫(IV)- 分級存儲
    作為物聯網領域數據存儲的首選,時序資料庫也越來越多進入人們的視野,而早在2016年7月,百度雲在其天工物聯網平臺上發布了國內首個多租戶的分布式時序資料庫產品TSDB,成為支持其發展製造,交通,能源,智慧城市等產業領域的核心產品,同時也成為百度戰略發展產業物聯網的標誌性事件。
  • 十分鐘看懂時序資料庫(II)- 預處理
    作為物聯網領域數據存儲的首選時序資料庫也越來越多進入人們的視野,早在2016年7月,百度雲在其天工物聯網平臺上發布了國內首個多租戶的分布式時序資料庫產品TSDB。前文提到時序數據是一個寫多讀少的場景,對時序資料庫以及數據存儲方面做了論述,數據查詢和聚合運算同樣是時序資料庫必不可少的功能之一。如何支持在秒級對上億數據的查詢分組聚合運算成為了時序資料庫產品必須要面對的挑戰。
  • 十分鐘看懂時序資料庫(V)- 分布式計算
    作為物聯網領域數據存儲的首選,時序資料庫也越來越多進入人們的視野,而早在2016年7月,百度雲在其天工物聯網平臺上發布了國內首個多租戶的分布式時序資料庫產品TSDB,成為支持其發展製造,交通,能源,智慧城市等產業領域的核心產品,同時也成為百度戰略發展產業物聯網的標誌性事件。
  • 十分鐘看懂時序資料庫(III)- 壓縮
    作為物聯網鄰域數據存儲的首選時序資料庫也越來越多進入人們的視野,而早在2016年7月,百度雲在其天工物聯網平臺上發布了國內首個多租戶的分布式時序資料庫產品TSDB,成為支持其發展製造,交通,能源,智慧城市等產業領域的核心產品,同時也成為百度戰略發展產業物聯網的標誌性事件。壓縮對於時序資料庫是至關重要的。因為時序資料庫面對的物聯網場景每天都會產生上億條數據。
  • 時序資料庫的前世今生
    Facebook開源了beringei時序資料庫,基於PostgreSQL打造的時序資料庫TimeScaleDB也開源了。時序資料庫作為物聯網方向一個非常重要的服務,業界的頻頻發聲,正說明各家企業已經迫不及待的擁抱物聯網時代的到來。 本文會從時序資料庫的基本概念、應用場景、需求與能力等方面一一展開,帶你了解時序資料庫的前世今生。
  • 工業大數據中的實時資料庫與時序資料庫
    在工業大數據資料庫存儲領域,除了傳統的關係型資料庫和分布式資料庫以外,還有一種類型的資料庫是非常常用,而且是非常有必要的,就是實時資料庫和時序資料庫。實時資料庫誕生於美國,主要是因為現代工業製造流程及大規模工業自動化的發展,導致大量的測量數據需要集成和存儲,而採用關係資料庫難以滿足速度和容量的要求,因此在80年代中期,開始誕生了適用於工業監控領域的實時資料庫。實時資料庫其實並不單單只是一個資料庫,而是一個系統,包括對各類工業接口的數據採集,海量監測數據的壓縮、存儲及檢索,基於監測數據的反饋及控制功能等。
  • 工業網際網路為什麼需要時序資料庫?
    勉強翻譯一下:「時序列資料庫就是用來存儲時序列(time-series)數據並以時間(時間點或時間區間)建立索引的軟體。」簡而言之,時序資料庫全稱為時間序列資料庫。時間序列資料庫主要用於指處理帶時間標籤(按照時間的順序變化,即時間序列化)的數據,帶時間標籤的數據也稱為時間序列數據。
  • 日吞吐萬億,騰訊雲時序資料庫CTSDB解密
    MySQL等關係型資料庫:寫入吞吐低:單機寫入吞吐低,很難滿足時序數據千萬級的寫入壓力;存儲成本大:對於時序數據壓縮不佳,需佔用大量機器資源;維護成本高:單機系統,需要在上層人工的分庫分表,維護成本高;查詢性能差:適用於交易處理,海量數據的聚合分析性能差。2.
  • 時序數據分析利器,青雲QingCloud ChronusDB 時序資料庫正式上線
    為了存儲這些與時間相關的數據,一種以時間戳為主鍵的數據模型,越來越流行,存儲該數據模型的資料庫被稱為時序資料庫。為了滿足工業物聯網、智能家居、監控等行業對時序數據的需求,青雲QingCloud 推出了 ChronusDB,它是我們自研的一款高效、安全、易用,具備強大分析能力的時序資料庫,具備超強的查詢分析功能、高性能並發讀寫、低成本存儲、豐富的時序數據處理能力、穩定可擴展等特性。
  • 百度智能雲時序時空資料庫正式開放內測
    因此,高效挖掘時空數據變得迫在眉睫,資料庫產品的存儲與分析能力也面臨著嚴峻的挑戰。作為國內首個多租戶的分布式時序資料庫產品,百度智能雲天工物聯網平臺時序資料庫日前正式升級為時序時空資料庫,並面向業內合作夥伴開放內測。
  • 亞馬遜雲服務(AWS)宣布AmazonTimestream時序資料庫正式可用
    作為一款面向物聯網和運營應用的全新時序資料庫,Amazon Timestream每天可處理數萬億規模的時序事件,速度比關係型資料庫快多達1000倍,而成本卻低至其1/10.Amazon Timestream將最新數據保存在內存之中,並根據用戶定義的策略,將歷史數據移動至成本優化的存儲層,從而為客戶節省精力和費用。
  • 工業領域基於MongoDB設計時序資料庫及應用
    首先什麼是時序資料庫工業領域大部分都是使用的實時資料庫,對於物聯網到來的今天,傳統的實時資料庫已經不能滿足現在的需求。這時候來自網際網路大家庭的時序資料庫方案就展現出了一些先天優勢,比如:分布式架構的天然優勢:傳統的實時資料庫多是主備的部署架構,通常要求有較高配置的機器,來追求單機極致的性能;同時,在穩定性方面,會對運行軟體的穩定性做極高的要求,完全由高質量的代碼來保證運行的穩定;由於存儲容量有限,也會要求超高的數據壓縮比。
  • 百度雲時序資料庫支持SQL開放內測啦!
    而傳統的關係型的資料庫架構,顯然已經不適應物聯網場景下,數據「高並發寫入的需求」。傳統的聯合查詢的方式,無法實現秒級返回億級數據點的聚合結果,對業務的發展造成很大的瓶頸。如果採用開源時序資料庫的方案,刨除優劣勢分析,僅維護成本高、無SLA保證、無法保證交付質量,已經讓人望而卻步。
  • 「監控」時序資料庫 InfluxDB 概述
    如何去做這個查詢的優化時很關鍵的事情(公司目前遇到的難題)針對監控數據多寫少讀,成本低敏的特點,如何去設計高效的存儲引擎。既能充分發揮硬體性能,又能在高效壓縮存儲的同時保障查詢效率。簡介InfluxDB 是一個用於存儲和分析時間序列數據的開源資料庫(集群模式的不對外開源)。
  • 亞馬遜雲服務(AWS)宣布Amazon Timestream時序資料庫正式可用
    作為一款面向物聯網和運營應用的全新時序資料庫,Amazon Timestream每天可處理數萬億規模的時序事件,速度比關係型資料庫快多達1000倍,而成本卻低至其1/10。Amazon Timestream將最新數據保存在內存之中,並根據用戶定義的策略,將歷史數據移動至成本優化的存儲層,從而為客戶節省精力和費用。
  • 一篇文章告訴你,為什麼時序資料庫會成為新趨勢?
    【IT168 評論】為什麼要為時間序列來建立專門的資料庫?明明我們就有很多方法來處理時序數據,例如在SQL資料庫中通過時間列的排序來解決或者是選擇Cassandra這樣的分布式資料庫。但是,這些方法雖然能夠解決時序數據的問題,但是卻需要進行大量的工作,十分耗時。那麼怎麼才能更好的解決時序數據呢?
  • 四大能力覆蓋豐富時空場景 百度智能雲時序時空資料庫正式開放內測
    隨著移動網際網路、物聯網、5G的迅猛發展,時空數據將呈現爆發式地增長,海量時空數據中所蘊含的巨大價值對智慧城市、數字孿生等行業的建設具有重要意義,高效地時空數據挖掘正變得迫在眉睫,資料庫產品的存儲與分析能力也面臨著嚴峻的挑戰。作為國內首個多租戶的分布式時序資料庫產品,百度智能雲天工物聯網平臺時序資料庫日前正式升級為時序時空資料庫,並面向業內合作夥伴開放內測。
  • 時序資料庫HiTSDB:分布式流式聚合引擎
    導讀:高性能時間序列資料庫 (High-Performance Time Series Database , 簡稱 HiTSDB) 是一種高性能,低成本,穩定可靠的在線時序資料庫服務, 提供高效讀寫,高壓縮比存儲、時序數據插值及聚合計算,時間線多維分析,主要服務於監控系統和IoT領域。
  • 百度智能雲時序資料庫助力新基建,新計費套餐更優惠、更靈活
    這種超大規模的物聯網數據的處理載體,都是時序資料庫大展身手的舞臺。近日,百度智能雲推出時序數據的新計費形式,助力企業大步跟上新基建的黃金浪潮。目前,對於大規模的數據場景,百度時序資料庫通過優化應用開發算法,實現按需付費,提供0.03元/百萬點/月的寫入費用,相比於原有0.5元/百萬點/月的寫入費用實現大幅優惠,並且免費存儲1年,1年後如果不需要可以刪除數據,續存數據只需要0.015元/億點/月。新的計費模式更加靈活,大大降低數據管理成本,起步價僅需2元/月,歡迎試用。
  • Basho 開源了它的時序資料庫產品 Riak TS
    Riak KV產品構建於Riak內核之上,提供了一種高彈性、高可用的鍵值資料庫。Riak KV產品當前正在持續改進中,專注於數據正確性、預防數據損失和破壞等特性。Riak TS產品源於Riak KV資料庫,是一種為時序數據倉庫而專門構建的產品。其中集成了Riak KV產品的所有強大功能,並使用這些功能去解決用戶在處理時序數據中所遇到的問題。