zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    汉化DevExpress
    《苹果往事》的台式翻译
    说说《程序员》杂志的排版
    关于量化考核绩效
    as3 浅复制 深复制
    斜视角的讨论(转)
    斜角地图原理解释及斜角图形绘制实例细述(转)
    垃圾回收测试
    Flash务实主义(八)——减少数据传输量(转)
    翻译]游戏主循环
  • 原文地址:https://www.cnblogs.com/ghj1976/p/4146949.html
Copyright © 2011-2022 走看看