InfluxDB 连续查询和保留策略

FreeGuideOnline 最新 2026-07-12

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() - 5mnow() 之间的数据,计算 mean 并写入 cpu_5m

3.4 高级示例:多步下采样与跨保留策略

结合保留策略,我们可以创建一套数据降精度流水线:

  1. 原始数据存入默认 RP(保留 7 天)。
  2. 第一个 CQ 将原始数据聚合成 5 分钟数据,存入 RP rp_30d(保留 30 天)。
  3. 第二个 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 管理连续查询

  • 查看所有 CQSHOW CONTINUOUS QUERIES
  • 删除 CQDROP CONTINUOUS QUERY "cq_name" ON "database_name"
  • 查看 CQ 定义SHOW CONTINUOUS QUERIES 会列出完整语句。
  • 修改:没有直接修改命令,需先 DROPCREATE

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