时间序列数据库Influxdb的使用

BGbiao · · 1379 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

一、介绍

官网地址

为什么要使用InfluxDB 1.x?

  • 高性能:主要是因为基于Golang编写,且使用根据时间序列优化的TSM存储引擎
  • 类SQL查询:提供InfluxQL,一个类SQL的语言,可以方便数据查询和分析(支持正则,数学计算,时间序列函数)
  • 缩减采样和数据保留:Influxdb每秒可以处理百万条级别的数据,但是长时间处理如此体量的数据可能造成存储问题。Influxdb可以自动的压缩数据以减少存储空间的使用。另外你可以很容易的进行数据的采样,为有限的时间保存高精度的原始数据,为更久的历史数据保存低精度的汇总数据。在Influxdb中有两个核心特性可以保证数据的降采样和历史数据存储,即Continuous QueriesRetention Policies.

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

influxdb1.7官方文档

二、生产环境注意

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

    1. 索引类型切换为tsi1。默认的索引类型为inmem,当series cardinality超过4百万的时候,很容易造成OOM。tsi1使用冷热数据分离的方式,可以很容易支持上千万的series
    1. 尽量将InfluxDB的数据存储在SSD之类的高性能存储上
    1. 虽然NoSQL存储使用较为方便,schema设计仍然要注意
    1. 合理的利用continuous queryretention policy来对历史数据进行归档以及删除

influxdb通用型问题列表

三、 相关技术点说明

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

influxdb-tsi

当我们使用Influxdb来处理数据时,我们不仅存储value,而且还存储表(measurement)和tag信息,以便能够让查询更快。在influx db早期版本中,索引数据仅能被存储在内存中inmem,通常那样需要大量的RAM内存空间,并且需要在机器上设置series的最大> 数才能支持Influxdb的正常使用。通常,取决于机器的用途,该series最大数会设置在1 - 4 million之间。

TSI被开发用来可以允许series超过这个最大值,TSI设计为存储索引数据到磁盘上,而不直接访问RAM。TSI使用操作系统层面的> 大页缓存(page cache)来拉取热点数据到内存中,使得冷数据继续存储在磁盘上。

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

开启时间序列索引:index-version = tsi1

工具包
index_inspect文档
influx_inspect dumptsi 可以打印索引,文件,或者文件集合上的统计概要

influx_inspect buildtsi 可以将一个已存在的内存型索引的分片转换为TSI索引的分片,或者已存在的TSI索引被损坏,也可以> 使用该命令从TSM数据中进行恢复。如果有一个已存在的TSI索引需要重建,首先要在分片内删除索引目录index directory.

TSI文件结构
TSI是一个LSM(log-structured merge tree-based)数据库,主要用来存储influxdb的series data. TSI由以下几个部分组成

  • Index: 包含单个分片里的所有索引数据集
  • Partition: 包含一个分片数据的已分片的分区
  • LogFile: 包含一个最新写入的series作为一个in-mem 索引,并持久化成一个WAL文件
  • IndexFile: 包含一个不变的内存映射索引,通常由一个LogFile或者两个连续的index file合并而来

SeriesFile包含全部数据库的全部series集合,在该数据库的每个分片数都会共享相同的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)

一旦LogFile达到阈值(5MB),一个新的日志文件将会被创建,而之前的文件将被合并到IndexFile。第一个索引文件为L1级别,第一>个日志文件为L0级别。

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

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有如下部分:

    1. TagBlocks: 为单个tag key维护一个tag value的索引
    1. MeasurementBlock: 维护measurements的索引以及他们的tag keys
    1. Trailer: 为所有的文件存储偏移量信息(offset)

tsi1索引类型使用场景

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的统计

influxdb-schema设计

series-cardinality查询
series-cardinality计算公式

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

欢迎关注我的公众号


Wechat.jpeg

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:BGbiao

查看原文:时间序列数据库Influxdb的使用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1379 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传