外观
InfluxDB 物理架构
InfluxDB的物理架构设计围绕高效存储和查询时间序列数据展开,采用了分层存储和优化的文件格式。了解InfluxDB的物理架构有助于用户更好地配置和优化InfluxDB部署,提高系统性能和可靠性。
存储布局
数据目录结构
InfluxDB的数据目录包含了数据库的所有持久化数据,包括WAL日志、TSM文件、元数据等。默认情况下,InfluxDB的数据目录位于/var/lib/influxdb/(Linux)或C:\Program Files\InfluxDB\data\(Windows)。
主要目录结构:
influxdb/
├── data/ # TSM存储引擎数据目录
│ └── [database]/ # 数据库名称
│ └── [retention_policy]/ # 保留策略
│ └── [shard_group]/ # 分片组
│ ├── 000000001-000000001.tsm # TSM文件
│ └── ...
├── wal/ # 写入前日志目录
│ └── [database]/
│ └── [retention_policy]/
│ └── [shard_group]/
│ ├── _00001.wal # WAL文件
│ └── ...
├── meta/ # 元数据目录
│ └── meta.db # 元数据存储
└── config.toml # 配置文件(可选)核心目录详解
data/ 目录
data/目录是InfluxDB的核心数据目录,用于存储TSM文件。TSM文件是InfluxDB的主要存储格式,包含了压缩后的时间序列数据。
目录层级:
- 数据库级别:每个数据库有独立的子目录
- 保留策略级别:每个保留策略有独立的子目录
- 分片组级别:每个分片组有独立的子目录
wal/ 目录
wal/目录用于存储WAL(Write Ahead Log)文件,确保数据写入的可靠性。WAL文件包含了最近写入的数据,在系统崩溃时用于恢复数据。
主要特点:
- WAL文件采用顺序写入方式,提高写入性能
- 每个分片组有独立的WAL文件
- WAL文件会定期被压缩和清理
meta/ 目录
meta/目录用于存储InfluxDB的元数据,包括数据库、保留策略、分片组、用户等信息。元数据存储在一个名为meta.db的SQLite数据库文件中。
主要内容:
- 数据库和保留策略配置
- 分片组信息
- 用户和权限配置
- 集群节点信息(企业版)
分片策略
分片组(Shard Group)
分片组是InfluxDB中数据组织的基本单位,包含了一定时间范围内的数据。每个分片组对应一个时间窗口,默认为7天。
主要特点:
- 每个分片组包含一个或多个TSM文件
- 分片组按时间顺序排列
- 过期的分片组会被自动删除
分片组创建
当新数据写入时,InfluxDB会检查是否存在对应的分片组。如果不存在,会自动创建新的分片组。
创建规则:
- 基于数据的时间戳确定分片组
- 分片组的时间窗口由保留策略的
shard duration参数决定 - 新分片组创建时会分配对应的WAL文件
分片组删除
当分片组中的数据超过保留时间时,整个分片组会被删除,包括所有TSM文件和相关资源。
删除机制:
- 由保留策略管理器定期检查
- 删除操作是原子的,确保数据一致性
- 删除后释放磁盘空间
TSM文件格式
TSM文件结构
TSM文件是InfluxDB的核心存储格式,采用了分层设计,包含了索引和数据两部分。
文件结构:
TSM文件
├── 头部(Header)
│ ├── 魔术数字(Magic Number): 0x16D116D1
│ ├── 版本号(Version): 1
│ └── 元数据偏移量(Meta Offset): 指向元数据区域的偏移量
├── 数据块区域(Data Blocks)
│ ├── 数据块1
│ │ ├── CRC校验
│ │ ├── 压缩类型
│ │ └── 压缩数据
│ ├── 数据块2
│ └── ...
├── 索引区域(Index Blocks)
│ ├── 测量索引
│ ├── 标签索引
│ └── 字段索引
└── 元数据区域(Meta Block)
├── 统计信息
└── 索引偏移量数据块(Data Block)
数据块是TSM文件中存储实际数据的最小单位,包含了一段时间内的时间序列数据。
主要特点:
- 每个数据块包含时间戳和值
- 支持多种压缩算法,如Snappy、LZ4等
- 数据块大小默认为64KB
索引结构
TSM文件包含多层索引,用于快速定位数据:
- 测量索引:映射测量名称到标签索引
- 标签索引:映射标签集到字段索引
- 字段索引:映射字段名到数据块位置
索引特点:
- 采用B+树结构,支持快速查找
- 索引数据加载到内存,减少磁盘I/O
- 支持范围查询和精确查询
数据写入的物理流程
1. WAL写入
当数据写入InfluxDB时,首先会写入对应的WAL文件。WAL文件采用顺序写入方式,确保写入性能。
WAL文件特点:
- 每个分片组有独立的WAL文件
- WAL文件大小默认为100MB
- 当WAL文件达到阈值时,会创建新的WAL文件
2. Cache写入
数据写入WAL后,会同时写入内存中的Cache。Cache采用列式存储结构,按测量、标签集和字段组织数据。
Cache组织方式:
- 按测量名称分组
- 按标签集分组
- 按字段名称分组
- 时间戳和值按时间顺序存储
3. Cache压缩
当Cache达到一定大小或经过一定时间后,数据会被压缩并写入TSM文件。
压缩策略:
- 按时间窗口压缩数据
- 同一标签集和字段的数据合并压缩
- 支持多种压缩算法
4. TSM文件写入
压缩后的数据会被写入TSM文件。TSM文件采用追加写入方式,确保写入性能。
写入流程:
- 写入数据块到TSM文件
- 更新索引信息
- 更新元数据
- 同步到磁盘
数据查询的物理流程
1. 索引查找
当执行查询时,InfluxDB首先会在内存中的索引查找对应的TSM文件和数据块位置。
查找流程:
- 根据测量名称查找测量索引
- 根据标签条件查找标签索引
- 根据字段名称查找字段索引
- 获取数据块位置信息
2. TSM文件读取
根据索引信息,InfluxDB会从TSM文件中读取对应的数据流块。
读取策略:
- 优先从内存Cache读取数据
- 对于历史数据,从TSM文件读取
- 支持并行读取多个TSM文件
3. 数据解压和处理
读取到的数据块需要解压和处理,转换为查询结果。
处理流程:
- 解压数据块
- 过滤数据(根据时间范围和标签条件)
- 执行聚合和转换操作
- 排序和格式化结果
物理架构优化
存储介质选择
WAL和Cache
WAL和Cache对性能要求较高,建议使用高性能存储介质:
推荐配置:
- SSD(固态硬盘):提供高IOPS和低延迟
- NVMe SSD:性能更高,适合大规模部署
- RAID 1或RAID 10:提高可靠性
TSM文件
TSM文件对容量要求较高,同时需要一定的性能:
推荐配置:
- SSD或高速HDD
- RAID 5或RAID 6:平衡性能和容量
- 足够的存储空间:根据数据量和保留策略规划
文件系统选择
Linux系统
对于Linux系统,推荐使用以下文件系统:
推荐文件系统:
- ext4:稳定性好,性能不错
- XFS:适合大文件和高吞吐量
- Btrfs:支持快照和校验,适合数据保护
不推荐文件系统:
- ext3:性能较差,不适合大规模部署
- FAT32:不支持大文件,不适合InfluxDB
Windows系统
对于Windows系统,推荐使用NTFS文件系统:
推荐文件系统:
- NTFS:支持大文件和权限管理
磁盘IO优化
1. 分离WAL和TSM文件
将WAL文件和TSM文件存储在不同的磁盘上,可以提高写入性能:
配置方法:
toml
[wal]
dir = "/path/to/wal/disk"
[data]
dir = "/path/to/tsm/disk"2. 调整WAL配置
根据硬件情况调整WAL配置,优化写入性能:
关键配置:
toml
[wal]
enabled = true
flush-freq = "10m" # WAL刷写频率
partition-flush-delay = "2s" # 分区刷写延迟
dir-perm = 0777
file-perm = 06663. 调整TSM配置
根据数据量和查询模式调整TSM配置:
关键配置:
toml
[data]
cache-max-memory-size = "1g" # Cache最大内存
cache-snapshot-memory-size = "25m" # 快照内存阈值
cache-snapshot-write-cold-duration = "10m" # 快照写入冷数据持续时间
compact-full-write-cold-duration = "4h" # 完全压缩冷数据持续时间
max-concurrent-compactions = 4 # 最大并发压缩数
compact-throughput-burst = "48m" # 压缩吞吐量突发高可用物理架构
单节点物理架构
单节点部署是最简单的InfluxDB物理架构,所有数据和资源都存储在单个节点上。
架构图:
集群物理架构
InfluxDB企业版支持高可用性集群部署,数据分布在多个节点上。
架构图:
常见问题(FAQ)
Q1: InfluxDB的数据目录结构是怎样的?
A1: InfluxDB的数据目录包含三个主要子目录:
data/:存储TSM文件,包含压缩后的时间序列数据wal/:存储Write Ahead Log文件,确保数据写入可靠性meta/:存储元数据,包括数据库、保留策略、用户等信息
每个目录下按照数据库、保留策略和分片组进行分层组织。
Q2: TSM文件的结构是什么样的?
A2: TSM文件采用分层设计,包含四个主要部分:
- 头部:包含魔术数字、版本号和元数据偏移量
- 数据块区域:存储压缩后的时间序列数据
- 索引区域:包含测量、标签和字段索引
- 元数据区域:包含统计信息和索引偏移量
Q3: 如何优化InfluxDB的物理存储?
A3: 优化InfluxDB物理存储的方法包括:
- 使用SSD存储WAL和Cache,提高写入性能
- 将WAL和TSM文件存储在不同磁盘上
- 调整Cache大小和刷写频率
- 优化TSM压缩和合并策略
- 合理规划分片组大小和保留策略
Q4: InfluxDB如何处理数据过期?
A4: InfluxDB通过保留策略(Retention Policy)处理数据过期:
- 每个保留策略定义了数据的保留时间
- 分片组按时间窗口组织数据
- 当分片组超过保留时间时,整个分片组会被删除
- 删除操作包括所有TSM文件和相关资源
Q5: 什么是分片组?
A5: 分片组(Shard Group)是InfluxDB中数据组织的基本单位,包含了一定时间范围内的数据。每个分片组对应一个时间窗口,默认为7天。分片组包含一个或多个TSM文件,过期的分片组会被自动删除。
Q6: 如何选择InfluxDB的文件系统?
A6: 选择InfluxDB文件系统的建议:
- Linux系统:推荐使用ext4、XFS或Btrfs
- Windows系统:推荐使用NTFS
- 避免使用性能较差的文件系统,如ext3
- 考虑文件系统的可靠性、性能和管理特性
Q7: InfluxDB集群的物理架构是什么样的?
A7: InfluxDB企业版集群采用分层物理架构:
- 数据节点:存储TSM文件和处理数据写入
- 查询节点:处理查询请求和返回结果
- 协调层:管理集群元数据和一致性
集群部署提高了系统的可用性和扩展性,适合大规模生产环境。
Q8: 如何监控InfluxDB的物理存储使用情况?
A8: 监控InfluxDB物理存储使用情况的方法:
- 使用InfluxDB内置的
_internal数据库监控存储指标 - 监控磁盘使用率和I/O性能
- 使用Grafana等工具可视化存储使用趋势
- 定期检查分片组和TSM文件大小
Q9: 什么是WAL文件?它的作用是什么?
A9: WAL(Write Ahead Log)文件是InfluxDB的写入前日志,用于确保数据写入的可靠性。当数据写入InfluxDB时,首先会写入WAL文件,然后再写入内存中的Cache。WAL文件确保了即使在系统崩溃的情况下,数据也不会丢失。
Q10: 如何调整InfluxDB的TSM配置?
A10: 调整InfluxDB TSM配置的方法:
- 修改
config.toml文件中的[data]部分 - 关键配置包括:
cache-max-memory-size:Cache最大内存cache-snapshot-memory-size:快照内存阈值max-concurrent-compactions:最大并发压缩数compact-throughput-burst:压缩吞吐量突发
- 调整后需要重启InfluxDB服务生效
