Elastic TSDS の Downsampling 機能を試してみた

Tech Blog header: laptop keyboard, notebook, pencil, coffee cup and plant with bold white title text overlay. BLOG

1. はじめに

Elastic Stackの比較的新しい機能として、TSDS (Time Series Data Stream) に対する Downsampling(ダウンサンプリング) がサポートされています。

これは、例えば「1秒ごとに収集された高頻度なメトリクス」を「1分ごと、あるいは1日ごとの統計値」へと自動的に集計・集約することで、データ量を劇的に削減し、長期保存データのクエリを高速化するための機能です。

今回は、この Downsampling 機能が実際にどのように動作し、どれほどの効果があるのかを検証してみました。

2. 検証環境

今回の検証は、以下の環境で行いました。

  • Elastic Stack: v9.4.2 (Self-Managed, Trial License)
  • 収集データ: Elastic を動作させている Windows ホストのパフォーマンスメトリクス(OpenTelemetry Collector経由)

3. Downsampling の設定方法

Downsampling の実行方法はいくつかありますが、今回は最も実用的な Index Lifecycle Management (ILM) のポリシー内に組み込む方法を採用しました。

  • ILMポリシー名: metric-otel-ilm-policy
  • フェーズ遷移:
    • Hotフェーズ: データのインジェストと直近データの保持
    • Coldフェーズ: 移行タイミングで Downsampling を実行
      • Downsampling interval: 1 days (1日粒度に集約)

※参考画面

💡 ※注意: 今回の 1 days という設定値は、検証結果(変化)をわかりやすく確認するための極端な設定です。本番環境での推奨値ではありません。

4. Downsampling の実行と容量削減効果

設定後、データがある程度蓄積され、インデックスが Rollover して Cold フェーズへ移行するのを待ちました。

Cold フェーズ移行前後のデータ量の変化は以下の通りです。

ステータスドキュメント数インデックスサイズ
Rollover 直前 (Hotフェーズ)約 650,000 件約 20 MB
Cold フェーズ移行後 (Downsampling 適用後)5,865 件1.14 MB

インデックスサイズが約20分の1、ドキュメント数にいたっては約110分の1にまで圧縮されており、期待通りの強力なデータ削減効果が確認できました。

(※注 メトリクスは24時間取得していたわけではありません。24時間取得し続けていたら、もっと大きな圧縮率になっていたと思われます。)

※Cold フェーズ移行後の参考画面

(※Rollover 直前のデータ量に関するスクリーンショットは取り損ねてしまいました。)

5. ES|QL(TSコマンド)によるデータ確認と注意点

Kibana の Discover から、ES|QL の TS コマンドを使用して、格納されたデータを集計してみます。

TS metrics-hostmetricsreceiver.otel-default*
| WHERE state == "free" or state == "used"
| STATS mem = AVG(metrics.system.memory.usage) BY TBUCKET(1h), state
| KEEP `TBUCKET(1h)`, mem, state
| SORT `TBUCKET(1h)` desc, state

※参考画面

クエリ結果の考察

出力された結果(一部抜粋)を確認すると、Downsampling の仕様が顕著に現れた挙動を示していました。

TBUCKET(1h)memstateデータの特徴
Jun 12, 2026 @ 11:00:00.00011,889,684,480free(*1)
Jun 12, 2026 @ 11:00:00.00021,892,382,720used(*1)
Jun 12, 2026 @ 10:00:00.00011,387,027,456free(*1)
Jun 12, 2026 @ 10:00:00.00022,395,039,744used(*1)
Jun 9, 2026 @ 09:00:00.00012,531,630,920.205free(*2)
Jun 9, 2026 @ 09:00:00.00021,250,436,279.795used(*2)
Jun 8, 2026 @ 09:00:00.00014,159,069,970.101free(*2)
Jun 8, 2026 @ 09:00:00.00019,622,997,229.899used(*2)
Jun 7, 2026 @ 09:00:00.0007,128,812,202.667free(*2)
Jun 7, 2026 @ 09:00:00.00026,653,254,997.333used(*2)

(*1) 直近データ(未圧縮)、1時間単位で取得可能

(*2) Downsampling 適用済み(1日1バケットのみ出力)

クエリでは TBUCKET(1h)(1時間ごと)の集計を要求しているにもかかわらず、Cold Tier に格納されている過去データ(Jun 9 以前)は「1日(24時間)に1データ」しか返ってきていません。

これは、Downsampling によってデータがすでに 1 days の粒度に丸められ、それより細かい時間軸のデータが消失しているためです(内部的に事前集計された代表値のみが残るため)。クエリ側でどれだけ細かいバケットを指定しても、保持されている最小粒度(今回は1日)でしか結果を得られないという特性がよくわかります。

検証用のデータのためクエリの速度向上までは測定できていませんが、集計対象のデータ量が劇的に少なくなっているため、理論上は従来よりも大幅な速度向上が見込めます。

6. まとめ

今回、Elastic TSDS の Downsampling 機能を検証し、以下のことが分かりました。

  • 圧倒的なストレージ削減効果
    • ドキュメント数やデータサイズを劇的に削減できるため、長期的なトレンド分析用のインデックスにおいて非常に有効です。
  • データ粒度とのトレードオフ
    • 今回の検証結果が示す通り、Downsampling を適用した期間のデータは、指定したインターバルより詳細な分析(例:瞬間的なスパイクの検知など)ができなくなります。

実運用においては、

  • 直近のトラブルシューティング用に、Hot フェーズでは生データを数週間保持する。
  • それ以降の長期的なキャパシティプランニング用に、Warm/Cold フェーズで1時間〜1日粒度へDownsampling する。

といった、要件に合わせたメリハリのあるILMポリシーの設計が重要になりそうです。

7. 参考URL