外观
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_rate、disk_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:
bashsystemctl 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内置监控
查看存储指标
- 登录InfluxDB 2.x UI
- 点击左侧菜单中的"Metrics"
- 选择"InfluxDB" → "Storage"
- 查看存储相关指标
创建存储指标仪表盘
- 点击左侧菜单中的"Dashboards"
- 点击"Create Dashboard"
- 点击"Add Cell"
- 选择"InfluxDB"数据源
- 配置查询语句,选择存储相关指标
- 保存仪表盘
使用第三方监控工具
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:
- 在Grafana中添加Prometheus数据源
- 创建仪表盘,添加存储相关面板
- 配置告警规则
Zabbix
配置Zabbix Agent:
bash# 在InfluxDB服务器上安装Zabbix Agent sudo apt-get install zabbix-agent配置Zabbix Server:
- 添加InfluxDB主机
- 链接InfluxDB模板
- 调整存储指标的监控项和告警阈值
存储指标优化策略
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命令
