Yakstは、海外の役立つブログ記事などを人力で翻訳して公開するプロジェクトです。
約9年前投稿 修正あり

InfluxDBのContinuous Query その1

時系列データベースであるInfluxDBのユニークな機能のひとつに、継続的にデータを処理して保存するために使用するクエリーの一種であるContinuous Queryがある。これについて説明する3部作の第1弾は、Continuous Queryの概要と簡単な例を紹介する。

原文
Continuous Queries In InfluxDB - Part I | InfluxDB (English)
翻訳依頼者
D98ee74ffe0fafbdc83b23907dda3665 B5aa4f809000b9147289650532e83932
翻訳者
D98ee74ffe0fafbdc83b23907dda3665 doublemarket
翻訳レビュアー
B5aa4f809000b9147289650532e83932 taka-h
原著者への翻訳報告
未報告


合計や集約、あるいは計算したデータを返すクエリは、アプリケーション開発では頻繁に使われます。例えば、メトリクスをレポートするオンラインダッシュボードアプリケーションを開発しているなら、データを要約したものを表示する必要があるでしょう。大量のデータを処理する必要があったり、繰り返し実行するためスケールしないため、こういった要約クエリは一般的には計算コストが高くなります。そんな時、必要になったらすぐに取り出せるように要約済みのクエリの実行結果を事前に計算して保存しておければ、データベースに負荷をかけずにダッシュボードアプリケーションの要約クエリが劇的にスピードアップするでしょう。ここでInfluxDBのContinuous Query機能を使いましょう!

この記事は、InfluxDBのContinuous Queryを解説する3部作の1つ目です。今回は、Continuous Queryとは何かと、そのユースケースについて取り上げようと思います。その2では、Continuous Queryはどのように動いているのか内部を探り、最後のその3ではContinuous Queryの監視と管理の方法について説明する予定です。

それでは始めましょう。

InfluxDBのContinuous Query入門

RDBMSについて既に知っている人に説明すると、コストの高いクエリを要求がある度に実行する代わりに事前に処理して保存しておくという点で、Continuous Queryはマテリアライズドビューにコンセプトとしては非常に似ています。InfluxDBのContinuous Queryは他のいくつかのユースケースに対しても強力かつ便利で、これから書いていくように主にデータ分析の面で使い勝手を改善してくれます。

Continuous Queryでデータを効率的に見る

ダッシュボードアプリケーションでは、メトリクスのデータはグラフの形で表示されることが多いでしょう。通常、これらのメトリクスは間引きされて(downsampled)から表示されます。つまり、一定の時間感覚でデータをまとめるか、そのメトリクスのシリーズからN番目のデータを単に取り出すかのどちらかの処理が行われるということになります。

InfluxDBのContinuous Queryでは、アプリケーションのデータを間引きして、ユーザのエクスペリエンスを向上することができます。以下の図は、入力のグラフを間引きして10番目のデータを取って出力する例です。

Continuous Queryのグラフ例

以下のクエリを使うと、InfluxDBはCPUロードのメトリクスを間引きして、サーバのリージョンごとにグルーピングした15分おきの平均データポイントを保存します。

CREATE CONTINUOUS QUERY "downsampled_cpu_load"
ON database_name
BEGIN
  SELECT mean(value) as value,
  INTO "downsampled.cpu_load"
  FROM cpu_load
  GROUP BY time(15m), region
END

現在や直近の問題を見つけたり解決するには高解像度のデータは素晴らしいですが、データが古くなりそこまでの詳細さが必要なくなれば、データを間引きし解像度を下げる(日ごとあるいは週ごと)ためにContinuous Queryを使うことができます。

Continuous Queryでデータを効率的に解析する

データを間引きするのに加え、より効率的なアクセスのため、1つあるいは複数の独立したシリーズにContinuous Queryでデータを移動したり分離したりできます。また、時系列データを一定時間で「丸め」たいときにも便利です(5分、10分、15分のサービス時間の99パーセンタイルを得たい場合など)。

例として、Webサーバに来るHTTPリクエストをhttp_requestsシリーズに保存していて、既にそのシリーズに保存されたデータに対し、リクエストの処理時間の95パーセンタイルと平均を計算したいとしましょう。これは、以下のようなContinuous Queryで解決できます。

CREATE CONTINUOUS QUERY "transformed_http_requests"
ON database_name
BEGIN
    SELECT mean(duration) as mean,
    PERCENTILE(duration, 95.0) as p95
    FROM http_requests
    GROUP BY time(15m), http_status
END

次の例では、すべてのメジャメントからポイントを収集し、それを同じメジャメント名でpolicy1のリテンションポリシーをつけて書き込むため、Continuous QueryのFROM句に正規表現を使っています。

CREATE CONTINUOUS QUERY myquery ON testdb 
BEGIN 
    SELECT mean(value) INTO "policy1".:MEASUREMENT 
FROM /.*/ 
GROUP BY time(1h) 
END

アプリケーション内でContinuous Queryを使う

Continuous Queryを使い始めるには、サーバ上にContinuous Queryを作成する必要があります。InfluxDBのContinuous Queryは、CREATE CONTINUOUS QUERY文をクエリのエンドポイントとなるサーバで実行することで作成できます。

curlを使う場合、以下のようにして作成します。

curl -G 'http://localhost:8086/query' --data-urlencode 'q=CREATE CONTINUOUS QUERY ...'

ひとたび作成すると、Continuous Queryはクラスタのメタデータの一部として永続化され、データが収集されるたびに定期的に実行されます。

新しいContinuous Queryエンジン

InfluxDB v0.9では、リテンション、クラスタ、InfluxQL言語(訳注、InfluxDBでのSQLライクな言語)といった機能にアーキテクチャ上の大きな変更が加えられています。その結果、Continuous Queryエンジンもデザインし直す必要があり、書き直されたv0.9では以前のバージョン(v0.8)と比べて複数の変更点があります。その変更点は以下の表にまとめられています。

機能 v0.8.8 v0.9.4(最新)
クエリ内での展開(Fan-out queries) あり なし
過去データの埋め戻し(Backfilling) あり なし

まとめ

この記事では、Continuous Queryの概要のみを説明しました。Continuous Queryが内部的にどのように動いているのか、どのように管理するべきかを詳しく知りたいなら、その2、その3もお見逃しなく。

それまでの間、14日間無料のInfluxDBホスティングサービスに登録して、使い始めてみましょう!

Grafana

次の記事
オブジェクト指向プログラミングとは? : スティーブ・ジョブズの答え
前の記事
データのロストは発生するか?

Feed small 記事フィード

新着記事Twitterアカウント