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的目的
- 利用CQ可以達到數據降准的目的,即將細粒度的數據轉換為粗粒度的數據,例如1m維度的數據可以聚合為5m數據
- 不同粒度的數據可以設置不同的RP,節省存儲空間。例如1m維度的數據可以保存7d,而5m維度的數據則可以保存30d,細粒度的數據主要用於及時排查問題,粗粒度的數據在於查看變化趨勢。