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,細粒度的數據主要用於及時排查問題,粗粒度的數據在於查看變化趨勢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM