Skip to content

InfluxDB 存储架构

InfluxDB的存储架构是其高性能和高效压缩的核心,专为时间序列数据设计。它采用了分层存储设计、高效的压缩算法和优化的查询路径,能够处理大规模时间序列数据的写入和查询操作。

TSM存储引擎

核心设计理念

TSM(Time Structured Merge Tree)是InfluxDB的核心存储引擎,设计用于高效处理时间序列数据。其核心设计理念包括:

  1. 分层存储:将数据分为内存层和磁盘层,内存层用于快速写入和查询,磁盘层用于长期存储
  2. 顺序写入:所有写入操作都采用顺序写入方式,提高写入性能
  3. 高效压缩:针对时间序列数据特性优化的压缩算法,减少存储空间
  4. 优化的查询路径:多层索引结构,支持快速查询
  5. 自动数据管理:自动处理数据过期、压缩和合并

存储架构层次

TSM存储引擎采用了三层存储架构:

1. 内存层(Cache)

  • 作用:暂存最近写入的数据,支持快速查询
  • 数据结构:列式存储,按测量、标签集和字段组织
  • 大小限制:可配置,默认1GB
  • 写入流程:数据写入WAL后,同时写入Cache

2. 写入前日志(WAL)

  • 作用:确保数据写入的可靠性,防止系统崩溃导致数据丢失
  • 存储格式:预写日志,包含原始写入数据
  • 刷写策略:定期刷写,或达到一定大小后刷写
  • 恢复机制:系统启动时从WAL恢复数据到Cache

3. 磁盘层(TSM文件)

  • 作用:长期存储压缩后的时间序列数据
  • 存储格式:优化的时间序列数据格式,包含索引和数据块
  • 压缩算法:针对时间戳和数值的专门压缩算法
  • 组织方式:按分片组和时间范围组织

数据压缩机制

时间戳压缩

时间戳压缩是TSM存储引擎的核心优化之一,利用时间序列数据时间戳的连续性特点:

增量编码

对于连续写入的数据,时间戳通常是连续的。TSM存储引擎使用增量编码来压缩时间戳:

  • 存储第一个时间戳的完整值
  • 后续时间戳存储与前一个时间戳的差值
  • 对于固定间隔的数据,差值相同,压缩率更高

压缩算法

TSM存储引擎支持多种时间戳压缩算法:

  • 简单8B:适合固定间隔的时间戳
  • RLE(行程长度编码):适合连续相同的值
  • Delta编码:适合递增的时间戳

数值压缩

TSM存储引擎针对不同类型的数值数据采用不同的压缩算法:

整数压缩

  • ZigZag编码:将有符号整数转换为无符号整数
  • Delta编码:存储与前一个值的差值
  • Simple8B:针对大整数的高效压缩

浮点数压缩

  • Delta编码:存储与前一个值的差值
  • LZ4/Snappy:通用压缩算法,适合复杂数据

字符串压缩

  • 字典编码:针对重复字符串
  • LZ4/Snappy:通用压缩算法,适合复杂字符串

压缩效果

TSM存储引擎的压缩效果非常显著,具体取决于数据特性:

  • 时间戳:压缩率可达90%以上
  • 数值数据:压缩率可达70-80%
  • 字符串数据:压缩率取决于重复率,通常在50%以上
  • 总体压缩率:通常在70-85%之间

数据写入流程

写入路径

数据写入InfluxDB的完整流程如下:

  1. 客户端请求:客户端发送写入请求到InfluxDB
  2. 写入验证:验证数据格式和权限
  3. WAL写入:将数据写入WAL文件,确保可靠性
  4. Cache更新:同时将数据写入内存Cache
  5. Cache压缩:当Cache达到一定大小或时间时,压缩数据
  6. TSM文件写入:将压缩后的数据写入TSM文件
  7. WAL清理:当数据安全写入TSM文件后,清理对应的WAL数据

写入优化

批量写入

  • 建议将多个数据点合并为一个写入请求
  • 减少网络往返和系统开销
  • 提高写入吞吐量

有序写入

  • 按时间顺序写入数据,提高压缩率
  • 避免乱序写入,减少磁盘I/O

合理的标签设计

  • 避免高基数标签,减少索引大小
  • 合理设计标签层级,提高查询效率

数据查询流程

查询路径

数据查询InfluxDB的完整流程如下:

  1. 查询解析:解析查询语句,生成查询计划
  2. 索引查找:根据查询条件查找对应的TSM文件和数据块位置
  3. 数据获取
    • 优先从内存Cache获取数据
    • 从TSM文件读取历史数据
    • 并行读取多个TSM文件
  4. 数据解压:解压数据块
  5. 数据处理:过滤、聚合、转换数据
  6. 结果返回:将处理后的数据返回给客户端

