時系列データストリーム (TSDS)

時系列データストリーム (TSDS) は、タイムスタンプ付きのメトリクスデータを1つ以上の時系列としてモデル化します。

TSDSを使用すると、メトリクスデータをより効率的に保存できます。私たちのベンチマークでは、TSDSに保存されたメトリクスデータは、通常のデータストリームよりも70%少ないディスクスペースを使用しました。正確な影響はデータセットによって異なります。

TSDSを使用するタイミング

通常のデータストリームとTSDSの両方が、タイムスタンプ付きのメトリクスデータを保存できます。通常、リアルタイムに近い形でElasticsearchにメトリクスデータを追加する場合にのみ、TSDSを使用してください。

TSDSはメトリクスデータ専用です。ログやトレースなどの他のタイムスタンプ付きデータには、通常のデータストリームを使用してください。

通常のデータストリームとの違い

TSDSは、いくつかの重要な違いを持つ通常のデータストリームのように機能します:

  • TSDSに対する一致するインデックステンプレートは、index.mode: time_seriesオプションを持つdata_streamオブジェクトを必要とします。このオプションは、ほとんどのTSDS関連機能を有効にします。
  • @timestampに加えて、TSDS内の各ドキュメントは1つ以上の次元フィールドを含む必要があります。TSDSに対する一致するインデックステンプレートは、少なくとも1つのkeyword次元のマッピングを含む必要があります。
    TSDSドキュメントは通常、1つ以上のメトリックフィールドも含みます。
  • Elasticsearchは、TSDS内の各ドキュメントに対して隠れた_tsidメタデータフィールドを生成します。
  • TSDSは、同じ期間のデータを同じバックインデックスに保存するために時間制約付きバックインデックスを使用します。
  • TSDSに対する一致するインデックステンプレートは、index.routing_pathインデックス設定を含む必要があります。TSDSは、この設定を使用して次元ベースのルーティングを実行します。
  • TSDSは、内部インデックスソートを使用して、シャードセグメントを_tsid@timestampで順序付けます。
  • TSDSドキュメントは、自動生成されたドキュメント_id値のみをサポートします。TSDSドキュメントにおいて、ドキュメント_idはドキュメントの次元と@timestampのハッシュです。TSDSはカスタムドキュメント_id値をサポートしていません。
  • TSDSは合成_sourceを使用し、その結果、_sourceフィールドに適用されるいくつかの制限変更の影響を受けます。

時系列インデックスは、次元やメトリック以外のフィールドを含むことができます。

時系列とは何ですか?

時系列は、特定のエンティティに対する観察のシーケンスです。これらの観察を合わせることで、時間の経過に伴うエンティティの変化を追跡できます。たとえば、時系列は次のものを追跡できます:

  • コンピュータのCPUおよびディスク使用率
  • 株価
  • 天気センサーからの温度および湿度の読み取り値。

時系列チャート

図3. グラフとしてプロットされた天気センサーの読み取り値の時系列

TSDSでは、各Elasticsearchドキュメントが特定の時系列における観察またはデータポイントを表します。TSDSは複数の時系列を含むことができますが、ドキュメントは1つの時系列にのみ属することができます。時系列は複数のデータストリームにまたがることはできません。

次元

次元は、組み合わせてドキュメントの時系列を特定するフィールド名と値です。ほとんどの場合、次元は測定しているエンティティのいくつかの側面を説明します。たとえば、同じ天気センサーに関連するドキュメントは、常に同じsensor_idおよびlocation値を持つ場合があります。

TSDSドキュメントは、その時系列とタイムスタンプによって一意に識別され、これらはドキュメント_idを生成するために使用されます。したがって、同じ次元と同じタイムスタンプを持つ2つのドキュメントは重複と見なされます。_bulkエンドポイントを使用してドキュメントをTSDSに追加する場合、同じタイムスタンプと次元を持つ2番目のドキュメントが最初のドキュメントを上書きします。PUT /<target>/_create/<_id>形式を使用して個別のドキュメントを追加し、同じ_idを持つドキュメントがすでに存在する場合、エラーが生成されます。

フィールドを次元としてマークするには、ブール値time_series_dimensionマッピングパラメータを使用します。次のフィールドタイプはtime_series_dimensionパラメータをサポートします:

フラット化されたフィールドの場合、time_series_dimensionsパラメータを使用してフィールドの配列を次元として構成します。詳細については、flattenedを参照してください。

メトリック

メトリックは、数値測定を含むフィールドであり、これらの測定に基づく集計および/またはダウンサンプリング値も含まれます。必須ではありませんが、TSDS内のドキュメントは通常、1つ以上のメトリックフィールドを含みます。

