Influxdb原理1

本文详细介绍了InfluxDB的数据模型,包括Measurement、Tags、Fields、Point和Series的概念,以及其独特的数据组织方式,如使用RetentionPolicy进行时间范围分区和二次Hash分区以解决写入热点问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上篇文章《时序数据库体系技术 – 时序数据存储模型设计》中笔者分别介绍了多种时序数据库在存储模型设计上的一些考虑,其中OpenTSDB基于HBase对维度值进行了全局字典编码优化,Druid采用列式存储并实现了Bitmap索引以及局部字典编码优化,InfluxDB和Beringei都将时间线挑了出来,大大降低了Tag的冗余。在这几种时序数据库中,InfluxDB无疑显的更加专业。接下来笔者将会针对InfluxDB的基本概念、内核实现等进行深入的分析。本篇文章先行介绍一些相关的基本概念。

InfluxDB 数据模型

InfluxDB的数据模型和其他时序数据库有些许不同,下图是InfluxDB中的一张示意表:

1. Measurement:从原理上讲更像SQL中表的概念。这和其他很多时序数据库有些不同,其他时序数据库中Measurement可能与Metric等同,类似于下文讲到的Field,这点需要注意。

2. Tags:维度列

(1)上图中location和scientist分别是表中的两个Tag Key,其中location对应的维度值Tag Values为{1, 2},scientist对应的维度值Tag Values为,两者的组合TagSet有四种:

location = 1 , scientist = langstrothlocation = 1 , scientist = perpetuallocation = 2 , scientist = langstrothlocation = 2 , scientist = perpetual

(2)在InfluxDB中,表中Tags组合会被作为记录的主键,因此主键并不唯一,比如上表中第一行和第三行记录的主键都为’location=1,scientist=langstroth’。所有时序查询最终都会基于主键查询之后再经过时间戳过滤完成。

3. Fields:数值列。数值列存放用户的时序数据。

4. Point:类似SQL中一行记录,而并不是一个点。

InfluxDB 核心概念 – Series

文章《时序数据库体系技术 – 时序数据存储模型设计》中提到时间线的概念,时序数据的时间线就是一个数据源采集的一个指标随着时间的流逝而源源不断地吐出数据,这样形成的一条数据线称之为时间线。如下图所示:

上图中有两个数据源,每个数据源会采集两种指标:butterflier和honeybees。InfluxDB中使用Series表示数据源,Series由Measurement和Tags组合而成,Tags组合用来唯一标识Measurement。Series是InfluxDB中最重要的概念,在接下来的内核分析中会经常用到。

InfluxDB 系统架构

InfluxDB对数据的组织和其他数据库相比有很大的不同,为了更加清晰的说明,笔者按照自己的理解画了一张InfluxDB逻辑架构图:

DataBase

InfluxDB中有Database的概念,用户可以通过create database xxx来创建一个数据库。

Retention Policy(RP)

数据保留策略。很长一段时间笔者对RP的理解都不足够充分,以为RP只规定了数据的过期时间。其实不然,RP在InfluxDB中是一个非常重要的概念,核心作用有3个:指定数据的过期时间,指定数据副本数量以及指定ShardGroup Duration。RP创建语句如下:

CREATE RETENTION POLICY ON <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration> ] [DEFAULT]

其中retention_policy_name表示RP的名称,database_name表示数据库名称,duration表示TTL,n表示数据副本数。SHARD DURATION下文再讲。举个简单的栗子:

CREATE RETENTION POLICY "one_day_only" ON "water_database" DURATION 1d REPLICATION 1

SHARD DURATION 1h DEFAULT

InfluxDB中Retention Policy有这么几个性质和用法:

  1. RP是数据库级别而不是表级别的属性。这和很多数据库都不同。

  2. 每个数据库可以有多个数据保留策略,但只能有一个默认策略。

  3. 不同表可以根据保留策略规划在写入数据的时候指定RP进行写入,下面语句就指定six_mouth_rollup的rp进行写入:

