代码改变世界
[登录 · 注册]
  • InfluxDB的RP与CQ
  • Retention Policy

    RP表示数据保留策略,策略包含数据保留时长,备份个数等信息。InfluxDB为每个database默认创建了一个默认的RP,名称为autogen,默认数据保留时间为永久。

    查看RP

    show retention policies
    

    新建RP

    CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
    
    name example
    duration 表示数据保留时间,最长为INF,最短为1h
    replication 备份数,在集群模式中可用
    shard duration 一个分片包含的时间,InfluxDB会根据duration设置默认的shard duration
    default 表示该RP为默认的RP

    新建一个RP,保留时间为1d

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

    修改RP

    ALTER RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> SHARD DURATION <duration> DEFAULT
    

    删除RP

    DROP RETENTION POLICY <retention_policy_name> ON <database_name>
    

    RP使用

    在查询或者插入数据时,需要指定RP,若不指定,则认为选择了默认的RP

    select sum(value) from "rp_1h".test_me where time > now() - 6h;
    

    假设默认RP为autogen,则

    select sum(value) from test_me where time > now() - 6h;
    

    === 两条语句等价

    select sum(value) from "autogen".test_me where time > now() - 6h;

    Continue Query

    InfluxDB提供了自动聚合数据,并将聚合数据存储至measurement的方法,即continue query

    基础用法

    CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
    BEGIN
      <cq_query>
    END            
    

    其中cq_query表示聚合语句,

    SELECT <function[s]> INTO <destination_measurement> FROM <measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>]
    

    cq_query的where条件中不需要设置时间区间,inflxuDB会自动生成时间区间

    influxDB根据cq_query中的Group By time(interval)的interval,每隔interval执行一次cq_query,而查询的时间区间也为interval。例如当前时间为17:00,interval为1h,则cq_query会查询16:00至16:59分的数据。

    生成一条CQ如下,则每隔1h执行一次query

    CREATE CONTINUOUS QUERY "cq_basic" ON "transportation"
    BEGIN
      SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
    END
    

    在8:00,时间区间为[7:00,8:00)

    在9:00,时间区间为[8:00,9:00)

    根据CQ的特性,可以进行数据降准,例如将维度为1m的数据聚合为5m,measurement_1m存储维度为1m的数据,cq每隔5m对数据进行聚合,并将聚合的数据存储到rp_5m.measurement_5m中,此时维度变成了5m

    CREATE CONTINUOUS QUERY "cq_basic_5m" ON "test_database"
    BEGIN
      SELECT mean(*) INTO "rp_5m"."measurement_5m" 
      FROM "rp_1m"."measurement_1m"
      GROUP BY time(5m),*
    END    
    

    时间偏移

    CREATE CONTINUOUS QUERY "cq_basic_offset" ON "transportation"
    BEGIN
      SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h,15m)
    END
    

    group by time(1h) 与 group by time(1h,15m)的区别

    group by time(1h)的执行时间点和时间区间

    time range
    8:00 [7:00,8:00)
    9:00 [8:00,9:00)

    group by time(1h, 15m)的执行时间点和时间区间

    time range
    8:15 [7:15,8:15)
    9:15 [8:15,9:15)

    高级用法

    CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
    RESAMPLE EVERY <interval> FOR <interval>
    BEGIN
      <cq_query>
    END    
    

    其中EVERY表示执行间隔,即每隔多久执行一次,FOR表示时间区间,即每次执行查询多久的数据,区间为[now - for_interval, now)

    EVERY=30m,GROUP BY time(1h)

    CREATE CONTINUOUS QUERY "cq_advanced_every" ON "transportation"
    RESAMPLE EVERY 30m
    BEGIN
      SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
    END
    
    time range 返回time
    8:00 [7:00,8:00) 7:00
    8:30 [7:00,8:00) 7:00
    9:00 [8:00,9:00) 8:00

    可以看到区间[7:00,8:00)的数据被查询了两次,后一次的数据会覆盖前一次的查询

    FOR=1h,GROUP BY time(30m)

    CREATE CONTINUOUS QUERY "cq_advanced_for" ON "transportation"
    RESAMPLE FOR 1h
    BEGIN
      SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(30m)
    END
    
    time range 返回time
    8:00 [7:00,8:00) 7:00
    7:30
    8:30 [7:30,8:30) 7:30
    8:00
    9:00 [8:00,9:00) 8:00
    8:30

    每次查询都会返回两条数据,每个时间点的数据都被计算了两次,这样在一定程度可以避免数据延迟而导致CQ数据丢失的情况。

    EVERY=1h,FOR=90m,GROUP BY time(30m)

    CREATE CONTINUOUS QUERY "cq_advanced_every_for" ON "transportation"
    RESAMPLE EVERY 1h FOR 90m
    BEGIN
      SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(30m)
    END
    
    time range 返回time
    8:00 [6:30,8:00) 6:30
    7:00
    7:30
    9:00 [7:30,9:00) 7:30
    8:00
    8:30

    FOR interval必须大于GROUP by time(interval)以及EVERY interval,否则InfluxDB会返回如下错误,因为这样会造成数据丢失

    error parsing query: FOR duration must be >= GROUP BY time duration: must be a minimum of <minimum-allowable-interval> got <user-specified-interval>
    

    CQ管理

    查看CQ

    SHOW CONTINUOUS QUERIES
    

    删除CQ

    DROP CONTINUOUS QUERY <cq_name> ON <database_name>
    

    修改CQ

    CQ不能被修改,如果需要需改,只能先删除CQ,在重新创建CQ

    使用CQ与RP的目的

    1. 利用CQ可以达到数据降准的目的,即将细粒度的数据转换为粗粒度的数据,例如1m维度的数据可以聚合为5m数据
    2. 不同粒度的数据可以设置不同的RP,节省存储空间。例如1m维度的数据可以保存7d,而5m维度的数据则可以保存30d,细粒度的数据主要用于及时排查问题,粗粒度的数据在于查看变化趋势。
  • 【推广】 阿里云小站-上云优惠聚集地(新老客户同享)更有每天限时秒杀!
    【推广】 云服务器低至0.95折 1核2G ECS云服务器8.1元/月
    【推广】 阿里云老用户升级四重礼遇享6.5折限时折扣!
  • 原文:https://www.cnblogs.com/owenzh/p/13826805.html
Copyright 2008-2020 晋ICP备12007731号-1