Skip to content

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文件包含多层索引,用于快速定位数据:

  1. 测量索引:映射测量名称到标签索引
  2. 标签索引:映射标签集到字段索引
  3. 字段索引:映射字段名到数据块位置

索引特点:

  • 采用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文件采用追加写入方式,确保写入性能。

写入流程:

  1. 写入数据块到TSM文件
  2. 更新索引信息
  3. 更新元数据
  4. 同步到磁盘

数据查询的物理流程

1. 索引查找

当执行查询时,InfluxDB首先会在内存中的索引查找对应的TSM文件和数据块位置。

查找流程:

  1. 根据测量名称查找测量索引
  2. 根据标签条件查找标签索引
  3. 根据字段名称查找字段索引
  4. 获取数据块位置信息

2. TSM文件读取

根据索引信息,InfluxDB会从TSM文件中读取对应的数据流块。

读取策略:

  • 优先从内存Cache读取数据
  • 对于历史数据,从TSM文件读取
  • 支持并行读取多个TSM文件

3. 数据解压和处理

读取到的数据块需要解压和处理,转换为查询结果。

处理流程:

  1. 解压数据块
  2. 过滤数据(根据时间范围和标签条件)
  3. 执行聚合和转换操作
  4. 排序和格式化结果

物理架构优化

存储介质选择

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 = 0666

3. 调整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文件采用分层设计,包含四个主要部分:

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

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服务生效