influxdb字段是动态的,可自定义策略(定时删除)
·
InfluxDB 的字段(Fields)和标签(Tags)都是动态的,这是 InfluxDB 与关系型数据库的一个重要区别。
动态字段特性
1. Fields(字段)是完全动态的
每次插入数据时,可以有不同的字段集合:
-- 第一次插入:有 temperature 和 humidity 字段
INSERT sensor,device_id=123 temperature=25.4,humidity=60
-- 第二次插入:只有 temperature 字段
INSERT sensor,device_id=123 temperature=26.1
-- 第三次插入:增加新的 voltage 字段
INSERT sensor,device_id=123 temperature=24.8,voltage=3.7
-- 第四次插入:完全不同的字段集合
INSERT sensor,device_id=123 rpm=1500,status="active"
2. Tags(标签)也是动态的
标签也可以动态添加:
-- 第一次插入:只有 device_id 标签
INSERT sensor,device_id=123 temperature=25.4
-- 第二次插入:添加 location 标签
INSERT sensor,device_id=123,location="roomA" temperature=26.1
-- 第三次插入:添加更多标签
INSERT sensor,device_id=123,location="roomA",model="v2" temperature=24.8
实际示例
-- 创建数据库
CREATE DATABASE metrics
-- 插入各种不同结构的数据
INSERT server,host=web01,dc=us-west cpu=45.2,memory=2048,disk_used=75.3
INSERT server,host=web01,dc=us-west cpu=48.1,memory=1984 -- 缺少 disk_used
INSERT server,host=db01,dc=us-east cpu=12.4,connections=250,status="online"
INSERT server,host=web01,dc=us-west cpu=52.3,memory=2012,network_in=125.4 -- 新增 network_in
-- 查询所有数据
SELECT * FROM server
查询时的行为
由于字段是动态的,查询时需要注意:
-- 查询时,不存在的字段会返回空值
SELECT host, cpu, memory, disk_used, network_in FROM server
-- 结果示例:
-- time host cpu memory disk_used network_in
-- 2023-10-01T10:00:00 web01 45.2 2048 75.3 null
-- 2023-10-01T10:01:00 web01 48.1 1984 null null
-- 2023-10-01T10:02:00 db01 12.4 null null null
-- 2023-10-01T10:03:00 web01 52.3 2012 null 125.4
与关系型数据库的对比
| 特性 | InfluxDB | 关系型数据库 (MySQL) |
|---|---|---|
| 字段定义 | 动态,无需预定义 | 需要预先定义表结构 |
| 灵活性 | 每次插入可以有不同字段 | 所有行必须有相同字段 |
| 空值处理 | 不存在的字段显示为null | 通常需要默认值或允许NULL |
| Schema | Schema-on-Write | Schema-on-Read |
这种设计的好处
- 灵活性:适应不断变化的数据源
- 易用性:无需预先设计复杂的表结构
- 扩展性:轻松添加新的监控指标
- 稀疏数据友好:适合传感器等可能缺失数据的情况
注意事项
虽然动态字段很灵活,但也需要注意:
- 查询复杂性:需要处理可能为null的字段
- 存储效率:过多的不同字段组合可能影响性能
- 数据一致性:需要确保业务逻辑能处理字段变化
-- 使用条件函数处理可能不存在的字段
SELECT host,
cpu,
memory,
disk_used,
IFNULL(disk_used, 0) as disk_used_safe -- 为null时提供默认值
FROM server
总结
是的,InfluxDB 的 tags 和 fields 都是完全动态的:
- ✅ 每次插入可以有不同数量的字段
- ✅ 可以随时添加新的字段或标签
- ✅ 不需要预先定义schema
- ✅ 缺失的字段在查询时显示为null
这种设计使得 InfluxDB 特别适合物联网、监控系统等数据模式可能频繁变化的场景。
策略
非常好!这正是 InfluxDB 的强项之一。InfluxDB 专门为处理时间序列数据设计了自动数据保留和清理机制。主要通过 保留策略(Retention Policies - RP) 来实现你的需求。
核心概念:保留策略 (Retention Policy)
保留策略定义了数据在数据库中保存多长时间,过期后自动删除。
解决方案
1. 查看现有的保留策略
首先,连接到 InfluxDB 并查看当前的策略:
-- 连接到 InfluxDB
docker exec -it influxdb influx
-- 查看所有保留策略
SHOW RETENTION POLICIES ON mydatabase
2. 创建自定义保留策略(推荐)
创建一个只保留最近7天数据的策略:
-- 创建保留策略:保留7天,1个副本,设置为默认策略
CREATE RETENTION POLICY "one_week_only" ON "mydatabase" DURATION 7d REPLICATION 1 DEFAULT
-- 或者创建非默认策略
CREATE RETENTION POLICY "two_weeks" ON "mydatabase" DURATION 14d REPLICATION 1
3. 修改现有保留策略
如果你已经有一个策略,可以修改它:
-- 修改保留时间为3天
ALTER RETENTION POLICY "autogen" ON "mydatabase" DURATION 3d DEFAULT
4. 按数据量大小控制(高级用法)
如果你需要按数据量而不是时间来控制,可以使用 连续查询(Continuous Queries - CQ) 配合 分片(Sharding):
-- 创建一个按数据量控制的连续查询(示例)
CREATE CONTINUOUS QUERY "cq_sample_data" ON "mydatabase"
BEGIN
SELECT mean("value") AS "mean_value"
INTO "downsampled_data"
FROM "sensor_data"
GROUP BY time(1h), *
END
完整的实践示例
步骤1:启动 InfluxDB 容器
docker run -d --name influxdb \
-p 8086:8086 \
-v /docker_volume/influxdb/data:/var/lib/influxdb \
-e INFLUXDB_DB=mydatabase \
influxdb:1.8
步骤2:配置保留策略
-- 连接到 InfluxDB
docker exec -it influxdb influx
-- 创建数据库
CREATE DATABASE mydatabase
-- 创建保留策略:只保留24小时数据
CREATE RETENTION POLICY "one_day" ON "mydatabase" DURATION 24h REPLICATION 1 DEFAULT
-- 验证策略
SHOW RETENTION POLICIES ON mydatabase
输出应该类似:
name duration shardGroupDuration replicaN default
---- -------- ------------------ -------- -------
one_day 24h0m0s 1h0m0s 1 true
步骤3:插入测试数据并观察
-- 插入一些测试数据
INSERT sensor_data,device_id=123 value=25.4
INSERT sensor_data,device_id=123 value=26.1
INSERT sensor_data,device_id=123 value=24.8
-- 查询当前数据
SELECT * FROM sensor_data
-- 24小时后再次查询,旧数据会自动删除
SELECT * FROM sensor_data
更多实用的保留策略配置
1. 多级保留策略
-- 创建多级策略:原始数据保留7天,降采样数据保留365天
CREATE RETENTION POLICY "raw_data" ON "mydatabase" DURATION 7d REPLICATION 1 DEFAULT
CREATE RETENTION POLICY "downsampled_year" ON "mydatabase" DURATION 365d REPLICATION 1
-- 创建连续查询,将原始数据降采样到年策略
CREATE CONTINUOUS QUERY "cq_downsample_daily" ON "mydatabase"
BEGIN
SELECT mean("value") AS "mean_value"
INTO "mydatabase"."downsampled_year"."sensor_stats"
FROM "sensor_data"
GROUP BY time(1d), *
END
2. 基于磁盘空间的管理
虽然 InfluxDB 不直接支持按磁盘空间大小设置保留策略,但你可以通过监控来自动调整:
# 监控磁盘使用情况,动态调整保留策略
#!/bin/bash
DISK_USAGE=$(df /docker_volume/influxdb/data | awk 'NR==2{print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 90 ]; then
# 磁盘使用超过90%,缩短保留时间
influx -execute 'ALTER RETENTION POLICY "one_week_only" ON "mydatabase" DURATION 3d'
elif [ $DISK_USAGE -lt 60 ]; then
# 磁盘使用充足,恢复较长保留时间
influx -execute 'ALTER RETENTION POLICY "one_week_only" ON "mydatabase" DURATION 7d'
fi
关键参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
| DURATION | 数据保留时间 | 24h, 7d, 4w, 52w |
| REPLICATION | 副本数量(单机版为1) | 1 |
| SHARD DURATION | 分片时长(自动计算) | 1h, 1d, 7d |
| DEFAULT | 是否为默认策略 | DEFAULT |
时间单位参考
| 单位 | 含义 | 示例 |
|---|---|---|
h | 小时 | 24h |
d | 天 | 7d |
w | 周 | 4w |
inf | 无限期 | inf |
最佳实践
- 设置合适的分片时长:通常与保留时长匹配
- 监控磁盘使用:定期检查数据增长情况
- 使用连续查询:对历史数据进行降采样,节省空间
- 定期清理:虽然自动删除,但建议定期检查
-- 查看磁盘使用情况
SHOW STATS
-- 查看分片信息
SHOW SHARDS
-- 手动删除过期数据(通常不需要,自动进行)
DROP SHARD <shard_id>
总结
通过合理配置 保留策略(RP),InfluxDB 能够完全自动地:
- ✅ 保留指定时间范围内的数据
- ✅ 自动删除过期历史数据
- ✅ 循环往复地处理新数据插入和旧数据删除
- ✅ 无需人工干预,完全自动化运行
你只需要根据业务需求设置合适的 DURATION 参数,剩下的就交给 InfluxDB 自动处理了!
更多推荐
所有评论(0)