Skip to content

InfluxDB 存储指标参考

本文详细介绍InfluxDB存储指标的含义、获取方法和使用技巧,帮助用户监控和优化InfluxDB存储性能。

InfluxDB 1.x存储指标

InfluxDB 1.x版本的存储指标主要存储在_internal数据库的monitor保留策略中,包含TSM存储引擎、WAL、写入和查询等多个方面的指标。

TSM存储引擎指标

TSM(Time-Structured Merge Tree)是InfluxDB的核心存储引擎,负责数据的存储和检索。以下是TSM存储引擎的关键指标:

测量集:tsm1_engine

字段名类型单位描述
cache_sizeintegerbytes当前缓存使用大小,反映内存中未持久化的数据量
cache_size_maxintegerbytes配置的最大缓存大小,由cache-max-memory-size参数控制
cache_writesintegercount缓存写入总次数,反映写入请求的频率
cache_hitsintegercount缓存命中次数,缓存命中意味着数据可以直接从内存中获取,无需读取磁盘
cache_missesintegercount缓存未命中次数,未命中意味着需要从磁盘读取数据,会增加查询延迟
cache_evictionsintegercount缓存驱逐次数,当缓存达到上限时,会将旧数据写入磁盘
compactionsintegercount压缩操作总次数,压缩可以优化TSM文件结构,提高查询性能
compaction_duration_nsintegernanoseconds压缩操作的总持续时间,反映压缩操作的开销
compaction_errorsintegercount压缩操作错误次数,出现错误可能导致数据不一致或性能问题
file_open_failuresintegercount文件打开失败次数,通常与权限问题或磁盘故障有关

测量集:tsm1_filestore

该测量集记录TSM文件系统的状态,反映数据持久化的情况:

字段名类型单位描述
file_countintegercount当前TSM文件的总数,文件数量过多可能影响性能
file_size_bytesintegerbytes所有TSM文件的总大小,反映数据存储占用的磁盘空间
files_corruptintegercount损坏的TSM文件数量,损坏的文件可能导致数据丢失
files_recoveredintegercount成功恢复的TSM文件数量,反映系统的自我修复能力

测量集:tsm1_cache_hot

热缓存用于存储最近写入和频繁访问的数据:

字段名类型单位描述
sizeintegerbytes当前热缓存使用大小
size_maxintegerbytes配置的最大热缓存大小
writesintegercount热缓存写入次数
hitsintegercount热缓存命中次数,热缓存命中性能最优
missesintegercount热缓存未命中次数
evictionsintegercount热缓存驱逐次数,当热缓存满时,会将旧数据移至温缓存

测量集:tsm1_cache_warm

温缓存用于存储较旧但仍可能访问的数据:

字段名类型单位描述
sizeintegerbytes当前温缓存使用大小
size_maxintegerbytes配置的最大温缓存大小
writesintegercount温缓存写入次数,通常来自热缓存的驱逐
hitsintegercount温缓存命中次数
missesintegercount温缓存未命中次数,未命中则需要从磁盘读取
evictionsintegercount温缓存驱逐次数,当温缓存满时,会将数据写入磁盘

WAL指标

WAL(Write-Ahead Log)是InfluxDB的预写日志,用于确保数据写入的可靠性:

测量集:wal

字段名类型单位描述
wal_write_bytesintegerbytesWAL写入的总字节数,反映写入负载
wal_write_duration_nsintegernanosecondsWAL写入操作的总持续时间
wal_fsync_duration_nsintegernanosecondsWAL同步到磁盘的总持续时间,直接影响写入延迟
wal_fsync_countintegercountWAL同步到磁盘的总次数,fsync操作是写入性能的关键瓶颈
wal_fsync_pausedintegercountWAL fsync暂停次数,当磁盘I/O繁忙时可能发生
wal_buffer_sizeintegerbytes当前WAL缓冲区使用大小

存储写入指标

记录数据写入相关的性能和状态指标:

测量集:write