查询优化

标签过滤

  • 使用标签过滤减少数据扫描范围
  • 标签被索引,查询速度快

时间范围限制

  • 查询时指定合理的时间范围
  • 减少需要处理的数据量

预聚合

  • 使用连续查询(CQ)预聚合数据
  • 将原始数据转换为聚合数据,提高查询性能

合理的保留策略

  • 根据数据重要性设置不同的保留策略
  • 减少长期存储的数据量

分层存储策略

热数据存储

  • 定义:最近写入的数据,访问频率高
  • 存储位置:内存Cache和最新的TSM文件
  • 访问方式:快速访问,低延迟

温数据存储

  • 定义:较旧的数据,访问频率中等
  • 存储位置:TSM文件,存储在高速存储介质上
  • 访问方式:较快访问,中等延迟

冷数据存储

  • 定义:历史数据,访问频率低
  • 存储位置:TSM文件,可存储在低速存储介质上
  • 访问方式:较慢访问,较高延迟

存储介质建议

数据类型推荐存储介质特点
热数据NVMe SSD极高的IOPS和低延迟
温数据SSD高IOPS和低延迟
冷数据HDD或对象存储大容量,低成本

数据组织方式

分片组(Shard Group)

  • 定义:按时间范围组织的数据集合
  • 时间窗口:可配置,默认7天
  • 包含内容:一个或多个TSM文件
  • 生命周期:与保留策略关联,过期后自动删除

分片(Shard)

  • 定义:分片组内的物理数据单元
  • 数据分布:根据哈希算法将数据分布到不同分片
  • 并行处理:支持并行写入和查询

TSM文件组织

单个TSM文件的组织方式:

  1. 头部:包含魔术数字、版本号和元数据偏移量
  2. 数据块区域:存储压缩后的时间序列数据块
  3. 索引区域:包含测量、标签和字段索引
  4. 元数据区域:包含文件统计信息和索引偏移量

存储优化策略

1. 调整Cache大小

根据系统内存和写入负载调整Cache大小:

toml
[data]
  cache-max-memory-size = "2g"  # 设置Cache大小为2GB

2. 优化WAL配置

根据写入负载调整WAL配置:

toml
[wal]
  flush-freq = "5m"  # WAL刷写频率
  partition-flush-delay = "1s"  # 分区刷写延迟

3. 调整TSM压缩策略

根据数据特性调整TSM压缩和合并策略:

toml
[data]
  cache-snapshot-memory-size = "50m"  # 快照内存阈值
  cache-snapshot-write-cold-duration = "5m"  # 快照写入冷数据持续时间
  compact-full-write-cold-duration = "2h"  # 完全压缩冷数据持续时间
  max-concurrent-compactions = 4  # 最大并发压缩数

4. 合理设置分片组大小

根据数据写入速率和保留策略设置合适的分片组大小:

sql
-- 创建保留策略,设置分片组大小为1天
CREATE RETENTION POLICY "rp_1d" ON "mydb" DURATION 1d REPLICATION 1 SHARD DURATION 1h;

5. 优化数据模型

标签设计

  • 避免高基数标签(如UUID、IP地址)
  • 合理设计标签层级
  • 考虑标签的查询频率

字段设计

  • 将频繁查询的字段作为标签
  • 避免将高基数数据作为标签
  • 合理选择字段类型

6. 使用合适的压缩算法

InfluxDB支持多种压缩算法,可根据数据特性选择:

  • Snappy:默认压缩算法,平衡压缩率和速度
  • LZ4:更快的压缩和解压速度,适合高写入负载
  • Zstandard:更高的压缩率,适合存储空间有限的场景

存储监控与维护

监控存储指标

内置监控

InfluxDB提供了内置的_internal数据库,包含存储相关的监控指标:

  • tsm1_cache_size:Cache使用大小
  • tsm1_wal_size:WAL使用大小
  • tsm1_file_count:TSM文件数量
  • tsm1_compactions_total:压缩操作总数
  • tsm1_points_written:写入的数据点数

监控工具

  • Grafana:可视化监控InfluxDB存储指标
  • Telegraf:收集系统和InfluxDB指标
  • InfluxDB UI:内置的监控界面

存储维护操作

1. 手动压缩TSM文件

bash
# 手动触发TSM文件压缩
influxd inspect buildtsi -datadir /var/lib/influxdb/data

2. 检查TSM文件完整性

bash
# 检查TSM文件完整性
influxd inspect verify -datadir /var/lib/influxdb/data

3. 修复损坏的TSM文件

bash
# 修复损坏的TSM文件
influxd inspect repair -datadir /var/lib/influxdb/data

4. 迁移TSM文件

