初識時序資料庫

來杯可樂不加糖發表於2019-11-25

前言:

在物聯網大資料時代,伺服器面臨著大量監控資料的上傳,資料庫的讀寫也有非常高的併發,毫無疑問,伺服器效能逐漸下降而成本逐漸上升。在此大環境下,時序資料庫應運而生,本文簡單介紹從筆者角度對時序資料庫的認知及學習,僅供參考。

1、什麼是時序資料庫?

概念:

時序資料庫全稱為時間序列資料庫 Time Series Database (TSDB)。主要用於指處理帶時間標籤(按照時間的順序變化,即時間序列化)的資料,帶時間標籤的資料也稱為時序資料。其具有不變性、唯一性、時間排序性的特點。

架構:

圖片

 特點:

  • 寫入特點:

    • 寫多讀少(這與其資料特性相關,例如報表,實時監控,通常只會關心幾個特定的關鍵指標或者在特定的場景下才會去讀資料)
    • 寫入平穩、持續、高併發高吞吐(時序資料的產生通常是以一個固定的時間頻率產生,不會受其他因素的制約,其資料生成的速度是相對比較平穩的。)
    • 實時寫入最近生成的資料,無update。(跟時間資料特性有關,資料是隨著時間推進的,每次資料都是新資料,故不存在舊資料的更新,但不排除人為資料的更正)
  • 查詢特點:

    • 按時間範圍讀取:通常來說不會去關心某個特定點的資料,而是一段時間的資料。
    • 最近的資料被讀取的概率高
    • 歷史資料粗粒度查詢的概率高(粗粒度和細粒度的區別主要是出於重用的目的,像類的設計,為儘可能重用,所以採用細粒度的設計模式,將一個複雜的類(粗粒度)拆分成高度重用的職責清晰的類(細粒度).對於資料庫的設計,原責:儘量減少表的數量與表與表之間的連線,能夠設計成一個表的情況就不需要細分,所以可考慮使用粗粒度的設計方式.)
    • 多精度查詢
    • 多維度分析
  • 儲存特點:

    • 資料量大(比如A節點的一個監控項上傳週期是1s,該節點的這個監控項每天會產生86400個資料點,若有1萬個監控項,則一天產生86400萬條資料。實際應用會是TB甚至PB級)
    • 冷熱分明(越是歷史的資料,被查詢和分析的概率越低)
    • 具有時效性(資料通常會有一個儲存週期,超過這個儲存週期的資料可以認為是失效的,可以被回收。一方面是因為越是歷史的資料,可利用的價值越低;另一方面是為了節省儲存成本,低價值的資料可以被清理)
    • 多精度資料儲存

時序資料:

  • 時序資料是基於時間的一系列的資料。在有時間的座標中將這些資料點連成線,往過去看可以做成多緯度報表,揭示其趨勢性、規律性、異常性;往未來看可以做大資料分析,機器學習,實現預測和預警。
  • 時序資料庫就是存放時序資料的資料庫,並且需要支援時序資料的快速寫入、持久化、多緯度的聚合查詢等基本功能。

時間標籤:

時序資料中資料由於其採用資料模型的不同而不同,例如採用關係模型、物件模型和XML模型的時序資料分別稱為時態關係、時態物件和時態XML資料。但無論那種時序資料,其中的時間標籤都會根據情形選用下述的時間表示形式。

  • 時間點(instant):連續模型中的時間就是在時間軸上實數點;離散模型中的時間點就是時間軸上的一個原子時間間隔,此時,時間點和時間粒度相關。例如當時間粒度為“天”時,2011年3月1日是時間點;而當時間粒度是“秒”時,上述時間點就由系統自動換算為2005年3月1日0時0分0秒。
  • 時間期間(period):給定兩個時間點t1和t2(t1≤t2),以t1為始點和以t2為終點的時間期間[t1 , t2]定義為集合{t| t是時間點並且t1≤t≤ t2}。時間點可以看作始點和終點的時間區間,此時的時間區間可以理解為延續時間為0的一段時間。在實際應用中,由於需要考慮時間區間相容時間點的表示和時間區間的比較謂詞,一般採用始點封閉,終點開放的“左閉右開”形式。
  • 時間區間(interval):時間區間是指持續的一段時間,其基本特徵是表示該段時間的長度。例如:“1 year 3 month”、“30天”、“28個小時”等。在資料庫系統內,一般用一個整數表示時間區間。時間區間有時也稱為時間跨度(Time Span)。
  • 時間元素(periods):有限個時間期間(可以是時間點)的集合。有時時間元素在英文中也寫為time element。時間元素對於正確有效表達複雜資料時間屬性有著重要意義。
  • 時間戳(timestamp):某一天中某一秒的一個部分,通常認為是一微秒。

  資料模型:

由序列 和資料點組成 (由時間戳 + 數值構成 的陣列)

  • 序列 :就是識別符號(維度),主要的目的是方便進行搜尋和篩選
  • 資料點:時間戳和數值構成的陣列
    • 行存:一個陣列包含多個點,如 [{t: 2017-09-03-21:24:44, v: 0.1002}, {t: 2017-09-03-21:24:45, v: 0.1012}]
    • 列存:兩個陣列,一個存時間戳,一個存數值,如[ 2017-09-03-21:24:44, 2017-09-03-21:24:45], [0.1002, 0.1012]