字段名类型单位描述
write_points_okintegercount成功写入的数据点数量,反映正常写入的流量
write_points_errintegercount写入失败的数据点数量,写入错误需要及时排查
write_reqintegercount写入请求的总数量
write_req_bytesintegerbytes写入请求的总字节数,反映写入数据量
write_req_errintegercount写入请求失败的数量,请求失败可能是由于网络问题或服务器负载过高

存储查询指标

记录查询执行的性能和状态指标:

测量集:queryExecutor

字段名类型单位描述
query_duration_nsintegernanoseconds查询执行的总持续时间,是查询性能的核心指标
query_errorsintegercount查询执行错误的次数,错误可能是由于语法错误或资源不足
query_result_bytesintegerbytes查询结果的总字节数,反映查询返回的数据量
query_row_limitintegercount查询结果行数限制,由配置参数控制
query_rows_readintegercount查询读取的总行数,反映查询的复杂度和数据扫描范围
query_rows_writtenintegercount查询写入的总行数,例如连续查询的结果写入

示例查询

以下是一些常用的InfluxQL查询示例,用于监控InfluxDB 1.x的存储指标:

sql
-- 查询TSM文件数量和大小的10分钟平均值
SELECT mean("file_count") AS "file_count", mean("file_size_bytes") AS "file_size_bytes" 
FROM "_internal"."monitor"."tsm1_filestore" 
WHERE time > now() - 1h 
GROUP BY time(10m);

-- 计算缓存命中率,这是衡量缓存效率的关键指标
SELECT mean("cache_hits") / (mean("cache_hits") + mean("cache_misses")) AS "cache_hit_ratio" 
FROM "_internal"."monitor"."tsm1_engine" 
WHERE time > now() - 1h 
GROUP BY time(10m);

-- 查询压缩操作次数和每次压缩的平均持续时间(转换为秒)
SELECT mean("compactions") AS "compactions", mean("compaction_duration_ns") / 1000000000 AS "compaction_duration_s" 
FROM "_internal"."monitor"."tsm1_engine" 
WHERE time > now() - 1h 
GROUP BY time(10m);

InfluxDB 2.x存储指标

InfluxDB 2.x版本的存储指标主要存储在_monitoring桶中,使用influxdb_tsm1_engine等测量集名称,与1.x版本有所区别。2.x版本支持使用InfluxQL和Flux两种查询语言获取指标。

TSM存储引擎指标

测量集:influxdb_tsm1_engine

字段名类型单位描述
cache_sizeintegerbytes当前缓存使用大小,反映内存中未持久化的数据量
cache_size_maxintegerbytes配置的最大缓存大小,由cache-max-memory-size参数控制
cache_writesintegercount缓存写入总次数,反映写入请求的频率
cache_hitsintegercount缓存命中次数,缓存命中意味着数据可以直接从内存中获取,无需读取磁盘
cache_missesintegercount缓存未命中次数,未命中意味着需要从磁盘读取数据,会增加查询延迟
cache_evictionsintegercount缓存驱逐次数,当缓存达到上限时,会将旧数据写入磁盘
compactionsintegercount压缩操作总次数,压缩可以优化TSM文件结构,提高查询性能
compaction_durationintegernanoseconds压缩操作的总持续时间,反映压缩操作的开销
compaction_errorsintegercount压缩操作错误次数,出现错误可能导致数据不一致或性能问题
file_open_failuresintegercount文件打开失败次数,通常与权限问题或磁盘故障有关

测量集:influxdb_tsm1_filestore

该测量集记录TSM文件系统的状态,反映数据持久化的情况:

字段名类型单位描述
file_countintegercount当前TSM文件的总数,文件数量过多可能影响性能
file_size_bytesintegerbytes所有TSM文件的总大小,反映数据存储占用的磁盘空间
files_corruptintegercount损坏的TSM文件数量,损坏的文件可能导致数据丢失
files_recoveredintegercount成功恢复的TSM文件数量,反映系统的自我修复能力

测量集:influxdb_wal

WAL(Write-Ahead Log)是InfluxDB的预写日志,用于确保数据写入的可靠性:

字段名类型单位描述
wal_write_bytesintegerbytesWAL写入的总字节数,反映写入负载
wal_write_durationintegernanosecondsWAL写入操作的总持续时间
wal_fsync_durationintegernanosecondsWAL同步到磁盘的总持续时间,直接影响写入延迟
wal_fsync_countintegercountWAL同步到磁盘的总次数,fsync操作是写入性能的关键瓶颈
wal_fsync_pausedintegercountWAL fsync暂停次数,当磁盘I/O繁忙时可能发生
wal_buffer_sizeintegerbytes当前WAL缓冲区使用大小

测量集:influxdb_write

记录数据写入相关的性能和状态指标:

字段名类型单位描述
write_points_okintegercount成功写入的数据点数量,反映正常写入的流量
write_points_errintegercount写入失败的数据点数量,写入错误需要及时排查
write_reqintegercount写入请求的总数量
write_req_bytesintegerbytes写入请求的总字节数,反映写入数据量
write_req_errintegercount写入请求失败的数量,请求失败可能是由于网络问题或服务器负载过高

测量集:influxdb_query

记录查询执行的性能和状态指标:

字段名类型单位描述
query_durationintegernanoseconds查询执行的总持续时间,是查询性能的核心指标
query_errorsintegercount查询执行错误的次数,错误可能是由于语法错误或资源不足
query_result_bytesintegerbytes查询结果的总字节数,反映查询返回的数据量
query_rows_readintegercount查询读取的总行数,反映查询的复杂度和数据扫描范围
query_rows_writtenintegercount查询写入的总行数,例如任务执行的结果写入

示例查询

InfluxDB 2.x支持InfluxQL和Flux两种查询语言,以下是一些常用的查询示例:

InfluxQL查询

sql
-- 查询TSM文件数量和大小
SELECT mean("file_count") AS "file_count", mean("file_size_bytes") AS "file_size_bytes" 
FROM "_monitoring"."autogen"."influxdb_tsm1_filestore" 
WHERE time > now() - 1h 
GROUP BY time(10m);

Flux查询

Flux是InfluxDB 2.x的原生查询语言,提供更强大的数据分析能力:

sql
-- 查询缓存命中率
from(bucket: "_monitoring")
  |> range(start: -1h)
  |> filter(fn: (r) => r["_measurement"] == "influxdb_tsm1_engine")
  |> filter(fn: (r) => r["_field"] == "cache_hits" or r["_field"] == "cache_misses")
  |> aggregateWindow(every: 10m, fn: mean, createEmpty: false)
  |> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")
  |> map(fn: (r) => ({
      r with
      _value: r.cache_hits / (r.cache_hits + r.cache_misses),
      _field: "cache_hit_ratio"
  }))
  |> yield(name: "mean")

-- 查询压缩操作次数和持续时间
from(bucket: "_monitoring")
  |> range(start: -1h)
  |> filter(fn: (r) => r["_measurement"] == "influxdb_tsm1_engine")
  |> filter(fn: (r) => r["_field"] == "compactions" or r["_field"] == "compaction_duration")
  |> aggregateWindow(every: 10m, fn: mean, createEmpty: false)
  |> map(fn: (r) => if r["_field"] == "compaction_duration" then ({
      r with
      _value: r._value / 1000000000
  }) else r)
  |> yield(name: "mean")

存储指标监控工具

命令行工具

influx命令

influx命令行工具是查询InfluxDB指标的主要方式:

bash
# 1.x版本查询存储指标
influx -execute "SELECT * FROM _internal.monitor.tsm1_engine WHERE time > now() - 5m"

# 2.x版本查询存储指标
influx query -q "from(bucket: \"_monitoring\") |> range(start: -5m) |> filter(fn: (r) => r[\"_measurement\"] == \"influxdb_tsm1_engine\")" -o my-org

influxd inspect

influxd inspect工具用于检查和修复TSM文件:

bash
# 检查TSM文件
influxd inspect buildtsi -datadir /var/lib/influxdb/data -waldir /var/lib/influxdb/wal

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

