外观
InfluxDB 存储指标参考
本文详细介绍InfluxDB存储指标的含义、获取方法和使用技巧,帮助用户监控和优化InfluxDB存储性能。
InfluxDB 1.x存储指标
InfluxDB 1.x版本的存储指标主要存储在_internal数据库的monitor保留策略中,包含TSM存储引擎、WAL、写入和查询等多个方面的指标。
TSM存储引擎指标
TSM(Time-Structured Merge Tree)是InfluxDB的核心存储引擎,负责数据的存储和检索。以下是TSM存储引擎的关键指标:
测量集:tsm1_engine
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| cache_size | integer | bytes | 当前缓存使用大小,反映内存中未持久化的数据量 |
| cache_size_max | integer | bytes | 配置的最大缓存大小,由cache-max-memory-size参数控制 |
| cache_writes | integer | count | 缓存写入总次数,反映写入请求的频率 |
| cache_hits | integer | count | 缓存命中次数,缓存命中意味着数据可以直接从内存中获取,无需读取磁盘 |
| cache_misses | integer | count | 缓存未命中次数,未命中意味着需要从磁盘读取数据,会增加查询延迟 |
| cache_evictions | integer | count | 缓存驱逐次数,当缓存达到上限时,会将旧数据写入磁盘 |
| compactions | integer | count | 压缩操作总次数,压缩可以优化TSM文件结构,提高查询性能 |
| compaction_duration_ns | integer | nanoseconds | 压缩操作的总持续时间,反映压缩操作的开销 |
| compaction_errors | integer | count | 压缩操作错误次数,出现错误可能导致数据不一致或性能问题 |
| file_open_failures | integer | count | 文件打开失败次数,通常与权限问题或磁盘故障有关 |
测量集:tsm1_filestore
该测量集记录TSM文件系统的状态,反映数据持久化的情况:
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| file_count | integer | count | 当前TSM文件的总数,文件数量过多可能影响性能 |
| file_size_bytes | integer | bytes | 所有TSM文件的总大小,反映数据存储占用的磁盘空间 |
| files_corrupt | integer | count | 损坏的TSM文件数量,损坏的文件可能导致数据丢失 |
| files_recovered | integer | count | 成功恢复的TSM文件数量,反映系统的自我修复能力 |
测量集:tsm1_cache_hot
热缓存用于存储最近写入和频繁访问的数据:
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| size | integer | bytes | 当前热缓存使用大小 |
| size_max | integer | bytes | 配置的最大热缓存大小 |
| writes | integer | count | 热缓存写入次数 |
| hits | integer | count | 热缓存命中次数,热缓存命中性能最优 |
| misses | integer | count | 热缓存未命中次数 |
| evictions | integer | count | 热缓存驱逐次数,当热缓存满时,会将旧数据移至温缓存 |
测量集:tsm1_cache_warm
温缓存用于存储较旧但仍可能访问的数据:
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| size | integer | bytes | 当前温缓存使用大小 |
| size_max | integer | bytes | 配置的最大温缓存大小 |
| writes | integer | count | 温缓存写入次数,通常来自热缓存的驱逐 |
| hits | integer | count | 温缓存命中次数 |
| misses | integer | count | 温缓存未命中次数,未命中则需要从磁盘读取 |
| evictions | integer | count | 温缓存驱逐次数,当温缓存满时,会将数据写入磁盘 |
WAL指标
WAL(Write-Ahead Log)是InfluxDB的预写日志,用于确保数据写入的可靠性:
测量集:wal
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| wal_write_bytes | integer | bytes | WAL写入的总字节数,反映写入负载 |
| wal_write_duration_ns | integer | nanoseconds | WAL写入操作的总持续时间 |
| wal_fsync_duration_ns | integer | nanoseconds | WAL同步到磁盘的总持续时间,直接影响写入延迟 |
| wal_fsync_count | integer | count | WAL同步到磁盘的总次数,fsync操作是写入性能的关键瓶颈 |
| wal_fsync_paused | integer | count | WAL fsync暂停次数,当磁盘I/O繁忙时可能发生 |
| wal_buffer_size | integer | bytes | 当前WAL缓冲区使用大小 |
存储写入指标
记录数据写入相关的性能和状态指标:
测量集:write
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| write_points_ok | integer | count | 成功写入的数据点数量,反映正常写入的流量 |
| write_points_err | integer | count | 写入失败的数据点数量,写入错误需要及时排查 |
| write_req | integer | count | 写入请求的总数量 |
| write_req_bytes | integer | bytes | 写入请求的总字节数,反映写入数据量 |
| write_req_err | integer | count | 写入请求失败的数量,请求失败可能是由于网络问题或服务器负载过高 |
存储查询指标
记录查询执行的性能和状态指标:
测量集:queryExecutor
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| query_duration_ns | integer | nanoseconds | 查询执行的总持续时间,是查询性能的核心指标 |
| query_errors | integer | count | 查询执行错误的次数,错误可能是由于语法错误或资源不足 |
| query_result_bytes | integer | bytes | 查询结果的总字节数,反映查询返回的数据量 |
| query_row_limit | integer | count | 查询结果行数限制,由配置参数控制 |
| query_rows_read | integer | count | 查询读取的总行数,反映查询的复杂度和数据扫描范围 |
| query_rows_written | integer | count | 查询写入的总行数,例如连续查询的结果写入 |
示例查询
以下是一些常用的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_size | integer | bytes | 当前缓存使用大小,反映内存中未持久化的数据量 |
| cache_size_max | integer | bytes | 配置的最大缓存大小,由cache-max-memory-size参数控制 |
| cache_writes | integer | count | 缓存写入总次数,反映写入请求的频率 |
| cache_hits | integer | count | 缓存命中次数,缓存命中意味着数据可以直接从内存中获取,无需读取磁盘 |
| cache_misses | integer | count | 缓存未命中次数,未命中意味着需要从磁盘读取数据,会增加查询延迟 |
| cache_evictions | integer | count | 缓存驱逐次数,当缓存达到上限时,会将旧数据写入磁盘 |
| compactions | integer | count | 压缩操作总次数,压缩可以优化TSM文件结构,提高查询性能 |
| compaction_duration | integer | nanoseconds | 压缩操作的总持续时间,反映压缩操作的开销 |
| compaction_errors | integer | count | 压缩操作错误次数,出现错误可能导致数据不一致或性能问题 |
| file_open_failures | integer | count | 文件打开失败次数,通常与权限问题或磁盘故障有关 |
测量集:influxdb_tsm1_filestore
该测量集记录TSM文件系统的状态,反映数据持久化的情况:
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| file_count | integer | count | 当前TSM文件的总数,文件数量过多可能影响性能 |
| file_size_bytes | integer | bytes | 所有TSM文件的总大小,反映数据存储占用的磁盘空间 |
| files_corrupt | integer | count | 损坏的TSM文件数量,损坏的文件可能导致数据丢失 |
| files_recovered | integer | count | 成功恢复的TSM文件数量,反映系统的自我修复能力 |
测量集:influxdb_wal
WAL(Write-Ahead Log)是InfluxDB的预写日志,用于确保数据写入的可靠性:
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| wal_write_bytes | integer | bytes | WAL写入的总字节数,反映写入负载 |
| wal_write_duration | integer | nanoseconds | WAL写入操作的总持续时间 |
| wal_fsync_duration | integer | nanoseconds | WAL同步到磁盘的总持续时间,直接影响写入延迟 |
| wal_fsync_count | integer | count | WAL同步到磁盘的总次数,fsync操作是写入性能的关键瓶颈 |
| wal_fsync_paused | integer | count | WAL fsync暂停次数,当磁盘I/O繁忙时可能发生 |
| wal_buffer_size | integer | bytes | 当前WAL缓冲区使用大小 |
测量集:influxdb_write
记录数据写入相关的性能和状态指标:
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| write_points_ok | integer | count | 成功写入的数据点数量,反映正常写入的流量 |
| write_points_err | integer | count | 写入失败的数据点数量,写入错误需要及时排查 |
| write_req | integer | count | 写入请求的总数量 |
| write_req_bytes | integer | bytes | 写入请求的总字节数,反映写入数据量 |
| write_req_err | integer | count | 写入请求失败的数量,请求失败可能是由于网络问题或服务器负载过高 |
测量集:influxdb_query
记录查询执行的性能和状态指标:
| 字段名 | 类型 | 单位 | 描述 |
|---|---|---|---|
| query_duration | integer | nanoseconds | 查询执行的总持续时间,是查询性能的核心指标 |
| query_errors | integer | count | 查询执行错误的次数,错误可能是由于语法错误或资源不足 |
| query_result_bytes | integer | bytes | 查询结果的总字节数,反映查询返回的数据量 |
| query_rows_read | integer | count | 查询读取的总行数,反映查询的复杂度和数据扫描范围 |
| query_rows_written | integer | count | 查询写入的总行数,例如任务执行的结果写入 |
示例查询
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-orginfluxd 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_ratio、cache_evictions - 优化目标:保持缓存命中率在90%以上
- 优化措施:toml
# 1.x版本配置 [data] cache-max-memory-size = "1g" cache-snapshot-memory-size = "25m" cache-snapshot-write-cold-duration = "10m"
压缩优化
- 监控指标:
compactions、compaction_duration - 优化目标:减少压缩操作时间和频率
- 优化措施:toml
# 1.x版本配置 [data] compact-full-write-cold-duration = "4h" compact-throughput-burst = "500m"
WAL优化
- 监控指标:
wal_fsync_duration、wal_fsync_count - 优化目标:减少WAL fsync次数和延迟
- 优化措施:toml
# 1.x版本配置 [data] wal-fsync-delay = "0" wal-flush-interval = "10m"
磁盘优化
- 监控指标:
file_size_bytes、file_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平均值高于10mswal_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_count和file_size_bytes指标 - 使用
influxd inspect工具检查TSM文件 - 监控
files_corrupt和files_recovered指标 - 定期运行TSM文件修复工具
Q5: 如何降低InfluxDB的压缩开销?
A5: 降低方法:
- 调整压缩配置参数
- 优化数据写入模式
- 调整分片持续时间
- 合理设置保留策略
Q6: 如何监控WAL写入性能?
A6: 监控方法:
- 查看
wal_write_bytes和wal_write_duration指标 - 监控
wal_fsync_duration和wal_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索引配置
- 优化数据模型
- 考虑数据降采样