bash
# 导出TSM数据
influxd inspect export-tsm -datadir /var/lib/influxdb/data -waldir /var/lib/influxdb/wal -out /tmp/export

# 导入TSM数据
influx write -bucket mybucket -file /tmp/export/*.tsm

存储架构演进

InfluxDB 1.x 存储架构

  • 特点:单体架构,所有组件运行在同一个进程中
  • 存储引擎:TSM v1
  • 限制:扩展性有限,适合中小规模部署

InfluxDB 2.x 存储架构

  • 特点:模块化架构,组件解耦
  • 存储引擎:TSM v2,增强了压缩和查询性能
  • 改进
    • 更好的水平扩展性
    • 增强的安全性
    • 集成的Telegraf和Chronograf
    • 支持Flux查询语言

InfluxDB 3.x 存储架构

  • 特点:云原生架构,支持分布式存储
  • 存储引擎:TSM v3,支持对象存储
  • 改进
    • 无限水平扩展
    • 更低的存储成本
    • 更快的查询性能
    • 支持多租户

常见问题(FAQ)

Q1: TSM存储引擎的核心优势是什么?

A1: TSM存储引擎的核心优势包括:

  • 高性能写入:顺序写入设计,支持每秒百万级写入
  • 高效压缩:针对时间序列数据优化的压缩算法,压缩率可达70-85%
  • 快速查询:多层索引结构,支持快速查询
  • 自动管理:自动处理数据过期、压缩和合并
  • 可靠性高:WAL机制确保数据不丢失

Q2: 如何优化InfluxDB的存储性能?

A2: 优化InfluxDB存储性能的方法包括:

  • 调整Cache大小,适应写入负载
  • 优化WAL配置,平衡性能和可靠性
  • 合理设置分片组大小
  • 优化数据模型,避免高基数标签
  • 使用SSD存储,提高IO性能
  • 将WAL和TSM文件存储在不同磁盘上

Q3: 数据在TSM文件中是如何组织的?

A3: 数据在TSM文件中按以下方式组织:

  • 按测量、标签集和字段分层组织
  • 时间戳和数值分别存储和压缩
  • 包含多层索引,支持快速查询
  • 按时间范围组织数据块
  • 支持多种压缩算法

Q4: 如何监控InfluxDB的存储使用情况?

A4: 监控InfluxDB存储使用情况的方法:

  • 使用内置的_internal数据库监控存储指标
  • 使用Grafana可视化监控指标
  • 定期检查磁盘使用率
  • 监控TSM文件数量和大小
  • 监控Cache和WAL使用情况

Q5: 什么是分片组?如何设置分片组大小?

A5: 分片组是按时间范围组织的数据集合,包含一个或多个TSM文件。分片组大小决定了数据在磁盘上的组织方式。

设置分片组大小的方法:

sql
-- 创建保留策略,设置分片组大小
CREATE RETENTION POLICY "rp_name" ON "db_name" DURATION 30d REPLICATION 1 SHARD DURATION 1d;

Q6: 如何处理InfluxDB的存储容量问题?

A6: 处理InfluxDB存储容量问题的方法:

  • 调整数据保留策略,缩短数据保留时间
  • 增加存储空间
  • 使用数据降采样,减少存储的数据量
  • 优化数据模型,减少存储需求
  • 考虑使用对象存储(InfluxDB 3.x)

Q7: TSM文件的压缩率是多少?

A7: TSM文件的压缩率取决于数据特性:

  • 时间戳:压缩率可达90%以上
  • 数值数据:压缩率可达70-80%
  • 字符串数据:压缩率取决于重复率,通常在50%以上
  • 总体压缩率:通常在70-85%之间

Q8: 如何迁移InfluxDB的数据?

A8: 迁移InfluxDB数据的方法:

  • 使用influxd inspect export-tsm导出数据
  • 使用influx write导入数据
  • 对于InfluxDB 1.x到2.x的迁移,使用官方迁移工具
  • 考虑使用第三方工具,如Telegraf

Q9: 什么是WAL?它的作用是什么?

A9: WAL(Write Ahead Log)是InfluxDB的写入前日志,用于确保数据写入的可靠性。当数据写入InfluxDB时,首先会写入WAL,然后再写入内存中的Cache。WAL确保了即使在系统崩溃的情况下,数据也不会丢失。

Q10: InfluxDB 3.x的存储架构有什么改进?

A10: InfluxDB 3.x的存储架构改进包括:

  • 云原生设计,支持分布式存储
  • 支持对象存储,降低存储成本
  • 无限水平扩展,支持更大规模部署
  • 更快的查询性能,尤其是针对大规模数据集
  • 改进的压缩算法,更高的压缩率
  • 更好的多租户支持