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
SchemaSchema-on-WriteSchema-on-Read

这种设计的好处

  1. 灵活性:适应不断变化的数据源
  2. 易用性:无需预先设计复杂的表结构
  3. 扩展性:轻松添加新的监控指标
  4. 稀疏数据友好:适合传感器等可能缺失数据的情况

注意事项

虽然动态字段很灵活,但也需要注意:

  1. 查询复杂性:需要处理可能为null的字段
  2. 存储效率:过多的不同字段组合可能影响性能
  3. 数据一致性:需要确保业务逻辑能处理字段变化
-- 使用条件函数处理可能不存在的字段
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

最佳实践

  1. 设置合适的分片时长:通常与保留时长匹配
  2. 监控磁盘使用:定期检查数据增长情况
  3. 使用连续查询:对历史数据进行降采样,节省空间
  4. 定期清理:虽然自动删除,但建议定期检查
-- 查看磁盘使用情况
SHOW STATS

-- 查看分片信息
SHOW SHARDS

-- 手动删除过期数据(通常不需要,自动进行)
DROP SHARD <shard_id>

总结

通过合理配置 保留策略(RP),InfluxDB 能够完全自动地:

  1. ✅ 保留指定时间范围内的数据
  2. ✅ 自动删除过期历史数据
  3. ✅ 循环往复地处理新数据插入和旧数据删除
  4. ✅ 无需人工干预,完全自动化运行

你只需要根据业务需求设置合适的 DURATION 参数,剩下的就交给 InfluxDB 自动处理了!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