Influxdb的存储引擎

建立Influxdb数据库时,咱们能够看到下面选项,每一个选项的含义就是本文要描述的:html

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。oop

 

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

相关文章
相关标签/搜索