【編者按】
劉斌,OneAPM後端研發工程師,擁有10多年編程經驗,參與過大型金融、通訊以及Android手機操做系的開發,熟悉Linux及後臺開發技術。曾參與翻譯過《第一本Docker書》、《GitHub入門與實踐》、《Web應用安全權威指南》、《WEB+DB PRESS》、《Software Design》等書籍,也是Docker入門與實踐課程主講人。本文所闡述的「時間序列數據庫」,系筆者所負責產品 Cloud Insight 對性能指標進行聚合、分組、過濾過程當中的梳理和總結。html
經過上一章《時序列數據庫武鬥大會之什麼是TSDB》的介紹,相信你們已經知道了什麼是時序列數據庫,以及對它能幹什麼,具備什麼特色。mysql
那麼在這一篇文章中,咱們將介紹一下目前都有哪些 TSDB,以及它們各自的特色,並基於我的觀點,給出必定的(喜愛)評判。web
因爲我的能力所限,有些地方調查可能不到位,再加上必定的我的主觀因素,跟其餘人的結論可能不同,不過這應該也正常。沒有調查過就沒有發言權,只有真正的深度用戶的發言,才具備說服務力,你權當這裏就是我拋磚了。算法
雖然也有人用 ElasticSearch 或者 MongoDB 來存儲時序列數據,做爲更適合分類爲 NOSQL 的這兩個數據庫軟件,咱們這裏就不對它們作介紹了。sql
咱們先來看一下DB-Engines中關於時序列數據庫的排名,這是當前(2016年2月的)排名狀況:數據庫
下面,咱們就按照這個排名的順序,簡單介紹一下這些時序列數據庫中的一些。下面要介紹的 TSDB 以開源的爲主,若是是商業或者 SaaS 服務,也簡單介紹一下其特色,讓你們能對其餘領域的事物也有所瞭解。編程
這裏有一個例外,就是 Pinot 並不在這個排名裏,可是我也把它列在了這裏。後端
InfluxDB 由 Golang 語言編寫,也是由 Golang 編寫的軟件中比較著名的一個,在不少 Golang 的沙龍或者文章中可能都會把 InfluxDB 當標杆來介紹,這也間接幫助 InfluxDB 提升了知名度。安全
InfluxDB的主要特色包括下面這些:服務器
schemaless(無結構),能夠是任意數量的列
可擴展(集羣)
方便、強大的查詢語言
Native HTTP API
集成了數據採集、存儲、可視化功能
實時數據 Downsampling
高效存儲,使用高壓縮比算法,支持retention polices
InfluxDB 是 TSDB 中爲數很少的進行了用戶和角色方面實現的,提供了 Cluster Admin、Database Admin 和 Database User 三種角色。
InfluxDB 的數據採集系統也支持多種協議和插件: - 行文本 - UDP - Graphite - CollectD - OpenTSDB
不過 InfluxDB 每次變更都較大,尤爲是在存儲和集羣方面,追求平平安過日子,不想瞎折騰的能夠考慮下。
注意:因爲InfluxDB開發太活躍了,極可能你在網上搜到的資料都是老的,會害到你,因此你須要以官方文檔爲主。
一句話總結:欣欣向榮、值得一試。
RRDtool 全稱爲 Round Robin Database Tool,也就是用於操做 RRD 的工具,簡單明瞭的軟件名。
什麼是 RRD 呢?簡單來講它就是一個循環使用的固定大小的數據庫文件(其實也不太像典型的數據庫)。
大致來講,RRDtool 提供的主要工具以下:
建立RRD(rrdtool create)
更新RRD(rrdtool update)
畫圖(rrdtool graph)
這其中,畫圖功能是最複雜也是最強大的,甚至支持下面這些圖形,這是其餘 TSDB 中少見的:
指標比較,對兩個指標值進行計算,描畫出知足條件的區域
移動平均線
和歷史數據進行對比
基於最小二乘法的線性預測
曲線預測
總之,它的畫圖功能太豐富了。
一句話總結:老牌經典、藝多不壓身。
Graphite 由 Orbitz, LLC 的 Chris Davis 創立於 2006 年,它主要有兩個功能:
存儲數值型時序列數據
根據請求對數據進行可視化(畫圖)
相應的,它的特色爲:
分佈式時序列數據存儲,容易擴展
功能強大的畫圖Web API,提供了大量的函數和輸出方式
Graphite自己不帶數據採集功能,可是你能夠選擇不少第三方插件,好比適用於* collectd、Ganglia或Sensu的插件等。同時,Graphite也支持Plaintext、Pickle和AMQP這些數據輸入方式。
Graphite主要由三個模塊組成:
whisper:建立、更新RRD文件
carbon:以守護進程的形式運行,接收數據寫入請求
carbon-cache:數據存儲
carbon-relay:分區和複製,位於carbon-cache以前,相似carbon-cache的負載均衡
carbon-aggregator:數據集計,用於減輕carbon-cache的負載
graphite-web:用於讀取、展現數據的Web應用
whisper 使用了相似 RRDtool 的 RRD 文件格式,它也不像 C/S 結構的軟件同樣,沒有服務進程,只是做爲 Python library 使用,提供對數據的 create/update/fetch 操做。
若是你對它的性能比較在乎,這裏有一份老的數據可供參考。
Google、Etsy、GitHub、豆瓣、Instagram、Evernote 和 Uber 等不少知名公司都是 Graphite 的用戶。有此背景,其可信度又加一層,並且網上的資料也至關的多,值得評估一下。
一句話總結:羣衆基礎好、能夠參考。
OpenTSDB 是一個分佈式、可伸縮的時間序列數據庫。它支持豪秒級數據採集全部 metrics,支持永久存儲(不須要 downsampling),和 InfluxDB 相似,它也是無模式,以 tag 來實現維度的概念。
好比,這就是它的一個metric例子:
mysql.bytes_received 1287333217 66666666 schema=foo host=db1
OpenTSDB 的節點稱爲 TSD(Time Series Daemon (TSD)),它沒有主、從之分,消除了單點隱患,很是容易擴展。它主要以HBase做爲存儲系統,如今也增長了對 Cassandra 和 Bigtable(非雲端)。
OpenTSDB 以數據存儲和查詢爲主,附帶了一個簡單地圖形界面(依賴Gnuplot),共開發、調試使用。
一句話總結:好用,咱們的產品Cloud Insight 也在用這項技術來實現對性能指標進行聚合、分組、過濾。
全部 TSDB 中,估計就數這個最酷了,我說的是域名,只有兩個字母,猥瑣地想一下,域名就值不少錢 :-)。
kdb+
是一個面向列的時序列數據庫,以及專門爲其設計的查詢語言q
(和他們的域名同樣簡短)。Kdb+ 混合使用了流、內存和實時分析,速度很快,支持分析 10 億級別的記錄以及快速訪問TB級別的歷史數據。
不過這是一個商業產品,可是也提供了免費版本(貌似還限制在32位)。
KairosDB 是一個 OpenTSDB 的 fork,不過是基於 Cassandra 存儲的。因爲 Cassandra 的行比 HBase 寬,因此 KairosDB 的 Cassandra 的默認行大小爲 3 星期,而 OpenTSDB 的 HBase 則爲 1 小時。
KairosDB 支持經過 Telnet、Rest、Graphite 等協議寫入數據,你也能夠經過編寫插件本身實現數據寫入。
KairosDB 也提供了基於 Web API 的查詢接口,支持數據聚合、持過濾和分組等功能。
同時 KairosDB 提供了一個供開發用的 Web UI,圖形繪製引擎使用了 Flot。
和 OpenTSDB 相似,KairosDB 也提供了插件機制,你可使用插件完成以下工做:
添加數據點(data point)監聽器
添加新的數據存儲服務
添加新的協議處理程序
添加自定義系統監視服務
Druid 是一個快速、近實時的海量數據 OLAP 系統,而且是開源的。Druid 誕生於 Metamarkets,後來一些核心人員創立了 IMPLY 公司,進行 Druid 相關的產品開發。
Druid 會按時間來進行分區(segment),而且是面向列存儲的。它的主要特性以下:
支持嵌套數據的列式存儲
層級查詢
二級索引
實時數據攝取
分佈式容錯架構
根據去年末 druid.io 的白皮書,如今生產環境下最大的集羣規模以下:
3M EVENTS / SECOND SUSTAINED (200B+ EVENTS/DAY)
10 – 100K EVENTS / SECOND / CORE
500TB OF SEGMENTS (>50 TRILLION RAW EVENTS)
5000 CORES (>400 NODES, >100TB RAM)
QUERY LATENCY (500MS AVERAGE)
90% < 1S 95% < 2S 99% < 10S
3+ trillion events/month
3M+ events/sec through Druid’s real-time ingestion
100+ PB of raw data
50+ trillion events
Druid 企業用戶比較多,好比 OneAPM、Netflix 和 Paypal 等。具體能夠參考 http://druid.io/druid-powered.html 。
Druid 架構比較複雜,所以對部署和運維也有必定的負擔,好比須要的機器多、機器配置要高(尤爲是內存)。
一句話總結:好用,咱們在用。
Prometheus 是一個開源的服務監控系統和時序列數據庫,由社交音樂平臺 SoundCloud 在2012年開發,最近也變得很流行,最新版本爲 0.17.0rc2。
Prometheus 從各類輸入源採集 metric,進行計算後顯示結果,或者根據指定條件出發報警。
和其餘監控系統相比,Prometheus 的特色包括:
多維數據模型(時序列數據由metric名和一組key/value組成)
靈活的查詢語言
不依賴分佈式存儲,單臺服務器便可工做
經過基於HTTP的pull方式採集是序列數據
能夠經過中間網關進行時序列數據推送
多種可視化和儀表盤支持
因爲 Prometheus 採用了相似 OpenTSDB 和 InfluxDB 的 key/value 維度機制,因此若是你對任一種 TSDB 有了解的話,學習起來會簡單些。
一句話總結:貌似比較火,何不試一試?
Pinot 是一個開源的實時、分佈式 OLAP 數據存儲方案。它來自 Linkedin,雖然 Linkedin 最近估價表現不好,可是他們建立的各類軟件、中間件實在太多了。這一點咱們作軟件的都應該向 Linkedin 表示感謝。
Pinot 就像是一個 Druid 的 copy,不過二者的靈感都來源於SenseiDB(Sensei 在日語裏爲老師的意思,寫成漢字爲「先生」)。
Pinot 也像 Druid 同樣,能加載 offline 數據(Hadoop 文件)和實時數據(Kafka)。Pinot 從設計上就面向水平擴展。
Pinot 主要特色:
面向列
插拔式索引引擎:排序索引、位圖索引和反向索引
根據查詢語句和segment信息對查詢/執行計劃進行優化
從 Kafka 實時數據攝取(ingestion)
從 Hadoop 進行批量攝取
相似 SQL 的查詢語言,支持聚合、過濾、分組、排序和惟一處理。
支持多值字段
水平擴展和容錯
Pinot 的特色和 Druid 很像,二者可互爲參考。
一句話總結:背靠大樹好乘涼。
這裏咱們爲你們介紹了幾種常見 TSDB,如不出意外,你可能會在這裏選擇某一種來使用。
儘管如此,咱們仍是會爲你們介紹更多一些的項目,讓你們能更多的瞭解一些不一樣的 TSDB 及其特色,也能幫助讀者深刻了解 TSDB 的各類場景,開闊思路。
在下一篇文章中,咱們將會爲各位再介紹幾種時序列數據庫。
這是本系列文章的其餘部分:
本文轉自 OneAPM 官方博客