# 查看TSM文件统计信息
influxd inspect dumptsm -path /var/lib/influxdb/data/mydb/autogen/1/

监控系统集成

Telegraf

Telegraf是InfluxData生态中的数据收集代理,可以方便地收集InfluxDB自身的指标:

toml
# telegraf.conf
[[inputs.influxdb]]
  urls = ["http://localhost:8086"]
  timeout = "5s"
  username = "admin"
  password = "password"
  ssl = false
  ssl_verify = true
  insecure_skip_verify = false

[[outputs.influxdb]]
  urls = ["http://localhost:8086"]
  database = "monitoring"
  retention_policy = ""
  write_consistency = "any"
  timeout = "5s"

Prometheus

Prometheus是流行的监控系统,可以通过InfluxDB的/metrics端点获取指标:

yaml
# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'influxdb'
    static_configs:
      - targets: ['localhost:8086']
    metrics_path: '/metrics'

Grafana

Grafana是强大的数据可视化工具,可以与InfluxDB和Prometheus集成,创建丰富的仪表盘:

  • 官方仪表盘ID

    • InfluxDB 1.x官方仪表盘:2583
    • InfluxDB 2.x官方仪表盘:13042
  • 自定义仪表盘示例

    • TSM文件数量和大小趋势图,用于监控存储增长
    • 缓存命中率仪表盘,用于评估缓存效率
    • 压缩操作监控面板,用于监控压缩性能
    • WAL写入性能监控,用于优化写入延迟

存储指标优化

基于指标的优化策略

缓存优化

  • 监控指标cache_hit_ratiocache_evictions
  • 优化目标:保持缓存命中率在90%以上
  • 优化措施
    toml
    # 1.x版本配置
    [data]
      cache-max-memory-size = "1g"
      cache-snapshot-memory-size = "25m"
      cache-snapshot-write-cold-duration = "10m"

压缩优化

  • 监控指标compactionscompaction_duration
  • 优化目标:减少压缩操作时间和频率
  • 优化措施
    toml
    # 1.x版本配置
    [data]
      compact-full-write-cold-duration = "4h"
      compact-throughput-burst = "500m"

WAL优化

  • 监控指标wal_fsync_durationwal_fsync_count
  • 优化目标:减少WAL fsync次数和延迟
  • 优化措施
    toml
    # 1.x版本配置
    [data]
      wal-fsync-delay = "0"
      wal-flush-interval = "10m"

磁盘优化

  • 监控指标file_size_bytesfile_count
  • 优化目标:控制TSM文件数量和大小
  • 优化措施
    • 调整保留策略
    • 配置数据降采样
    • 优化分片持续时间

常见存储问题诊断

高缓存驱逐率

症状

  • cache_evictions指标持续增长
  • cache_hit_ratio低于80%

可能原因

  • 缓存大小设置过小
  • 写入速率过高
  • 查询模式不佳

解决方案

toml
# 增加缓存大小
[data]
  cache-max-memory-size = "2g"
  cache-snapshot-memory-size = "50m"

频繁压缩操作

症状

  • compactions指标频繁增长
  • compaction_duration持续增加

可能原因

  • 写入速率不稳定
  • 数据冷热分布不均
  • 压缩配置不当

解决方案

toml
# 调整压缩配置
[data]
  compact-full-write-cold-duration = "6h"
  compact-throughput = "250m"
  compact-throughput-burst = "1g"

WAL写入延迟高

症状

  • wal_fsync_duration平均值高于10ms
  • wal_fsync_paused指标增长

可能原因

  • 磁盘I/O性能差
  • WAL配置不当
  • 写入速率过高

解决方案

toml
# 调整WAL配置
[data]
  wal-fsync-delay = "10ms"
  wal-flush-interval = "5m"
  wal-partition-flush-delay = "2s"

TSM文件数量过多

症状

  • file_count指标持续增长
  • 磁盘使用量快速增加