curl -X POST 'http://localhost:8086/write?db=mydb&rp=six_month_rollup' --data-binary 'disk_free,hostname=server01 value=442221834240i 1435362189575692182'

如果没有指定任何RP,则使用默认的RP。

Shard Group

Shard Group是InfluxDB中一个重要的逻辑概念,从字面意思来看Shard Group会包含多个Shard,每个Shard Group只存储指定时间段的数据,不同Shard Group对应的时间段不会重合。比如2017年9月份的数据落在Shard Group0上,2017年10月份的数据落在Shard Group1上。

每个Shard Group对应多长时间是通过Retention Policy中字段”SHARD DURATION”指定的,如果没有指定,也可以通过Retention Duration(数据过期时间)计算出来,两者的对应关系为:

问题来了,为什么需要将数据按照时间分成一个一个Shard Group?个人认为有两个原因:

1. 将数据按照时间分割成小的粒度会使得数据过期实现非常简单,InfluxDB中数据过期删除的执行粒度就是Shard Group,系统会对每一个Shard Group判断是否过期,而不是一条一条记录判断。

2. 实现了将数据按照时间分区的特性。将时序数据按照时间分区是时序数据库一个非常重要的特性,基本上所有时序数据查询操作都会带有时间的过滤条件,比如查询最近一小时或最近一天,数据分区可以有效根据时间维度选择部分目标分区,淘汰部分分区。

Shard

Shard Group实现了数据分区,但是Shard Group只是一个逻辑概念,在它里面包含了大量Shard,Shard才是InfluxDB中真正存储数据以及提供读写服务的概念,类似于HBase中Region,Kudu中Tablet的概念。关于Shard,需要弄清楚两个方面:

1. Shard是InfluxDB的存储引擎实现,具体称之为TSM(Time Sort Merge Tree) Engine,负责数据的编码存储、读写服务等。TSM类似于LSM,因此Shard和HBase Region一样包含Cache、WAL以及Data File等各个组件,也会有flush、compaction等这类数据操作。

2. Shard Group对数据按时间进行了分区,那落在一个Shard Group中的数据又是如何映射到哪个Shard上呢?

InfluxDB采用了Hash分区的方法将落到同一个Shard Group中的数据再次进行了一次分区。这里特别需要注意的是,InfluxDB是根据hash(Series)将时序数据映射到不同的Shard,而不是根据Measurement进行hash映射,这样会使得相同Series的数据肯定会存在同一个Shard中,但这样的映射策略会使得一个Shard中包含多个Measurement的数据,不像HBase中一个Region的数据肯定都属于同一张表。

InfluxDB Sharding策略

上文已经对InfluxDB的Sharding策略进行了介绍,这里简单地做下总结。我们知道通常分布式数据库一般有两种Sharding策略:Range Sharding和Hash Sharding,前者对于基于主键的范围扫描比较高效,HBase以及TiDB都采用的这种Sharding策略;后者对于离散大规模写入以及随即读取相对比较友好,通常最简单的Hash策略是采用取模法,但取模法有个很大的弊病就是取模基础需要固定,一旦变化就需要数据重分布,当然可以采用更加复杂的一致性Hash策略来缓解数据重分布影响。

InfluxDB的Sharding策略是典型的两层Sharding,上层使用Range Sharding,下层使用Hash Sharding。对于时序数据库来说,基于时间的Range Sharding是最合理的考虑,但如果仅仅使用Time Range Sharding,会存在一个很严重的问题,即写入会存在热点,基于Time Range Sharding的时序数据库写入必然会落到最新的Shard上,其他老Shard不会接收写入请求。对写入性能要求很高的时序数据库来说,热点写入肯定不是最优的方案。解决这个问题最自然的思路就是再使用Hash进行一次分区,我们知道基于Key的Hash分区方案可以通过散列很好地解决热点写入的问题,但同时会引入两个新问题:

