Influxdb 架构
InfluxDB是一款专门处理高写入和查询负载的时序数据库,用于存储大规模的时序数据并进行实时分析,其架构特点可以归纳为以下几点:
一、核心组件
- 数据摄取组件:
- 负责接收用户写入的数据,并将其分片到不同的摄取器中。
- 摄取器会对数据进行验证、分区、重复数据删除等处理,然后将数据保存为Parquet文件。
- 摄取器还会更新目录,以通知其他组件新数据的到达。
- 数据查询组件:
- 负责处理用户的查询请求,从目录中获取所需的元数据,并从对象存储中读取数据。
- 查询器会构建并执行查询计划,以获取最佳查询性能。
- 查询器还支持缓存元数据和数据,以提高查询效率。
- 数据压缩组件:
- 负责将摄取器生成的小文件压缩为更少、更大且不重叠的文件,以优化查询性能。
- 存储组件:
- Catalog:用于存储集群的元数据。
- Object Storage:用于存储实际数据,如Amazon AWS S3。
二、数据模型
- 时间(Time):数据生成时的时间戳。
- 表(Measurement):表示一组有关联的时序数据。
- 标签(Tag):用于创建索引的标签,如host、location等,可以提升查询性能。
- 指标(Field):一般存放具体的时序数据,如user、system等,不会对指标数据创建索引。
- 时序数据记录(Point):表示一条具体的时序数据记录,由时间线和时间戳唯一标识。
- 保留策略(Retention Policy):定义InfluxDB的数据保留时长和数据存储的副本数。
- 时间线(Series):表示表名、保留策略、标签集都相同的一组数据。
三、存储引擎
InfluxDB使用时序合并树(TSM)和时间序列索引(TSI)文件来有效地压缩和存储数据。
1、存储引擎概述
InfluxDB的存储引擎采用了专为时间序列数据设计的存储格式,具有高效的存储效率和查询性能。它结合了预写式日志(WAL)、缓存、时间结构合并树(TSM)和时间序列索引(TSI)等多个组件,共同实现数据的快速写入、持久化存储和高效查询。
2、存储引擎组件详解
- 预写式日志(WAL)
- 功能:用于在数据写入磁盘之前提供临时存储,并在存储引擎重启时保留数据。
- 工作原理:当数据写入InfluxDB时,它首先被写入到WAL中,以确保数据的持久性。在数据成功写入磁盘后,WAL中的相应记录会被删除。
- 缓存
- 功能:提供数据的内存存储,加速数据写入和查询过程。
- 工作原理:数据写入InfluxDB时,除了被写入WAL外,还会被写入到内存缓存中。缓存中的数据可以立即可查询,并定期写入到磁盘的TSM文件中。
- 时间结构合并树(TSM)
- 功能:是InfluxDB的核心存储结构,用于高效地存储和压缩时间序列数据。
- 工作原理:TSM文件以列格式存储压缩后的系列数据。为了提高效率,存储引擎只存储系列值之间的差异,并使用列向存储方式,使得引擎可以按系列键读取数据并省略不必要的数据。随着TSM文件的累积,存储引擎会将它们合并并压缩成更高级别的TSM文件,以优化读取性能。
- 时间序列索引(TSI)
- 功能:为时间序列数据提供高效的索引机制,加速数据查询过程。
- 工作原理:TSI存储按测量、标签和字段分组的系列键,使得数据库能够快速地回答哪些测量、标签、字段存在的问题。通过优化索引结构,TSI提高了查询性能,特别是在处理大规模时间序列数据时表现优异。
3、存储引擎工作流程
- 数据写入
- 数据通过HTTP POST请求发送到InfluxDB的/api/v2/write端点或/write 1.x兼容端点。
- 数据被压缩并写入到WAL中以确保立即持久性。
- 数据同时被写入到内存缓存中,并立即可查询。
- 数据持久化
- 内存缓存中的数据定期写入到磁盘的TSM文件中。
- 随着TSM文件的累积,存储引擎将它们合并并压缩成更高级别的TSM文件。
- 数据查询
- 查询请求通过InfluxQL或Flux查询语言发起。
- 存储引擎查询合并缓存数据和来自TSM文件的数据。
- 查询结果根据请求进行优化和聚合后返回给用户。
4、存储引擎优化
- 数据压缩
- InfluxDB采用多种数据压缩技术,包括时间戳压缩、字段值压缩和字符串去重存储等,以减少存储占用并提升查询性能。
- 索引优化
- TSI索引机制通过优化索引结构,提高了查询性能,特别是在处理大规模时间序列数据时表现优异。
- 批量写入
- 为了提高效率,大多数应用都以批次发送数据点。批处理中的点可以来自任意数量的系列、测量和标签集。
四、其他特性
- 简单高效的HTTP API:提供写入和查询接口。
- 类似SQL的查询语言:针对时序数据量身订造,可以轻松查询聚合数据。
- 数据保留策略:能够有效地使旧数据自动失效。
综上所述,InfluxDB的架构具有高度的可扩展性和高性能,能够处理大规模的时序数据并提供实时分析功能。其数据模型简单直观,查询语言灵活强大,非常适合用于DevOps监控、应用指标和IoT传感器等领域。