博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kettle使用数据库来生成序列_时间序列数据库Influxdb的使用
阅读量:6279 次
发布时间:2019-06-22

本文共 4865 字,大约阅读时间需要 16 分钟。

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

一、介绍

官网地址[1]

为什么要使用InfluxDB 1.x?

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

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

influxdb1.7官方文档[2]

二、生产环境注意

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

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

influxdb通用型问题列表[3]

三、 相关技术点说明

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

influxdb-tsi[4]

当我们使用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文档[5]

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•2.Series被发送到Index中,该Index维护了一个已存在series ids的bitmap,同时它会忽略已经被创建的series•3.Series被使用hash算法分配到一个合适的分区(Partition)•4.Partition将写入这些series当做一条记录写入LogFile•5.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的索引•2.MeasurementBlock: 维护measurements的索引以及他们的tag keys•3.Trailer: 为所有的文件存储偏移量信息(offset)

tsi1索引类型使用场景[6]

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        truerp_1_day       24h0m0s  1h0m0s             1        falseone_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        falserp_1_day       24h0m0s  1h0m0s             1        falseone_month_only 744h0m0s 24h0m0s            1        true

3. schema设计和series的统计

influxdb-schema设计[7]

series-cardinality查询[8] series-cardinality计算公式[9]

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

欢迎关注我的公众号3ad1ee5b71152dc4204a0bd00ce4c6bf.png

References

[1] 官网地址: https://www.influxdata.com/time-series-platform/[2] influxdb1.7官方文档: https://docs.influxdata.com/influxdb/v1.7/[3] influxdb通用型问题列表: https://docs.influxdata.com/influxdb/v1.7/troubleshooting/frequently-asked-questions/[4] influxdb-tsi: https://docs.influxdata.com/influxdb/v1.7/concepts/tsi-details/[5] index_inspect文档: https://docs.influxdata.com/influxdb/v1.7/tools/influx_inspect/#dumptsi[6] tsi1索引类型使用场景: https://www.influxdata.com/blog/path-1-billion-time-series-influxdb-high-cardinality-indexing-ready-testing/[7] influxdb-schema设计: https://docs.influxdata.com/influxdb/v1.7/concepts/schema_and_data_layout/[8] series-cardinality查询: https://docs.influxdata.com/influxdb/v1.7/query_language/spec/#show-cardinality[9] series-cardinality计算公式: https://docs.influxdata.com/influxdb/v1.7/concepts/glossary/#series-cardinality

转载地址:http://bgjva.baihongyu.com/

你可能感兴趣的文章
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>