1. 导致Key Range Scan性能比较差。InfluxDB很优雅的解决了这个问题,上文笔者提到时序数据库基本上所有查询都是基于Series(数据源)来完成的,因此只要Hash分区是按照Series进行Hash就可以将相同Series的时序数据放在一起,这样Range Scan性能就可以得到保证。事实上InfluxDB正是这样实现的。

2. Hash分区的个数必须固定,如果要改变Hash分区数会导致大量数据重分布。除非使用一致性Hash算法。笔者看到InfluxDB源码中Hash分区的个数固定是1,对此还不是很理解,如果哪位看官对此比较熟悉可以指导一二。

总结

本篇文章重点介绍InfluxDB中一些基本概念,为后面分析InfluxDB内核实现奠定一个基础。文章主要介绍了三个重要模块:

1. 首先介绍了InfluxDB中一些基本概念,包括Measurement、Tags、Fields以及Point。

2. 接着介绍了Series这个非常非常重要的概念。

3. 最后重点介绍了InfluxDB中数据的组织形式,总结起来就是:先按照RP划分,不同过期时间的数据划分到不同的RP,同一个RP下的数据再按照时间Range分区形成ShardGroup,同一个ShardGroup中的数据再按照Series进行Hash分区,将数据划分成更小粒度的管理单元。Shard是InfluxDB中实际工作者,是InfluxDB的存储引擎。

文章来源:时序数据库技术体系(二) – 初识InfluxDB - 墨天轮

### InfluxDB 的工作原理和架构 #### 1. 数据模型 InfluxDB 使用了一种特定的数据模型来支持高效的时序数据分析。它的核心组件包括 **测量 (Measurement)**、**标签 (Tags)** 和 **字段 (Fields)**。 - 测量类似于关系型数据库中的表,用于存储一组相关的数据点。 - 标签是键值对形式的元数据,通常用于快速过滤和分组操作。 - 字段则是具体的数值或字符串类型的度量值[^1]。 这种结构使得 InfluxDB 能够高效地处理带有时间戳的大规模数据集。 --- #### 2. 存储引擎 InfluxDB 的底层存储依赖于一种名为 TSM (Time Structured Merge Tree) 的专用存储引擎。TSM 是专门为时序数据设计的一种优化方案,主要特点如下: - 数据被划分为多个文件片段(称为 TSM 文件),这些文件按时间范围组织。 - 新写入的数据会先存放在内存中的 WAL (Write-Ahead Log),随后定期刷新到磁盘上的 TSM 文件中。 - 定期执行压缩和合并操作以减少磁盘占用并提高查询性能[^3]。 这一机制确保了高吞吐量的同时也兼顾了读取效率。 --- #### 3. 查询语言 InfluxDB 提供了自己的类 SQL 查询语言 Flux 或者早期版本使用的 InfluxQL。Flux 更加现代化且功能更加强大,允许用户轻松定义复杂的时间序列计算逻辑。例如: ```flux from(bucket: "example-bucket") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "cpu_usage" and r.host == "server01") |> aggregateWindow(every: 1m, fn: mean) ``` 上述代码展示了如何从指定时间段内的 CPU 使用率数据中提取平均值[^5]。 --- #### 4. 高可用性与分布式部署 为了满足企业级需求,InfluxDB 支持多节点集群模式下的水平扩展能力。具体来说: - 数据可以分布在不同的物理服务器之间,从而提升整体系统的容量上限。 - 副本机制保障即使部分节点失效也不会丢失重要信息。 - 另外还提供了诸如连续查询等功能,在后台自动维护聚合视图以便加速后续访问请求[^5]。 --- #### 5. 应用场景适配 得益于其独特的技术和设计理念,InfluxDB 广泛适用于各类需要频繁采集变化状态的应用场合,比如但不限于 IT 运维监控平台构建;工业自动化设备联网管理解决方案开发等等。 --- ### 总结 综上所述,无论是基础理论还是工程实践方面,InfluxDB 都展现出了卓越的表现力——凭借简洁明了的设计思路加上扎实可靠的工程技术支撑起整个产品的生命力所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值