Influxdb的存儲引擎


創建Influxdb數據庫時,我們可以看到下面選項,每個選項的含義就是本文要描述的:

image

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 的數據存儲可以支持多碎片存儲,每個碎片可以是一種存儲引擎,如下圖,一個數據庫可以有多個碎片。

image 

每個碎片存儲都有下面屬性,跟上面圖的內容項對應:

{
  "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 標示永久。

image 

"shardDuration": "1d",    表示 多長時間做次清理。

image

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM