一般人們談論時間序列數據庫的時候指代的就是這一類存儲。按照底層技術不同可以划分為三類。
- 直接基於文件的簡單存儲:RRD Tool,Graphite Whisper。這類工具附屬於監控告警工具,底層沒有一個正規的數據庫引擎。只是簡單的有一個二進制的文件結構。
- 基於K/V數據庫構建:opentsdb(基於hbase),blueflood,kairosDB(基於cassandra),influxdb,prometheus(基於leveldb)
- 基於關系型數據庫構建:mysql,postgresql 都可以用來保存時間序列數據
另外一類數據庫其表結構是:
[timestamp] [d1] [d2] .. [dn] [v1] [v2] .. [vn]
其優化的查詢方式不限於查詢原始數據,而是可以組合查詢條件並且做聚合計算,比如:
SELECT d2, sum(v1) / sum(v2) FROM metric WHERE d1 = “A” AND timestamp >= B AND timestamp < C GROUP BY d2

我們希望時間序列數據庫不僅僅可以提供原始數據的查詢,而且要支持對原始數據的聚合能力。這種聚合可以是在入庫階段完成的,所謂物化視圖。也可以是在查詢階段完成,所謂實時聚合。根據實際情況,可以在這兩種方式中進行取舍。
想要在在查詢階段做數據的聚合和轉換,需要能夠支持以下三點。
- 用索引檢索出行號:能夠從上億條數據中快速過濾出幾百萬的數據。
- 從主存儲按行號加載:能夠快速加載這過濾出的幾百萬條數據到內存里。
- 分布式計算:能夠把這些數據按照GROUP BY 和 SELECT 的要求計算出最終的結果集。

要想盡可能快的完成整個查詢過程,需要在三個環節上都有絕招。傳統上說,這三個步驟是三個不同的技術領域。
- 檢索:這是搜索引擎最擅長的領域。代表產品是Lucene。其核心技術是基於高效率數據結構和算法的倒排索引。
- 加載:這是分析型數據庫最擅長的領域。代表產品是C-store和Monetdb。其核心技術是按列組織的磁盤存儲結構。
- 分布式計算:這是大數據計算引擎最擅長的領域。代表產品是Hadoop和spark。其核心技術是sharding 和 map/reduce等等。
前面提到的時間序列庫(比如opentsdb)有不少從功能上來說是沒有問題。它們都支持過濾,也支持過濾之后的聚合計算。在數據量小的時候勉強是可用的。但是如果要實時從十億條里取百萬記錄出來,再做聚合運算,對於這樣的數據量可能就勉為其難了。滿足海量數據實時聚合要求的數據庫不多,比較常見的有這么幾種:
- 基於Lucene構建的“搜索引擎”:Elasticsearch, Crate.io(雖然是基於Elasticsearch,但是聚合邏輯是自己實現的),Solr;
- 列式存儲數據庫:Vertica(C-store的后裔)Actian(Monetdb的后裔)等;
- Druid.io。
摘自:http://www.infoq.com/cn/articles/database-timestamp-01
