前言: 以前在刚开始搞Docker时,会使用TIG(Telegraf+Influxdb+Grafana)方案来处理Docker容器相关的监控数据,对Influxdb有一定的了解,但是由于业务场景和数据量的原因,没有过多关注。而如今,随着业务场景的丰富以及数据量的原因,需要对Influxdb进行更深入的学习和了解。

一、介绍

为什么要使用InfluxDB 1.x?

缩减采样和数据保留为有限的时间保存高精度的原始数据,为更久的历史数据保存低精度的汇总数据Continuous QueriesRetention Policies

Influxdb当前主要分为1.X版本和2.X版本,其中2.X版本当前处于Alpha版本,所以,生产环境暂时还是不推荐使用。1.X当前最新版本为1.7.

二、生产环境注意

注意:由于influxdb官方没有对进程进行内存限制,因此在很容易造成OOM,建议在使用前提前注意以下几点
tsi1inmemseries cardinalitytsi1seriesSSDschemacontinuous queryretention policy

三、 相关技术点说明

1. 时间序列索引细节(TSI Details)

inmemseries
TSI

在TSI中,也有一些参数可以限制你实际存储在一个节点上的series的数量,通常这个最大值被设置为30 million.

index-version = tsi1
influx_inspect dumptsi
influx_inspect buildtsiindex directory
TSIseries data
IndexPartitionLogFileIndexFile
SeriesFile

TSI数据写入流程

    1. Series被添加到一个series file中(如果已经存在就直接查找文件),同时返回一个自增的series id
    1. series被发送到Index中,该Index维护了一个已存在series ids的bitmap,同时它会忽略已经被创建的series
    1. series被使用hash算法分配到一个合适的分区(Partition)
    1. Partition将写入这些series当做一条记录写入LogFile
    1. LogFile将这些series写入到磁盘的write-ahead 日志文件,并添加该这些series到一组in-mem的索引中

TSI数据合并(Compaction)

LogFileIndexFile
注意:索引文件可以由两个小的索引文件合并而成

TSI Log File结构

在一个日志文件中的in-mem Index会追踪如下信息:

  • Measurements by name(表名)
  • Tag keys by measurement(表的tag keys)
  • Series by measurement(表的series)
  • Series by tag value(tag value的series)
  • series,measurements,tag keys, and tag values的位置

TSI Index File结构

index file是一个不变的文件,它会追踪log file中相似的信息,但是所有的数据都被索引且写入磁盘,以便于可以通过内存映射来直>接访问。

一个Index File有如下部分:

TagBlocksMeasurementBlockTrailer

2. 持续查询和数据保留策略(continuous query/retention policy)

注意:持续查询相当于相当于创建查询任务,可以定期对数据进行加工处理(降噪或聚合);保留策略可以适当将历史数据进行自动删除以释放空间

保留策略

# 创建数据保留策略
> CREATE RETENTION POLICY "rp_1_day" on "database" DURATION 1d REPLICATION 1
> CREATE RETENTION POLICY "one_month_only" on "database" DURATION 31d REPLICATION 1
> SHOW RETENTION POLICIES on recommend;
name           duration shardGroupDuration replicaN default
----           -------- ------------------ -------- -------
autogen        0s       168h0m0s           1        true
rp_1_day       24h0m0s  1h0m0s             1        false
one_month_only 744h0m0s 24h0m0s            1        false

# 将one_month_only 删除策略改为默认策略
> ALTER RETENTION POLICY "one_month_only" on "database"  DEFAULT
> SHOW RETENTION POLICIES on recommend;
name           duration shardGroupDuration replicaN default
----           -------- ------------------ -------- -------
autogen        0s       168h0m0s           1        false
rp_1_day       24h0m0s  1h0m0s             1        false
one_month_only 744h0m0s 24h0m0s            1        true

3. schema设计和series的统计

# 查看库的series cardinality
> SHOW SERIES CARDINALITY on database;
cardinality estimation
----------------------
5186623

欢迎关注我的公众号