可能原因

  • 分片持续时间过短
  • 数据保留策略设置不当
  • 写入模式导致碎片化

解决方案

toml
# 调整分片持续时间
[data]
  index-version = "tsi1"
  max-series-per-database = 1000000
  max-values-per-tag = 100000

存储指标最佳实践

1. 建立基准指标

  • 初始基准:在系统正常运行时记录各项指标的基准值
  • 定期更新:随着系统负载变化,定期更新基准指标
  • 异常检测:当指标偏离基准超过阈值时,触发告警

2. 设置合理的告警阈值

指标告警阈值告警级别
cache_hit_ratio< 80%警告
compaction_duration> 30s警告
wal_fsync_duration> 10ms警告
file_count> 1000警告
write_points_err> 1%错误

3. 监控关键指标组合

  • 写入性能write_points_ok + write_req_duration
  • 查询性能query_duration + query_rows_read
  • 存储健康file_count + file_size_bytes + compactions
  • 资源使用cache_size + wal_buffer_size + disk_usage

4. 定期分析历史趋势

  • 周趋势:分析每周的存储指标变化
  • 月趋势:分析每月的存储增长情况
  • 季度趋势:预测长期存储需求
  • 容量规划:根据趋势数据规划存储扩容

5. 结合其他指标分析

  • 系统指标:结合CPU、内存、磁盘I/O等系统指标
  • 业务指标:结合写入速率、查询速率等业务指标
  • 日志分析:结合InfluxDB日志进行综合分析

常见问题(FAQ)

Q1: 如何获取InfluxDB存储指标?

A1: 获取方法:

  • 通过_internal数据库(1.x)或_monitoring桶(2.x)查询
  • 使用Telegraf收集并发送到监控系统
  • 通过HTTP API获取Prometheus格式的指标

Q2: 1.x和2.x版本的存储指标有什么区别?

A2: 主要区别:

  • 测量集名称不同(1.x:tsm1_engine;2.x:influxdb_tsm1_engine)
  • 数据存储位置不同(1.x:_internal;2.x:_monitoring)
  • 查询语言不同(1.x:InfluxQL;2.x:Flux/InfluxQL)

Q3: 如何优化InfluxDB的缓存性能?

A3: 优化方法:

  • 增加缓存大小
  • 调整缓存快照配置
  • 优化写入模式
  • 调整数据保留策略

Q4: 如何监控TSM文件的健康状态?

A4: 监控方法:

  • 查看file_countfile_size_bytes指标
  • 使用influxd inspect工具检查TSM文件
  • 监控files_corruptfiles_recovered指标
  • 定期运行TSM文件修复工具

Q5: 如何降低InfluxDB的压缩开销?

A5: 降低方法:

  • 调整压缩配置参数
  • 优化数据写入模式
  • 调整分片持续时间
  • 合理设置保留策略

Q6: 如何监控WAL写入性能?

A6: 监控方法:

  • 查看wal_write_byteswal_write_duration指标
  • 监控wal_fsync_durationwal_fsync_count指标
  • 检查wal_fsync_paused指标
  • 结合磁盘I/O指标分析

Q7: 如何预测InfluxDB的存储增长?

A7: 预测方法:

  • 分析历史存储指标趋势
  • 结合业务增长预测
  • 考虑数据保留策略和降采样配置
  • 使用监控系统的预测功能

Q8: 如何处理损坏的TSM文件?

A8: 处理方法:

  • 使用influxd inspect repair工具修复
  • 从备份恢复数据
  • 重新构建TSI索引
  • 考虑使用数据迁移工具

Q9: 如何监控InfluxDB的磁盘使用情况?

A9: 监控方法:

  • 使用系统级工具(如df、du)
  • 监控InfluxDB的存储指标
  • 结合监控系统的磁盘监控
  • 设置磁盘使用告警阈值

Q10: 如何优化InfluxDB的查询性能?

A10: 优化方法:

  • 优化查询语句
  • 增加缓存大小
  • 调整TSI索引配置
  • 优化数据模型
  • 考虑数据降采样