創建Influxdb數據庫時,我們可以看到下面選項,每個選項的含義就是本文要描述的:
Influxdb內部數據的存儲可以使用不同的存儲引擎。當前0.8.7版本支持的是LevelDB, RocksDB, HyperLevelDB, 和 LMDB。
這幾個數據庫都是kv類型的數據庫,相關信息如下:
LevelDB 是一個google實現的非常高效的kv數據庫,目前的版本1.2能夠支持billion級別的數據量了。
LevelDB 是單進程的服務,性能非常之高,在一台4核Q6600的CPU機器上,每秒鍾寫數據超過40w,而隨機讀的性能每秒鍾超過10w。
此處隨機讀是完全命中內存的速度,如果是不命中 速度大大下降
LevelDB 只是一個 C/C++ 編程語言的庫, 不包含網絡服務封裝, 所以無法像一般意義的存儲服務器(如 MySQL)那樣, 用客戶端來連接它. LevelDB 自己也聲明, 使用者應該封裝自己的網絡服務器.
RocksDB 是一個來自 facebook 的可嵌入式的支持持久化的 key-value 存儲系統,也可作為 C/S 模式下的存儲數據庫,但主要目的還是嵌入式。RocksDB 基於 LevelDB 構建。
HyperLevelDB 是 HyperDex 開發的一個數據存儲引擎,改進自 Google 的 LevelDB 以滿足 HyperDex 的業務需要。
HyperLevelDB 主要在 LevelDB 上改進了:
1. 改進並行機制,使用更細粒度的內部鎖控制來提供多 writer 線程的高吞吐量
2. 改進數據壓縮
LMDB 是一個快而小的 key-value 數據存儲服務,是由 OpenLDAP 項目的 Symas 開發的。使用內存映射文件,因此讀取的性能跟內存數據庫一樣。其大小受限於虛擬地址空間的大小。
Influxdb 官方試驗了這三個引擎,發現RocksDB性能好,所以Influxdb的默認存儲引擎是RocksDB。
Influxdb 的數據存儲可以支持多碎片存儲,每個碎片可以是一種存儲引擎,如下圖,一個數據庫可以有多個碎片。
每個碎片存儲都有下面屬性,跟上面圖的內容項對應:
{ "name": "high_precision", "database": "pauls_db", "retentionPolicy": "7d", "shardDuration": "1d", "regex": "/^[a-z].*/", "replicationFactor": 1, "split": 1 }
在配置參數中, 我們可以看到 "database": "pauls_db" 標示 每個碎片存儲都只能屬於一個特定的數據庫,一個數據庫可以有多個 Shard Space。
"retentionPolicy": "7d" 表示數據被保存的時間(最少保存時間), 圖中的 Retention 就是這個, 下圖是系統界面中,對這個時間的設置, inf 標示永久。
"shardDuration": "1d", 表示 多長時間做次清理。
shardDuration 的值應該小於 retentionPolicy, 大於我們查詢時的group by time() 的值。
上面配置的例子中 "retentionPolicy": "7d", "shardDuration": "1d", 會導致我們保存 7-8 天的數據, 每天都會清理,把7天前的數據清理掉一次。
"replicationFactor": 1, 每個存儲碎片保存到幾台服務器的設置;
"split": 1 給定的時間間隔內,有多少個存儲碎片。
注意,這里有下面一個隱含的關系: replicationFactor * split == 服務器的數量。
數據被分配到那個碎片空間是基於下面的算法:
- Look up the shard spaces for the InfluxDB database
- Loop through the spaces and use the first one that matches the series name
- Lookup the shards for the given time interval
- If no shards exist, create N shards for the interval based on split
- Assign the data to a given shard in the interval using the algorithm hash(series_name) % N
使用 shard spaces 的最佳實踐是把高精度,大數據的數據 每個時間段寫一個 shard spaces 。在使用時把他們再合成一起。
參考資料:
Influxdb Storage Engines
http://influxdb.com/docs/v0.8/advanced_topics/sharding_and_storage.html