Skip to content

InfluxDB 存储指标

核心存储指标

TSM文件指标

TSM文件数量

  • 指标名称tsm_file_count
  • 描述:InfluxDB中TSM文件的总数量
  • 正常范围:根据数据量和保留策略而定,一般< 1000个
  • 告警阈值建议
    • 警告:> 1500个
    • 严重:> 2000个
  • 监控频率:5分钟
  • 影响:TSM文件过多会导致查询性能下降
  • 查看方式
    bash
    # 1.x版本
    ls -la /var/lib/influxdb/data/*/*/*/*.tsm | wc -l
    
    # 2.x版本
    ls -la /var/lib/influxdb2/engine/data/*/*.tsm | wc -l

TSM文件大小

  • 指标名称tsm_file_size
  • 描述:TSM文件的平均大小和总大小
  • 正常范围
    • 平均大小:100MB-1GB
    • 总大小:根据数据量和保留策略而定
  • 告警阈值建议
    • 警告:单个TSM文件> 2GB
    • 严重:单个TSM文件> 5GB
  • 监控频率:5分钟
  • 影响:TSM文件过大或过小都会影响查询性能
  • 查看方式
    bash
    # 查看TSM文件大小分布
    du -h /var/lib/influxdb2/engine/data/*/*.tsm | sort -rh | head -20

TSM文件写入速率

  • 指标名称tsm_write_rate
  • 描述:TSM文件的写入速率
  • 正常范围:根据写入负载而定
  • 告警阈值建议
    • 警告:写入速率超过磁盘I/O能力的80%
    • 严重:写入速率超过磁盘I/O能力的95%
  • 监控频率:1分钟
  • 影响:TSM写入速率过高会导致磁盘I/O瓶颈

TSM文件读取速率

  • 指标名称tsm_read_rate
  • 描述:TSM文件的读取速率
  • 正常范围:根据查询负载而定
  • 告警阈值建议
    • 警告:读取速率超过磁盘I/O能力的80%
    • 严重:读取速率超过磁盘I/O能力的95%
  • 监控频率:1分钟
  • 影响:TSM读取速率过高会导致查询性能下降

WAL文件指标

WAL文件数量

  • 指标名称wal_file_count
  • 描述:WAL文件的总数量
  • 正常范围
    • 稳态:< 10个
    • 峰值:< 50个
  • 告警阈值建议
    • 警告:> 50个
    • 严重:> 100个
  • 监控频率:1分钟
  • 影响:WAL文件过多会导致内存占用增加、写入延迟增加
  • 查看方式
    bash
    # 1.x版本
    ls -la /var/lib/influxdb/wal/*/*/*.wal | wc -l
    
    # 2.x版本
    ls -la /var/lib/influxdb2/engine/wal/*/*/*.wal | wc -l

WAL文件大小

  • 指标名称wal_file_size
  • 描述:WAL文件的平均大小和总大小
  • 正常范围
    • 单个文件大小:64MB(默认配置)
    • 总大小:根据写入负载而定
  • 告警阈值建议
    • 警告:单个WAL文件> 128MB
    • 严重:单个WAL文件> 256MB
  • 监控频率:1分钟
  • 影响:WAL文件过大会导致内存占用增加、故障恢复时间延长

WAL写入速率

  • 指标名称wal_write_rate
  • 描述:WAL文件的写入速率
  • 正常范围:根据写入负载而定
  • 告警阈值建议
    • 警告:写入速率超过磁盘I/O能力的80%
    • 严重:写入速率超过磁盘I/O能力的95%
  • 监控频率:1分钟
  • 影响:WAL写入速率过高会导致写入延迟增加

WAL fsync延迟

  • 指标名称wal_fsync_delay
  • 描述:WAL文件fsync操作的延迟时间
  • 正常范围:< 10ms
  • 告警阈值建议
    • 警告:> 50ms
    • 严重:> 100ms
  • 监控频率:1分钟
  • 影响:WAL fsync延迟过高会导致写入延迟增加

磁盘空间指标

数据目录使用率

  • 指标名称data_dir_usage
  • 描述:InfluxDB数据目录的磁盘空间使用率
  • 正常范围:< 70%
  • 告警阈值建议
    • 警告:> 80%
    • 严重:> 90%
  • 监控频率:5分钟
  • 影响:磁盘空间不足会导致写入失败、数据丢失
  • 查看方式
    bash
    # 1.x版本
    df -h /var/lib/influxdb/data
    
    # 2.x版本
    df -h /var/lib/influxdb2

WAL目录使用率

  • 指标名称wal_dir_usage
  • 描述:InfluxDB WAL目录的磁盘空间使用率
  • 正常范围:< 50%
  • 告警阈值建议
    • 警告:> 70%
    • 严重:> 80%
  • 监控频率:5分钟
  • 影响:WAL目录空间不足会导致写入失败

磁盘I/O使用率

  • 指标名称disk_io_util
  • 描述:存储InfluxDB数据的磁盘I/O使用率
  • 正常范围:< 70%
  • 告警阈值建议
    • 警告:> 75%
    • 严重:> 90%
  • 监控频率:1分钟
  • 影响:磁盘I/O瓶颈会导致写入延迟增加、查询性能下降
  • 查看方式
    bash
    iostat -x 1

磁盘读写速率

  • 指标名称disk_read_ratedisk_write_rate
  • 描述:磁盘的读取速率和写入速率
  • 正常范围:根据磁盘类型和配置而定
    • SSD:读取> 500MB/s,写入> 300MB/s
    • HDD:读取> 100MB/s,写入> 50MB/s
  • 告警阈值建议
    • 警告:连续5分钟低于正常范围的50%
    • 严重:连续5分钟低于正常范围的30%
  • 监控频率:1分钟
  • 影响:磁盘读写速率过低会导致系统性能下降

序列和分片指标

序列数量

  • 指标名称series_count
  • 描述:InfluxDB中的序列数量
  • 正常范围:根据硬件资源而定,一般< 1,000,000个
  • 告警阈值建议
    • 警告:> 1,500,000个
    • 严重:> 2,000,000个
  • 监控频率:5分钟
  • 影响:序列数量过多会导致内存占用增加、写入性能下降
  • 查看方式
    sql
    -- 1.x版本
    SHOW SERIES CARDINALITY
    
    -- 2.x版本
    influx query -o my-org -b my-bucket "from(bucket: \"my-bucket\") |> range(start: -1m) |> group(columns: [\"_measurement\", \"tag1\", \"tag2\"]) |> distinct(column: \"_field\") |> count(column: \"_field\")"

分片数量

  • 指标名称shard_count
  • 描述:InfluxDB中的分片数量
  • 正常范围:根据数据量和保留策略而定,一般< 100个
  • 告警阈值建议
    • 警告:> 200个
    • 严重:> 300个
  • 监控频率:5分钟
  • 影响:分片数量过多会导致管理复杂、查询性能下降

分片大小

  • 指标名称shard_size
  • 描述:分片的平均大小和总大小
  • 正常范围
    • 平均大小:1GB-10GB
    • 总大小:根据数据量和保留策略而定
  • 告警阈值建议
    • 警告:单个分片> 20GB
    • 严重:单个分片> 50GB
  • 监控频率:5分钟
  • 影响:分片过大或过小都会影响查询性能

存储指标监控方法

使用Telegraf监控

配置Telegraf

  • 安装Telegraf

    bash
    # Ubuntu/Debian
    sudo apt-get install telegraf
    
    # CentOS/RHEL
    sudo yum install telegraf
  • 配置Telegraf

    toml
    # /etc/telegraf/telegraf.conf
    [agent]
      interval = "10s"
      round_interval = true
      metric_batch_size = 1000
      metric_buffer_limit = 10000
      collection_jitter = "0s"
      flush_interval = "10s"
      flush_jitter = "0s"
      precision = ""
      hostname = "influxdb-server"
      omit_hostname = false
    
    [[inputs.disk]]
      ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
    
    [[inputs.diskio]]
      devices = ["sda", "sdb"]
    
    [[inputs.influxdb]]
      urls = ["http://localhost:8086"]
      timeout = "5s"
      username = ""
      password = ""
      ssl = false
      ssl_verify = true
      insecure_skip_verify = false
    
    [[outputs.influxdb]]
      urls = ["http://localhost:8086"]
      database = "telegraf"
      retention_policy = ""
      write_consistency = "any"
      timeout = "5s"
      username = ""
      password = ""
      ssl = false
      ssl_verify = true
      insecure_skip_verify = false
  • 重启Telegraf

    bash
    systemctl restart telegraf

监控指标

  • TSM文件指标

    • influxdb_tsm_file_count:TSM文件数量
    • influxdb_tsm_file_size:TSM文件大小
  • WAL文件指标

    • influxdb_wal_file_count:WAL文件数量
    • influxdb_wal_file_size:WAL文件大小
    • influxdb_wal_fsync_delay:WAL fsync延迟
  • 磁盘空间指标

    • disk_usage_percent:磁盘空间使用率
    • diskio_read_bytes:磁盘读取速率
    • diskio_write_bytes:磁盘写入速率
    • diskio_util:磁盘I/O使用率

使用InfluxDB 2.x内置监控

查看存储指标

  1. 登录InfluxDB 2.x UI
  2. 点击左侧菜单中的"Metrics"
  3. 选择"InfluxDB" → "Storage"
  4. 查看存储相关指标

创建存储指标仪表盘

  1. 点击左侧菜单中的"Dashboards"
  2. 点击"Create Dashboard"
  3. 点击"Add Cell"
  4. 选择"InfluxDB"数据源
  5. 配置查询语句,选择存储相关指标
  6. 保存仪表盘

使用第三方监控工具

Prometheus + Grafana

  • 配置Prometheus

    yaml
    # prometheus.yml
    global:
      scrape_interval: 15s
    
    scrape_configs:
      - job_name: 'influxdb'
        static_configs:
          - targets: ['influxdb-server:8086']
        metrics_path: '/metrics'
  • 配置Grafana

    1. 在Grafana中添加Prometheus数据源
    2. 创建仪表盘,添加存储相关面板
    3. 配置告警规则

Zabbix

  • 配置Zabbix Agent

    bash
    # 在InfluxDB服务器上安装Zabbix Agent
    sudo apt-get install zabbix-agent
  • 配置Zabbix Server

    1. 添加InfluxDB主机
    2. 链接InfluxDB模板
    3. 调整存储指标的监控项和告警阈值

存储指标优化策略

TSM文件优化

合并TSM文件

  • 自动合并: InfluxDB会自动合并小的TSM文件

    toml
    # 1.x版本
    [data]
      compact-full-write-cold-duration = "4h"
    
    # 2.x版本
    [storage]
      compact-full-write-cold-duration = "4h"
  • 手动合并

    bash
    # 1.x版本
    influxd inspect optimize -datadir /var/lib/influxdb/data
    
    # 2.x版本
    influxd inspect compact --engine-path /var/lib/influxdb2/engine

调整TSM文件大小

  • 配置TSM文件大小
    toml
    # 1.x版本
    [data]
      cache-snapshot-memory-size = "26214400"  # 25MB
      cache-snapshot-write-cold-duration = "10m"
    
    # 2.x版本
    [storage]
      cache-snapshot-memory-size = "26214400"  # 25MB
      cache-snapshot-write-cold-duration = "10m"

WAL文件优化

调整WAL文件配置

  • 配置WAL文件大小
    toml
    # 1.x版本
    [wal]
      segment-size = "67108864"  # 64MB
      flush-fsync-interval = "10s"
    
    # 2.x版本
    [storage.wal]
      segment-size = "67108864"  # 64MB
      flush-fsync-interval = "10s"

分离WAL目录

  • 将WAL目录分离到单独的磁盘
    toml
    # 1.x版本
    [data]
      wal-dir = "/wal/influxdb"
    
    # 2.x版本
    [storage]
      wal-dir = "/wal/influxdb2"

磁盘空间优化

设置合理的保留策略

  • 创建保留策略

    sql
    -- 1.x版本
    CREATE RETENTION POLICY "7d" ON "mydb" DURATION 7d REPLICATION 1 DEFAULT
    
    -- 2.x版本
    influx bucket update --name my-bucket --retention 7d
  • 创建连续查询,降采样数据

    sql
    -- 1.x版本
    CREATE CONTINUOUS QUERY cq_1h ON mydb BEGIN
      SELECT mean(field1), max(field2) INTO mydb.7d.downsampled_1h FROM measurement GROUP BY time(1h), tag1
    END
    
    -- 2.x版本
    influx task create -org my-org -name cq_1h -every 1h -query "from(bucket: \"my-bucket\") |> range(start: -2h) |> filter(fn: (r) => r._measurement == \"measurement\") |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> to(bucket: \"my-bucket\", org: \"my-org\", measurement: \"downsampled_1h\")"

清理过期数据

  • 手动清理过期数据
    bash
    # 1.x版本
    influx -execute "DROP SERIES WHERE time < now() - 30d"
    
    # 2.x版本
    influx delete --bucket my-bucket --start "1970-01-01T00:00:00Z" --stop "2023-01-01T00:00:00Z"

序列优化

控制标签基数

  • 避免高基数标签

    • 避免使用UUID、时间戳等作为标签值
    • 将高基数标签转换为字段
    • 使用合理的标签组合,减少序列数量
  • 示例

    sql
    -- 不好的设计:高基数标签
    SELECT * FROM measurement WHERE user_id = '123456'
    
    -- 好的设计:将user_id作为字段
    SELECT * FROM measurement WHERE user_type = 'premium' AND user_id = '123456'

使用测量集分区

  • 按数据类型分区

    • 将不同类型的数据存储在不同的测量集中
    • 减少单个测量集的序列数量
  • 示例

    sql
    -- 不好的设计:一个测量集存储多种数据
    SELECT * FROM metrics WHERE type = 'cpu'
    SELECT * FROM metrics WHERE type = 'memory'
    
    -- 好的设计:不同测量集存储不同类型数据
    SELECT * FROM cpu_metrics
    SELECT * FROM memory_metrics

存储指标告警配置

告警规则示例

TSM文件数量告警

  • 告警条件:TSM文件数量> 1500个,持续5分钟
  • 告警级别:警告
  • 通知方式:邮件
  • 修复建议
    • 检查保留策略,清理过期数据
    • 手动合并TSM文件
    • 优化数据模型,减少序列数量

磁盘空间使用率告警

  • 告警条件:数据目录使用率> 80%,持续10分钟
  • 告警级别:警告
  • 通知方式:邮件+Slack
  • 修复建议
    • 检查保留策略,清理过期数据
    • 扩容磁盘空间
    • 优化数据模型,减少数据量

WAL文件数量告警

  • 告警条件:WAL文件数量> 50个,持续5分钟
  • 告警级别:严重
  • 通知方式:Slack+PagerDuty
  • 修复建议
    • 检查写入负载,是否存在突发写入
    • 调整WAL配置,增加WAL文件大小
    • 检查磁盘I/O性能,是否存在I/O瓶颈

序列数量告警

  • 告警条件:序列数量> 1,500,000个,持续1小时
  • 告警级别:严重
  • 通知方式:Slack+PagerDuty
  • 修复建议
    • 优化数据模型,减少标签基数
    • 使用测量集分区
    • 考虑数据分片

存储指标监控最佳实践

1. 定期监控存储指标

  • 监控频率

    • 实时指标:1分钟
    • 趋势指标:5分钟
    • 汇总指标:1小时
  • 监控内容

    • TSM文件数量和大小
    • WAL文件数量和大小
    • 磁盘空间使用率
    • 序列数量
    • 存储增长趋势

2. 设置合理的告警阈值

  • 基于历史数据

    • 根据历史数据分布设置告警阈值
    • 避免过于敏感,导致频繁告警
  • 分级告警

    • 警告:潜在问题,需要关注
    • 严重:严重问题,需要立即处理
    • 紧急:系统故障,需要立即修复

3. 分析存储增长趋势

  • 预测存储需求

    • 根据存储增长趋势,预测未来存储需求
    • 提前规划存储扩容
  • 优化存储配置

    • 根据存储增长趋势,调整保留策略
    • 优化数据模型,减少数据量

4. 定期清理过期数据

  • 自动清理

    • 设置合理的保留策略,自动清理过期数据
    • 创建连续查询,降采样数据
  • 手动清理

    • 定期手动清理过期数据
    • 清理不再使用的测量集和标签

5. 优化数据模型

  • 控制标签基数

    • 避免高基数标签
    • 合理设计标签组合
  • 使用测量集分区

    • 按数据类型分区
    • 减少单个测量集的序列数量

6. 定期进行存储维护

  • 合并TSM文件

    • 定期手动合并TSM文件
    • 优化TSM文件结构
  • 检查存储完整性

    • 定期检查TSM文件完整性
    • 修复损坏的TSM文件
  • 备份重要数据

    • 定期备份InfluxDB数据
    • 测试备份数据的可恢复性

常见问题(FAQ)

Q1: 如何查看InfluxDB的存储使用情况?

A1: 查看InfluxDB存储使用情况的方法包括:

  • 使用df -h命令查看磁盘空间使用率
  • 使用ls -la命令查看TSM和WAL文件数量和大小
  • 使用InfluxDB内置命令查看序列数量
  • 使用监控工具(如Telegraf、Grafana)查看存储指标

Q2: 如何优化InfluxDB的存储使用?

A2: 优化InfluxDB存储使用的方法包括:

  • 设置合理的保留策略,自动清理过期数据
  • 创建连续查询,降采样数据
  • 优化数据模型,减少标签基数
  • 合并TSM文件,优化存储结构
  • 清理不再使用的数据

Q3: 如何处理InfluxDB中的大量小TSM文件?

A3: 处理大量小TSM文件的方法包括:

  • 调整InfluxDB配置,增加缓存大小
  • 手动合并TSM文件
  • 优化写入模式,使用批量写入
  • 调整保留策略,减少数据量

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

A4: 预测InfluxDB存储增长的方法包括:

  • 监控存储增长速率
  • 分析历史存储使用趋势
  • 考虑业务增长和数据量变化
  • 使用监控工具的预测功能

Q5: 如何处理InfluxDB磁盘空间不足的问题?

A5: 处理磁盘空间不足的方法包括:

  • 紧急清理:手动删除过期数据
  • 扩容磁盘空间
  • 优化数据模型,减少数据量
  • 调整保留策略,缩短数据保留时间

Q6: 如何监控InfluxDB 1.x的存储指标?

A6: 监控InfluxDB 1.x存储指标的方法包括:

  • 使用Telegraf收集存储指标
  • 配置InfluxDB日志,查看存储相关信息
  • 使用第三方监控工具,如Prometheus + Grafana
  • 编写自定义脚本,定期检查存储使用情况

Q7: 如何优化WAL文件的使用?

A7: 优化WAL文件使用的方法包括:

  • 调整WAL文件大小和保留时间
  • 分离WAL目录到单独的磁盘
  • 优化写入模式,使用批量写入
  • 监控WAL fsync延迟,优化磁盘性能

Q8: 如何处理InfluxDB中的高序列数量?

A8: 处理高序列数量的方法包括:

  • 优化数据模型,减少标签基数
  • 使用测量集分区
  • 考虑数据分片
  • 清理不再使用的序列
  • 升级硬件资源,增加内存

Q9: 如何检查TSM文件的完整性?

A9: 检查TSM文件完整性的方法包括:

  • 使用influxd inspect verify命令
  • 查看InfluxDB日志,是否有TSM文件损坏的错误信息
  • 尝试查询数据,检查是否有数据丢失

Q10: 如何备份InfluxDB存储数据?

A10: 备份InfluxDB存储数据的方法包括:

  • 使用influxd backup命令进行官方备份
  • 直接复制TSM和WAL文件(需在InfluxDB停止时进行)
  • 使用第三方备份工具,如rsync或快照技术
  • 定期导出数据,如使用influxd inspect export命令