メトリックは、次元とは異なり、次元は一般的に一定であるのに対し、メトリックは時間の経過とともに変化することが期待されます。たとえそれがまれであっても、またはゆっくりと変化する場合でも。

フィールドをメトリックとしてマークするには、time_series_metricマッピングパラメータを使用してメトリックタイプを指定する必要があります。次のフィールドタイプはtime_series_metricパラメータをサポートします:

受け入れられるメトリックタイプはフィールドタイプに基づいて異なります:

  1. - `````counter
  • 単調に増加するか、0(ゼロ)にリセットされる累積メトリック。たとえば、エラーや完了したタスクのカウント。
    カウンターフィールドは、累積カウンターを表すため、追加の意味を持ちます。これは、累積的に単調に増加するカウンターからレートを導出できるため、rate集計とよく機能します。ただし、いくつかの集計(たとえばsum)は、カウンターフィールドの累積的な性質のために意味をなさない結果を計算します。
    数値およびaggregate_metric_doubleフィールドのみがcounterメトリックタイプをサポートします。

カウンターフィールドの累積的な性質のため、次の集計はサポートされ、counterフィールドで意味のある結果を提供することが期待されます:ratehistogramrangeminmaxtop_metricsおよびvariable_width_histogram。既存の統合やカスタムダッシュボードとの問題を防ぐために、カウンターに対して結果が意味をなさない場合でも、次の集計を許可します:avgbox plotcardinalityextended statsmedian absolute deviationpercentile rankspercentilesstatssumおよびvalue count

  • gauge
  • 任意に増加または減少することができる単一の数値を表すメトリック。たとえば、温度や利用可能なディスクスペース。
    数値およびaggregate_metric_doubleフィールドのみがgaugeメトリックタイプをサポートします。

  • null(デフォルト)

  • 時系列メトリックではありません。

時系列モード

TSDSに対する一致するインデックステンプレートは、data_streamオブジェクトをindex_mode: time_seriesオプションとともに含む必要があります。このオプションは、TSDSがindex.mode設定のtime_seriesを持つバックインデックスを作成することを保証します。この設定は、バックインデックス内のほとんどのTSDS関連機能を有効にします。

既存のデータストリームをTSDSに変換する場合、変換後に作成されたバックインデックスのみがindex.modetime_seriesに持ちます。既存のバックインデックスのindex.modeを変更することはできません。

_tsidメタデータフィールド

TSDSにドキュメントを追加すると、Elasticsearchは自動的にドキュメントのために_tsidメタデータフィールドを生成します。_tsidは、ドキュメントの次元を含むオブジェクトです。同じTSDS内の同じ_tsidを持つドキュメントは、同じ時系列の一部です。

  1. `````_tsid`````フィールドの形式は信頼できません。バージョンごとに変更される可能性があります。
  2. ### 時間制約付きインデックス
  3. TSDSでは、最新のバックインデックスを含む各バックインデックスには、受け入れられる`````@timestamp`````値の範囲があります。この範囲は、[`````index.time_series.start_time`````](94b83a10d7b2bd96.md#index-time-series-start-time)および[`````index.time_series.end_time`````](94b83a10d7b2bd96.md#index-time-series-end-time)インデックス設定によって定義されます。
  4. TSDSにドキュメントを追加すると、Elasticsearchはその`````@timestamp`````値に基づいて適切なバックインデックスにドキュメントを追加します。その結果、TSDSは、書き込みを受け入れることができる任意のTSDSバックインデックスにドキュメントを追加できます。これは、インデックスが最新のバックインデックスでない場合でも適用されます。
  5. ![時間制約付きインデックス](https://cdn.hedaai.com/projects/elasticsearch-8-15/acca12aba830c2e22ce8523e4a9fb005.svg)
  6. 一部のILMアクションは、ソースインデックスを読み取り専用としてマークするか、良好なパフォーマンスを提供するためにインデックスがもはやアクティブに書き込まれないことを期待します。これらのアクションは次のとおりです: - [削除](/read/elasticsearch-8-15/b2a3233aadaf433f.md) - [ダウンサンプリング](/read/elasticsearch-8-15/93fd53b0824bd21a.md) - [強制マージ](/read/elasticsearch-8-15/56614beb9f63ffc7.md) - [読み取り専用](/read/elasticsearch-8-15/5900249935c8a74f.md) - [検索可能スナップショット](/read/elasticsearch-8-15/7d6b93525a6cb258.md) - [縮小](/read/elasticsearch-8-15/82865be2d70b6959.md) インデックスライフサイクル管理は、書き込みを受け入れるための上限時間制約が、[`````index.time_series.end_time`````](94b83a10d7b2bd96.md#index-time-series-end-time)インデックス設定で表される期限が切れるまで、これらのアクションを実行しません。
  7. ドキュメントの`````@timestamp`````値を受け入れることができるバックインデックスがない場合、Elasticsearchはドキュメントを拒否します。
  8. Elasticsearchは、インデックス作成およびロールオーバーのプロセスの一環として`````index.time_series.start_time`````および`````index.time_series.end_time`````設定を自動的に構成します。
  9. ### 先読み時間
  10. [`````index.look_ahead_time`````](94b83a10d7b2bd96.md#index-look-ahead-time)インデックス設定を使用して、インデックスにドキュメントを追加できる未来の範囲を構成します。TSDSの新しい書き込みインデックスを作成するとき、Elasticsearchはインデックスの`````index.time_series.end_time`````値を次のように計算します:
  11. `````now + index.look_ahead_time

