合計や集約、あるいは計算したデータを返すクエリは、アプリケーション開発では頻繁に使われます。例えば、メトリクスをレポートするオンラインダッシュボードアプリケーションを開発しているなら、データを要約したものを表示する必要があるでしょう。大量のデータを処理する必要があったり、繰り返し実行するためスケールしないため、こういった要約クエリは一般的には計算コストが高くなります。そんな時、必要になったらすぐに取り出せるように要約済みのクエリの実行結果を事前に計算して保存しておければ、データベースに負荷をかけずにダッシュボードアプリケーションの要約クエリが劇的にスピードアップするでしょう。ここで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番目のデータを取って出力する例です。
以下のクエリを使うと、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ホスティングサービスに登録して、使い始めてみましょう!