如何通过配置为 InfluxDB 设置默认保留策略和持续时间

How to set default retention policy and duration for InfluxDB via configuration

我正在使用官方的 InfluxDB docker 图像。我想将保留策略默认设置为 14 days

我可以设置各种 ENV 变量来更改 InfluxDB 的配置,例如 INFLUXDB_RETENTION_POLICY。这需要保留策略的名称,例如 "default" 用作默认保留策略。

问题是此默认策略的持续时间为 7 天。我需要将其设置为 14 天。

文档很差。我找不到任何 ENV 变量来调整默认持续时间。我还可以将 INFLUXDB_RETENTION_POLICY 变量设置为不同保留策略的不同名称,但我不知道如何通过配置创建该保留策略。

有没有人知道: 1) 一种通过配置更改默认保留期限的方法 要么 2) 通过配置创建保留策略的方法

遗憾的是,无法通过配置设置默认保留策略。这样做的原因是通常保留策略持续时间是在数据库创建期间定义的。

CREATE DATABASE <database_name>
[WITH [DURATION <duration>] [REPLICATION <n>]
      [SHARD DURATION <duration>] [NAME <retention-policy-name>]]

如果允许用户通过配置设置默认保留期限,命令的结果

CREATE DATABASE mydb 

因实例而异。虽然这不一定有问题,但也不理想。

The problem is that this default policy has a duration of 7 days. I need to set it to 14 days.

InfluxDB 中的默认保留策略应该是无限的。

> CREATE DATABASE mydb
> SHOW RETENTION POLICIES ON mydb
name    duration shardGroupDuration replicaN default
----    -------- ------------------ -------- -------
autogen 0s       168h0m0s           1        true

这里我们看到保留策略的持续时间是 0s,这是无限的别名,分片组持续时间是 168h0m0s,即 7 天。

我认为这里的主要混淆点是比较常见的——而且主要是由于保留策略的命名不当。在 InfluxDB 中,数据库是保留策略的容器,保留策略是实际时间序列数据的容器。也就是说,保留策略与其说是一个策略,不如说是一个容器,它对它包含的所有数据都有一个策略。

我的建议是在 InfluxDB 中创建数据库时始终完全明确。这样做将始终保证您的数据库具有正确的保留策略持续时间。因此,要创建具有 14 天保留策略的数据库,您需要发出命令

CREATE DATABASE mydb WITH DURATION 14d

要回答来自 google 的那些使用现有数据库的问题(这是我的情况),可以通过三种方式设置保留策略:

  • 在新数据库上,使用数据库创建(如上所述)
  • 在创建保留策略时,在创建语句末尾添加 DEFAULT
  • 通过改变现有的保留策略成为数据库的默认策略(见下文)

正在创建数据库

CREATE DATABASE "NOAA_water_database" WITH DURATION 3d REPLICATION 1 SHARD DURATION 1h NAME "liquid"

正在创建策略

CREATE RETENTION POLICY "one_day_only" ON "NOAA_water_database" DURATION 1d REPLICATION 1

更新现有政策

ALTER RETENTION POLICY "what_is_time" ON "NOAA_water_database" DURATION 3w SHARD DURATION 2h DEFAULT

因此,对于您希望设为默认值的现有数据库和保留策略,最简单的解决方案是使用 alter retention policy。

关于 adding/updating 现有数据库政策的一点注意事项 - 政策到期前的数据将立即删除,因此您将丢失所有旧数据。

这里没有人真正回答这个问题。答案是您不能使用配置文件或环境变量创建保留策略。因此,为了自动化解决方案,您需要创建一个“K8s 作业”,将您的命令导入 influx CLI。

例如:

  • 首先创建此命令文件并将其包装到“db_init.txt”文件中:

    CREATE DATABASE 示例 CREATE RETENTION POLICY twoweeks ON 示例 持续时间 14d 复制 1 默认值

  • 其次,创建一个bash脚本将这个文件直接上传到Influx CLI:

    #!/usr/bin/env bash

    influx -import -path=/tmp/db-init.txt

将其包裹在图片中并将其作为作业上传 - 然后您就实现了自动化。

希望我能帮上一点忙。

无法通过配置为所有数据库 influxDB 设置保留策略。很可能是因为 retention policy 是一个包含实际压缩时间序列数据的容器。它是每个单独数据库的 属性。更改一个数据库的保留策略不会更改任何其他数据库的保留策略。

If a retention policy is deleted then all the data it contains will be deleted. But altering the retention policy will not delete any data.

所以这里有一个 bash 脚本来自动执行更改保留策略的任务

for db in $(influx -username $INFLUX_USERNAME -password $INFLUX_PASSWORD -execute="SHOW DATABASES"| grep <pattern_to_list_required_db>); do 
influx -username $INFLUX_USERNAME -password $INFLUX_PASSWORD -execute="ALTER RETENTION POLICY \"autogen\" ON \"$db\" DURATION 14d"
influx -username $INFLUX_USERNAME -password $INFLUX_PASSWORD -database="$db" -execute="SHOW RETENTION POLICIES"
done

事实上,提到的更改influxdb保留策略的环境变量不起作用,例如hub.docker. That's why this issue中提到的DOCKER_INFLUXDB_INIT_RETENTION自2018年至今开放。

尽管如此,我使用 .iql 文件来设置保留策略,该策略应位于容器内的目录 /docker-entrypoint-initdb.d/ 中,内容如下:

setretention.iql:

CREATE RETENTION POLICY "two_hours" ON "metrics" DURATION 2h REPLICATION 1 SHARD DURATION 1h DEFAULT

实际上,我在 metrics 数据库上创建了一个名为 two_years 的新保留策略,持续时间为 2h,并且提到的其他东西。因此,其 docker 命令如下:

docker run --rm -d --name influxdb \
    -e INFLUXDB_REPORTING_DISABLED=true \
    -e INFLUXDB_DB=metrics \
    -e INFLUXDB_USER=retention_test \
    -e INFLUXDB_USER_PASSWORD=testing123! \
    -v ./setretention.iql:/docker-entrypointinitdb.d/setretention.iql \
    influxdb:1.7.11

要检查:

$ docker exec -it influxdb influx
> show retention policies on metrics

name      duration shardGroupDuration replicaN default
----      -------- ------------------ -------- -------
autogen   0s       168h0m0s           1        false
two_hours 2h0m0s   1h0m0s             1        true


[注意]:

  • 请记住,请按照 this table 为相关 retention policy duration 以及 shard group duration 选择正确的值。

[2022 年 4 月更新]

显然,由于此批准 pull request,您可以直接使用提到的 .iql 查询作为从 influxdb 1.9 开始的环境。