時系列のポーリング間隔(time_series.poll_interval設定によって制御される)で、Elasticsearchは書き込みインデックスがそのインデックスライフサイクルポリシーのロールオーバー基準を満たしているかどうかを確認します。満たしていない場合、Elasticsearchはnow値を更新し、書き込みインデックスのindex.time_series.end_timeを次のように更新します:

now + index.look_ahead_time + time_series.poll_interval

このプロセスは、書き込みインデックスがロールオーバーするまで続きます。インデックスがロールオーバーすると、Elasticsearchはインデックスの最終index.time_series.end_time値を設定します。この値は、新しい書き込みインデックスのindex.time_series.start_timeの境界を形成します。これにより、隣接するバックインデックスの@timestamp範囲が常に境界を持ち、重複しないことが保証されます。

振り返り時間

index.look_back_timeインデックス設定を使用して、インデックスにドキュメントを追加できる過去の範囲を構成します。TSDSのデータストリームを作成するとき、Elasticsearchはインデックスのindex.time_series.start_time値を次のように計算します:

now - index.look_back_time

この設定は、データストリームが作成されるときにのみ使用され、最初のバックインデックスのindex.time_series.start_timeインデックス設定を制御します。このインデックス設定を構成することで、@timestampフィールド値が2時間(index.look_back_timeデフォルト)より古いドキュメントを受け入れることができます。

データ追加のための受け入れられる時間範囲

TSDSは、現在のメトリクスデータを取り込むように設計されています。TSDSが最初に作成されると、初期バックインデックスには次のような値があります:

  • index.time_series.start_time値がnow - index.look_back_timeに設定され
  • index.time_series.end_time値がnow + index.look_ahead_timeに設定されます。

その範囲内にあるデータのみがインデックス化できます。

index.time_series.start_time APIを使用して、任意のTSDSへの書き込みのための受け入れられる時間範囲を確認できます。

次元ベースのルーティング

各TSDSバックインデックス内で、Elasticsearchはindex.routing_pathインデックス設定を使用して、同じ次元を持つドキュメントを同じシャードにルーティングします。

TSDSに対する一致するインデックステンプレートを作成する際には、index.routing_path設定で1つ以上の次元を指定する必要があります。TSDS内の各ドキュメントは、index.routing_path設定に一致する1つ以上の次元を含む必要があります。

index.routing_path設定の次元は、プレーンkeywordフィールドでなければなりません。index.routing_path設定はワイルドカードパターン(たとえばdim.*)を受け入れ、新しいフィールドに動的に一致することができます。ただし、Elasticsearchは、index.routing_path値に一致するスクリプト、ランタイム、または非次元、非keywordフィールドを追加するマッピングの更新を拒否します。

TSDSドキュメントはカスタム_routing値をサポートしていません。同様に、TSDSのマッピングで_routing値を要求することはできません。

インデックスソート

Elasticsearchは、繰り返し値を圧縮するために圧縮アルゴリズムを使用します。この圧縮は、繰り返し値が近くに保存されると最も効果的です — 同じインデックス内、同じシャード上、同じシャードセグメント内で隣接して。

ほとんどの時系列データには繰り返し値が含まれています。次元は同じ時系列内のドキュメント間で繰り返されます。時系列のメトリック値も時間の経過とともにゆっくりと変化する場合があります。

内部的に、各TSDSバックインデックスは、_tsidおよび@timestampでシャードセグメントを順序付けるためにインデックスソートを使用します。これにより、これらの繰り返し値がより良い圧縮のために近くに保存される可能性が高くなります。TSDSは、index.sort.*インデックス設定をサポートしていません。

時系列データストリーム (TSDS)

時系列データストリーム (TSDS) は、タイムスタンプ付きのメトリクスデータを1つ以上の時系列としてモデル化します。

TSDSを使用すると、メトリクスデータをより効率的に保存できます。私たちのベンチマークでは、TSDSに保存されたメトリクスデータは、通常のデータストリームよりも70%少ないディスクスペースを使用しました。正確な影響はデータセットによって異なります。