アルパカログ

Webエンジニアでマネージャーな人がプログラミングやマネジメントの話題を中心に書いているブログです。

InfluxDB データのダウンサンプリング設定方法(CQ/RP)

f:id:otoyo0122:20200803154128p:plain:w300

時系列データを保存していくと、いつかはストレージがいっぱいになってしまいます。

InfluxDBでは、一定期間が過ぎたときにデータの解像度を落として(ダウンサンプリング)保持することができます。

このエントリでは、ダウンサンプリングしてデータを保持するための2つの機能「Continuous Query(CQ)」と「Retention Policy(RP)」の設定方法を説明します。

Continuous QueryとRetention Policy

Continuous Query(CQ)は定期的に自動実行するクエリです。

Retention Policy(RP)は保持期間を持つデータ構造です。

使い方は次のようなイメージです。

  1. 短期用RP、長期用RPのように保持期間ごとにRPを作成しておく
  2. 最初に短期用RPにデータを保存する
  3. 短期用RPで期限が来たデータに対し、CQを使ってダウンサンプリングし長期用RPに保存する

それでは実際に公式ドキュメントを参考に試してみましょう。

docs.influxdata.com

RPの作成

まずDBを作成します。

CREATE DATABASE "food_data"

次に、DBに対してデフォルトのRPを保持期間1時間で作成します。

> CREATE RETENTION POLICY "one_hour" ON "food_data" DURATION 1h REPLICATION 1 DEFAULT

RPにはDEFAULTを設定することができます。

DB内に存在する全てのmeasurementsのデータ保持期間はデフォルトのRPになります。

明示的にデフォルトRPを設定しない場合は、自動生成された無期限のRPになっています (autogen という名前のRP)。

REPLICATION 1はシングルノードインスタンスのとき必須のパラメータになります。

サンプルデータとしてfood_dataに適当なordersを作成しておきます。

ordersにはデフォルトのRPであるone_hourが適用されます。

> INSERT orders,phone=10 website=30
> INSERT orders,phone=12 website=39
> INSERT orders,phone=11 website=56

> SELECT * FROM orders
name: orders
time                phone website
----                ----- -------
1557546012214138700 10    30
1557546027823595200 12    39
1557546035939292400 11    56

さらに、ダウンサンプリング後のデータを保存する保持期間1年(52週)のRPも作成しておきましょう。

> CREATE RETENTION POLICY "a_year" ON "food_data" DURATION 52w REPLICATION 1

CQの作成

food_data.ordersを30分ごとにまとめ、RP a_yeardown_sampled_ordersに保存するCQを作成します。

現行のCLIツールではクエリ内の改行がサポートされていないので注意が必要です。

> CREATE CONTINUOUS QUERY "cq_30m" ON "food_data" BEGIN
  SELECT mean("website") AS "mean_website",mean("phone") AS "mean_phone"
  INTO "a_year"."downsampled_orders"
  FROM "orders"
  GROUP BY time(30m)
END

30分以上待ってからa_year.downsampled_ordersを見ると、データがダウンサンプリングされていることがわかります。

ここではタイムスタンプのフォーマットを見やすくするためにprecision rfc3339としています。

> precision rfc3339
> select * from a_year.downsampled_orders
name: downsampled_orders
time                 mean_website
----                 ------------
2019-05-11T03:30:00Z 41.666666666666664
2019-05-11T04:00:00Z 60
2019-05-11T04:30:00Z 53

さらに、期限を過ぎたデータが削除されていることも確認しておきましょう。

期限の切れたデータは1時間ちょうどで削除されるわけではなく、チェックのタイミングで削除されます。

> SELECT * FROM one_hour.orders
name: orders
time                         phone website
----                         ----- -------
2019-05-11T04:18:35.2291329Z 13    60
2019-05-11T04:57:23.267411Z  14    53

設定したRPとCQは下記のようにして確認します。

> SHOW RETENTION POLICIES ON "food_data"

> SHOW CONTINUOUS QUERIES

以上です。参考になった方は、ぜひ「はてブ」やSNSでシェアしていただけると嬉しいです。

InfluxDBの紹介を見る

InfluxDBの紹介を見たい方には下記の記事が参考になると思います。

alpacat.hatenablog.com