InfluxDB 连续查询和保留策略
name: autogen duration: 0s (即 INF) shardGroupDuration: 168h0m0s replicaN: 1 default: true
这意味着如果你不主动管理,数据将永久保留。
#### 2.3 创建保留策略
使用 `CREATE RETENTION POLICY` 命令。例如,创建一个名为 `rp_7d`、保留 7 天的策略,并设为默认:
```sql
CREATE RETENTION POLICY "rp_7d" ON "mydb" DURATION 7d REPLICATION 1 DEFAULT
mydb:目标数据库。- 如果不需要设为默认,可去掉
DEFAULT。
创建一个保留 1 年但非默认的策略:
CREATE RETENTION POLICY "rp_1y" ON "mydb" DURATION 52w REPLICATION 1
2.4 修改保留策略
你可以修改保留时长、副本数或默认状态:
ALTER RETENTION POLICY "rp_7d" ON "mydb" DURATION 10d
ALTER RETENTION POLICY "rp_7d" ON "mydb" DEFAULT
2.5 查看与删除
查看某个数据库的所有保留策略:
SHOW RETENTION POLICIES ON "mydb"
删除一个保留策略(必须先确保没有测量依赖它):
DROP RETENTION POLICY "rp_7d" ON "mydb"
2.6 数据写入如何选择保留策略?
- 默认写入:插入数据时不指定 RP,则写入数据库的
DEFAULT策略。 - 指定写入:使用完全限定测量名
"rp_name"."measurement_name"写入特定策略。
-- 写入默认策略
INSERT cpu,host=serverA value=0.64
-- 写入特定策略 rp_1y
INSERT "rp_1y".cpu,host=serverA value=0.64
3. 连续查询 (Continuous Query, CQ)
3.1 什么是连续查询?
连续查询是 InfluxDB 内部按固定时间间隔自动执行的 InfluxQL 语句,常用于预计算并下采样数据。你可以把它看作一个内置的定时 ETL 任务。结果会写入同一个数据库的不同测量,或不同保留策略中。
典型场景:
- 每分钟将原始秒级数据聚合成 5 分钟均值。
- 每小时将 5 分钟数据聚合成小时均值,并存入长期保留策略。
- 定期删除不需要的维度过细的数据。
3.2 连续查询基本语法
CREATE CONTINUOUS QUERY "cq_name" ON "database_name"
BEGIN
SELECT function_list
INTO target_measurement
FROM source_measurement
WHERE time_filter
GROUP BY time(interval), tags
END
关键部分解释:
cq_name:名称,在同一数据库内唯一。database_name:CQ 所属数据库。SELECT ... INTO:查询结果写入target_measurement。可以指定 RP,如"rp_downsampled"."hourly_cpu"。GROUP BY time(interval):必填,定义聚合窗口。数据按该窗口执行函数。- 时间过滤:CQ 的实际执行会覆盖最近的一个或多个时间窗口,无需手动添加
WHERE time > ...。InfluxDB 会根据执行间隔自动补全最近时间段。
3.3 创建第一个连续查询
假设原始测量 cpu_raw(秒级写入),我们希望每 5 分钟自动计算平均使用率,存入新的测量 cpu_5m。
CREATE CONTINUOUS QUERY "cq_cpu_5m" ON "mydb"
BEGIN
SELECT mean("usage") AS "mean_usage"
INTO "cpu_5m"
FROM "cpu_raw"
GROUP BY time(5m), host
END
- 执行间隔由
GROUP BY time(5m)自动指定为 5 分钟。 - 每 5 分钟,CQ 会运行一次,覆盖
now() - 5m至now()之间的数据,计算mean并写入cpu_5m。
3.4 高级示例:多步下采样与跨保留策略
结合保留策略,我们可以创建一套数据降精度流水线:
- 原始数据存入默认 RP(保留 7 天)。
- 第一个 CQ 将原始数据聚合成 5 分钟数据,存入 RP
rp_30d(保留 30 天)。 - 第二个 CQ 基于 5 分钟数据再聚合成 1 小时数据,存入 RP
rp_1y(保留 1 年)。
步骤 1:创建保留策略
CREATE RETENTION POLICY "rp_30d" ON "mydb" DURATION 30d REPLICATION 1
CREATE RETENTION POLICY "rp_1y" ON "mydb" DURATION 52w REPLICATION 1
步骤 2:创建第一个 CQ(原始 → 5 分钟)
CREATE CONTINUOUS QUERY "cq_raw_5m" ON "mydb"
BEGIN
SELECT mean("value") AS "value"
INTO "rp_30d"."cpu_5m"
FROM "cpu"
GROUP BY time(5m), host
END
步骤 3:创建第二个 CQ(5 分钟 → 1 小时)
CREATE CONTINUOUS QUERY "cq_5m_1h" ON "mydb"
BEGIN
SELECT mean("value") AS "value"
INTO "rp_1y"."cpu_1h"
FROM "rp_30d"."cpu_5m"
GROUP BY time(1h), host
END
注意第二个 CQ 的来源是 "rp_30d"."cpu_5m",即直接从上一步聚合数据中读取,避免扫描原始数据,极大提升效率。
3.5 管理连续查询
- 查看所有 CQ:
SHOW CONTINUOUS QUERIES - 删除 CQ:
DROP CONTINUOUS QUERY "cq_name" ON "database_name" - 查看 CQ 定义:
SHOW CONTINUOUS QUERIES会列出完整语句。 - 修改:没有直接修改命令,需先
DROP再CREATE。
4. 保留策略与连续查询的协同效应
这两个特性结合可以自动实现:
- 高精度数据短期保留:默认 RP 保留 7 天,到期自动删除。
- 低精度数据长期保留:通过 CQ 下采样到长保留策略(如 1 年),趋势查询直接命中预聚合结果。
- 动态时间范围查询:使用 InfluxQL 的混合来源查询,你甚至不需要关心数据存在哪个 RP,只需查询完全限定名称即可。
例如,查询 90 天趋势直接读 1 小时聚合:
SELECT mean("value") FROM "rp_1y"."cpu_1h" WHERE time > now() - 90d GROUP BY time(1d)
5. 常见问题与最佳实践
5.1 CQ 执行时机与回填
- CQ 只处理创建后到达的数据,不会回填历史数据。如果需要聚合已有数据,必须使用
INTO语句手动执行一次。SELECT mean("usage") INTO "cpu_5m" FROM "cpu" GROUP BY time(5m), host WHERE time < now() - 5m
5.2 CQ 的延迟与数据丢失
CQ 在窗口边界触发,但实际执行可能稍有延迟。如果写入与 CQ 执行有竞争,可能出现少量数据被遗漏在下一次窗口。建议:写入和查询容忍至少一个执行间隔的延迟。
5.3 保留策略的删除行为
保留策略按 DURATION 过期数据,但不是每条记录立即消失。实际删除由分片级操作完成,可能稍滞后。数据一旦过期将不可查询。
5.4 避免 CQ 递归
一个 CQ 不能引用自己写入的目标测量,否则会造成写放大。下采样链条中,每个 CQ 应写入不同的目标测量或保留策略。
5.5 标签(Tags)的保留
GROUP BY 中指定的标签会自动保留到目标测量。如果需要新增或排除标签,请在 SELECT 中显式处理。例如:
CREATE CONTINUOUS QUERY "cq_drop_region" ON "mydb"
BEGIN
SELECT mean("value") INTO "cpu_no_region" FROM "cpu"
GROUP BY time(5m), host
END