随笔 - 934, 文章 - 0, 评论 - 249, 阅读 - 345万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Influxdb的存储引擎

Posted on   蝈蝈俊  阅读(7024)  评论(1编辑  收藏  举报

创建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

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示