乐趣区

时序数据库-InfluxDB四

相关文章:
时序数据库 InfluxDB(一)

时序数据库 InfluxDB(二)

时序数据库 InfluxDB(三)


存储引擎


InfluxDB 数据的写入如下图所示:

所有数据先写入到 WAL(Write Ahead Log)预写日志文件,并同步到 Cache 缓存中,当 Cache 缓存的数据达到了一定的大小,或者达到一定的时间间隔之后,数据会被写入到 TSM 文件中。

为了更高效的存储大量数据,存储引擎会将数据进行压缩处理,压缩的输入和输出都是 TSM 文件,因此为了以原子方式替换以及删除 TSM 文件,存储引擎由 FileStore 负责调节对所有 TSM 文件的访问权限。

Compaction Planner 负责确定哪些 TSM 文件已经准备好了可以进行压缩,并确保多个并发压缩不会互相干扰。

Compactor 压缩器则负责具体的 Compression 压缩工作。

为了处理文件,存储引擎通过 Writers/Readers 处理数据的写和读。另外存储引擎还会使用 In-Memory Index 内存索引快速访问 measurements、tags、series 等数据。

存储引擎的组成部分:

  • In-Memory Index:跨分片的共享内存索引,并不是存储引擎本身特有的,存储引擎只是用到了它。
  • WAL:预写日志。
  • Cache:同步缓存 WAL 的内容,并最终刷写到 TSM 文件中去。
  • TSM Files:特定格式存储最终数据的磁盘文件。
  • FileStore:调节对磁盘上所有 TSM 文件的访问。
  • Compactor:压缩器。
  • Compaction Planner:压缩计划。
  • Compression:编码解码压缩。
  • Writers/Readers:读写文件。

硬件指南


为了应对不同的负载情况,我需要机器具有怎样的硬件配置?

由于集群模式只有商业版本,因此这里只看免费的单机版的情况。

为了定义负载,我们关注以下三个指标:

  • 每秒写入
  • 每秒查询
  • series 基数

对于查询情况,我们根据复杂程度分为三级:

  • 简单查询:

    • 几乎没用函数和正则表达式
    • 时间范围在几分钟,几小时,或者一天之内
    • 执行时间通常在几毫秒到几十毫秒
  • 中等复杂度查询:

    • 使用了多个函数和一两个正则表达式
    • 可能使用了复杂的 GROUP BY 语句,或者时间范围是几个星期
    • 执行时间通常在几百毫秒到几千毫秒
  • 复杂查询:

    • 使用了多个聚合、转换函数,或者多个正则表达式
    • 时间跨度很大,有几个月或几年
    • 执行时间达到秒级

硬件配置需要关注的有:CPU 核数,RAM 内存大小,IOPS 性能。

IOPS(Input/Output Operations Per Second):每秒读写数,衡量存储设备(如 SSD 固态硬盘、HDD 机械硬盘等)的性能指标。

不同负载情况下的硬件配置参考如下:

由于 SSD 固态硬盘的性能更高,官方也建议使用 SSD,上图也是使用 SSD 的情况。

对于元数据,诸如 database name、measurement、tag key、tag value、field key 都只会存储一次,只有 field value 和 timestamp 每个点都存储。非字符串的值大约需要三个字节,字符串的值需要的空间大小不固定,需要由压缩情况确定。

内存肯定是越大越好,但是如果 series 基数超过千万级别,在默认使用的 in-memory 索引方式下,会导致内存溢出,在数据结构设计时需要注意。

通过将 wal 和 data 目录设置到不同的存储设备上,有利于减少磁盘的争用,从而应对更高的写入负载。相关配置项(默认的配置文件为 influxdb.conf):

[data]
    dir = "/var/lib/influxdb/data"
    wal-dir = "/var/lib/influxdb/wal"

个人公众号持续输出原创文章,有兴趣的可以关注下。

退出移动版