外观
InfluxDB 存储架构
InfluxDB的存储架构是其高性能和高效压缩的核心,专为时间序列数据设计。它采用了分层存储设计、高效的压缩算法和优化的查询路径,能够处理大规模时间序列数据的写入和查询操作。
TSM存储引擎
核心设计理念
TSM(Time Structured Merge Tree)是InfluxDB的核心存储引擎,设计用于高效处理时间序列数据。其核心设计理念包括:
- 分层存储:将数据分为内存层和磁盘层,内存层用于快速写入和查询,磁盘层用于长期存储
- 顺序写入:所有写入操作都采用顺序写入方式,提高写入性能
- 高效压缩:针对时间序列数据特性优化的压缩算法,减少存储空间
- 优化的查询路径:多层索引结构,支持快速查询
- 自动数据管理:自动处理数据过期、压缩和合并
存储架构层次
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的完整流程如下:
- 客户端请求:客户端发送写入请求到InfluxDB
- 写入验证:验证数据格式和权限
- WAL写入:将数据写入WAL文件,确保可靠性
- Cache更新:同时将数据写入内存Cache
- Cache压缩:当Cache达到一定大小或时间时,压缩数据
- TSM文件写入:将压缩后的数据写入TSM文件
- WAL清理:当数据安全写入TSM文件后,清理对应的WAL数据
写入优化
批量写入
- 建议将多个数据点合并为一个写入请求
- 减少网络往返和系统开销
- 提高写入吞吐量
有序写入
- 按时间顺序写入数据,提高压缩率
- 避免乱序写入,减少磁盘I/O
合理的标签设计
- 避免高基数标签,减少索引大小
- 合理设计标签层级,提高查询效率
数据查询流程
查询路径
数据查询InfluxDB的完整流程如下:
- 查询解析:解析查询语句,生成查询计划
- 索引查找:根据查询条件查找对应的TSM文件和数据块位置
- 数据获取:
- 优先从内存Cache获取数据
- 从TSM文件读取历史数据
- 并行读取多个TSM文件
- 数据解压:解压数据块
- 数据处理:过滤、聚合、转换数据
- 结果返回:将处理后的数据返回给客户端
查询优化
标签过滤
- 使用标签过滤减少数据扫描范围
- 标签被索引,查询速度快
时间范围限制
- 查询时指定合理的时间范围
- 减少需要处理的数据量
预聚合
- 使用连续查询(CQ)预聚合数据
- 将原始数据转换为聚合数据,提高查询性能
合理的保留策略
- 根据数据重要性设置不同的保留策略
- 减少长期存储的数据量
分层存储策略
热数据存储
- 定义:最近写入的数据,访问频率高
- 存储位置:内存Cache和最新的TSM文件
- 访问方式:快速访问,低延迟
温数据存储
- 定义:较旧的数据,访问频率中等
- 存储位置:TSM文件,存储在高速存储介质上
- 访问方式:较快访问,中等延迟
冷数据存储
- 定义:历史数据,访问频率低
- 存储位置:TSM文件,可存储在低速存储介质上
- 访问方式:较慢访问,较高延迟
存储介质建议
| 数据类型 | 推荐存储介质 | 特点 |
|---|---|---|
| 热数据 | NVMe SSD | 极高的IOPS和低延迟 |
| 温数据 | SSD | 高IOPS和低延迟 |
| 冷数据 | HDD或对象存储 | 大容量,低成本 |
数据组织方式
分片组(Shard Group)
- 定义:按时间范围组织的数据集合
- 时间窗口:可配置,默认7天
- 包含内容:一个或多个TSM文件
- 生命周期:与保留策略关联,过期后自动删除
分片(Shard)
- 定义:分片组内的物理数据单元
- 数据分布:根据哈希算法将数据分布到不同分片
- 并行处理:支持并行写入和查询
TSM文件组织
单个TSM文件的组织方式:
- 头部:包含魔术数字、版本号和元数据偏移量
- 数据块区域:存储压缩后的时间序列数据块
- 索引区域:包含测量、标签和字段索引
- 元数据区域:包含文件统计信息和索引偏移量
存储优化策略
1. 调整Cache大小
根据系统内存和写入负载调整Cache大小:
toml
[data]
cache-max-memory-size = "2g" # 设置Cache大小为2GB2. 优化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/data2. 检查TSM文件完整性
bash
# 检查TSM文件完整性
influxd inspect verify -datadir /var/lib/influxdb/data3. 修复损坏的TSM文件
bash
# 修复损坏的TSM文件
influxd inspect repair -datadir /var/lib/influxdb/data4. 迁移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的存储架构改进包括:
- 云原生设计,支持分布式存储
- 支持对象存储,降低存储成本
- 无限水平扩展,支持更大规模部署
- 更快的查询性能,尤其是针对大规模数据集
- 改进的压缩算法,更高的压缩率
- 更好的多租户支持
