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