一般情況下:列存能有更好的壓縮率和查詢效能

基本概念:

  • metric: 度量,相當於關係型資料庫中的table。
  • data point: 資料點,相當於關係型資料庫中的row。
  • timestamp:時間戳,代表資料點產生的時間。
  • field: 度量下的不同欄位。比如位置這個度量具有經度和緯度兩個field。一般情況下存放的是會隨著時間戳的變化而變化的資料。
  • tag: 標籤,或者附加資訊。一般存放的是並不隨著時間戳變化的屬性資訊。time加上所有的tags可以認為是table的primary key。
        如下圖,度量為weather,每一個資料點都具有一個time,兩個field:humidity和temperature,兩個tag:altitude、area。
    圖片

挑戰:

  • 時序資料的寫入:如何支援每秒鐘上千萬上億資料點的寫入。
  • 時序資料的讀取:又如何支援在秒級對上億資料的分組聚合運算。
  • 成本敏感:由海量資料儲存帶來的是成本問題。如何更低成本的儲存這些資料,將成為時序資料庫需要解決的重中之重。

擴充套件:

關係型資料庫有一些特殊的用法,比如用 MySQL 的 VividCortex, 用 Postgres 的 Timescale。mysql 的引擎,除了常見的 innodb 和 myisam ,還有一個引擎叫 archive ,它的作用和 RRD (Round Robin Database)資料庫 差不多,支援插入和查詢操作。

2、常見的時序資料庫有哪些以及特點是什麼?

  • 1999/07/16 RRDTool First release
  • 2009/12/30 Graphite 0.9.5
  • 2011/12/23 OpenTSDB 1.0.0
  • 2013/05/24 KairosDB 1.0.0-beta
  • 2013/10/24 InfluxDB 0.0.1
  • 2014/08/25 Heroic 0.3.0
  • 2017/03/27 TimescaleDB 0.0.1-beta

RRDTool 是最早的時間序列資料庫,它自帶畫圖功能,現在大部分時間序列資料庫都使用Grafana來畫圖。

Graphite 是用 Python 寫的 RRD 資料庫,它的儲存引擎 Whisper 也是 Python 寫的, 它畫圖和聚合能力都強了很多,但是很難水平擴充套件。

OpenTSDB 使用 HBase 解決了水平擴充套件的問題

KairosDB 最初是基於OpenTSDB修改的,但是作者認為相容HBase導致他們不能使用很多 Cassandra 獨有的特性, 於是就拋棄了HBase僅支援Cassandra。

新發布的 OpenTSDB 中也加入了對 Cassandra 的支援。故事還沒完,Spotify 的人本來想使用 KairosDB,但是覺得專案發展方向不對以及效能太差,就自己擼了一個 Heroic。

InfluxDB 早期是完全開源的,後來為了維持公司運營,閉源了叢集版本。增加專門的時間序列資料庫單元。

3、InfluxDB

概念

InfluxDB是一個用於儲存和分析時間序列資料的開源資料庫。   

儲存引擎:

Time Structured Merge Tree (TSM) 和 Log Structured Merge Tree (LSM) 

  • 寫入的時候,資料先寫入到記憶體裡,之後批量寫入到硬碟。
  • 讀的時候,同時讀記憶體和硬碟然後合併結果。
  • 刪除的時候,寫入一個刪除標記,被標記的資料在讀取時不會被返回。
  • 後臺會把小的塊合併成大的塊,此時被標記刪除的資料才真正被刪除
  • 相對於普通資料,有規律的時間序列資料在合併的過程中可以極大的提高壓縮比。

特性:

  • 內建HTTP介面,使用方便
  • 資料可以打標記,這樣查詢可以很靈活
  • 類SQL的查詢語句
  • 安裝管理很簡單,並且讀寫資料很高效
  • 能夠實時查詢,資料在寫入時被索引後就能夠被立即查出

4、應用InfluxDB

準備:

安裝InfluxDB包需要root或是有管理員許可權才可以。

網路:

InfluxDB預設使用下面的網路埠:

  • TCP埠8086用作InfluxDB的客戶端和服務端的http api通訊
  • TCP埠8088給備份和恢復資料的RPC(Remote Procedure Call)服務使用

NTP:

InfluxDB使用伺服器本地時間給資料加時間戳,而且是UTC時區的。並使用NTP來同步伺服器之間的時間,如果伺服器的時鐘沒有通過NTP同步,那麼寫入InfluxDB的資料的時間戳就可能不準確。

Linux安裝:

#下載
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.9.x86_64.rpm
#安裝
sudo yum localinstall influxdb-1.7.9.x86_64.rpm

配置:

安裝完成後,可通過 influxd config 來檢視預設配置。配置檔案路徑在:/etc/influxdb/influxdb.conf

  配置檔案裡任意沒有註釋的配置都可以用來覆蓋內部預設值,需要注意的是,本地配置檔案不需要包括每一項配置。

使用自定義配置啟動InfluxDB:

  • 執行的時候通過可選引數-config來指定
    • influxd -config /etc/influxdb/influxdb.conf
  • 設定環境變數INFLUXDB_CONFIG_PATH來指定

    注:其中-config的優先順序高於環境變數

5、Reference:

簡書:https://www.jianshu.com/p/31afb8492eff
WIKI:https://en.wikipedia.org/wiki/Time_series_...

來杯可樂不加糖。

相關文章