代表的な面接トピック

時系列メトリクスの保持およびダウンサンプリングサービスをどのように設計しますか?

システム設計難しい
Offer.cc 編集チーム公開日 更新日

質問

監視プラットフォームが、ラベル付けされた時系列サンプルを1日あたり数十億件取り込んでいます。15日間の高解像度データと2年間の低解像度データを保持するシステムを、ダウンサンプリング、クエリルーティング、ラベルカーディナリティ、および検証を含めて設計してください。

1. 質問

あるプラットフォームが、サービス、テナント、リージョンごとにラベル付けされた時系列メトリクスを受信しています。短期的なデバッグには秒単位のデータが必要ですが、長期的なレポートには分単位または時間単位の傾向が必要です。データの取り込み量は増加し続けています。コストを抑制し、高いカーディナリティによってクエリが圧倒されるのを防ぎながら、15日間の未加工サンプルと2年間の集計データを保持してください。

2. 制約条件と確認事項

  • スクレイプ間隔、ラベル数とカーディナリティ、クエリ範囲、SLO、許容可能なデータ遅延、および削除要件を確認します。
  • 未加工サンプル、固定ウィンドウ集計、レコーディングルールの結果、および長期アーカイブを分離します。
  • カウンタ、ヒストグラム、または分位数を単純な平均値で置き換えないでください。集計ではメトリクスのセマンティクスを維持する必要があります。
  • 少なくとも1回(at-least-once)の取り込み、重複サンプル、順不同のタイムスタンプ、およびテナント分離を定義します。

3. コアアーキテクチャ

インジェスチョン層は、時間分割されたホットストレージに書き込む前に、ラベルの許可リスト、カーディナリティ予算、およびバッチ圧縮を適用します。クエリ層は、範囲とステップ(step)によってルーティングを行います。短い範囲は未加工ブロックを読み取り、長い範囲は事前集計ブロックを読み取り、混在する範囲は解像度メタデータとともにマージされます。再生可能なウィンドウジョブは、未加工データを読み取り、バージョニングされた集計ブロックを書き込んで検証し、その後にのみ期限切れの未加工ブロックを削除します。

4. 参照フロー

text
ingest(sample):
  series = canonicalize(metric_name, sorted_labels)
  enforce_cardinality_budget(series)
  append_to_time_partition(series, sample)

downsample(window):
  raw = read_raw(window)
  agg = aggregate_by_metric_semantics(raw, resolution=5m)
  write_versioned_block(window, agg, source_watermark)
  verify_counts_checksums_and_watermark(agg)

query(range, step):
  blocks = choose_resolution(range, step)
  return merge_with_gap_and_resolution_metadata(blocks)

カウンタの場合は増分とリセットを保持し、ゲージの場合は最小値/最大値/平均値を保持し、ヒストグラムの場合はバケットまたはネイティブヒストグラム構造をマージします。ユーザーがダウンサンプリングされたデータを未加工の精度と誤認しないように、実際の解像度、カバレッジ、およびギャップを返します。

5. 一貫性とコストのトレードオフ

遅延サンプルや繰り返しの実行によって集計結果が変わる可能性があるため、ジョブにはウォーターマーク、バージョン、および冪等な書き込みに加えて、ウィンドウクローズ後の定義された修正期間が必要です。高カーディナリティのラベルは、メモリ、インデックス、およびクエリのコストを増大させます。テナントクォータや事前集計を使用して任意のユーザーラベルを制限してください。解像度の向上、保持期間の長期化、およびクエリレイテンシの低減は、直接的なストレージおよびコンピュートコストにつながります。

6. 検証とオブザーバビリティ

  • ウィンドウごとに入力/出力サンプル数、カウンタの増分、バケットの合計、チェックサム、およびウォーターマークを検証します。
  • 同じウィンドウを繰り返し再生し、冪等性と置き換え可能な結果バージョンを確認します。
  • 取り込み拒否率、シリーズ数、クエリサンプル数、ダウンサンプリング遅延、ギャップ率、およびストレージコストを監視します。
  • 実際のインシデントについて未加工の結果と集計結果を比較し、スパイク、リセット、および異常値が平均化によって失われていないことを確認します。

7. よくある間違い

  • すべてのメトリクスを時間で平均化し、カウンタ、分位数、またはヒストグラムのセマンティクスを損なうこと。
  • ソートされていないラベル文字列をシリーズキーとして使用し、重複シリーズや不正確なカーディナリティを生成すること。
  • ダウンサンプリングが検証される前に未加工ブロックを削除し、再実行や遅延データの修正を不可能にすること。
  • 時間範囲のみでルーティングし、ステップ、ギャップ、および解像度メタデータを無視すること。

8. 面接の評価ポイント

階層化データモデルを定義しているか

候補者が未加工データ、事前集計データ、アーカイブデータを分離し、各階層の解像度、保持期間、およびクエリの目的を述べているか。

メトリクスのセマンティクスを保持しているか

候補者がすべてのタイプに単一の平均化関数を適用するのではなく、カウンタ、ゲージ、ヒストグラム、分位数を適切に区別して扱っているか。

カーディナリティとコストを制御しているか

候補者がラベルルール、テナントクォータ、取り込み拒否、ストレージ予算を提案し、クエリとコストの関係を説明しているか。

再生可能な検証を設計しているか

候補者がウォーターマーク、バージョン、冪等な書き込み、再生チェックを使用しつつ、ギャップ、遅延、および異常の忠実度を監視しているか。

公開情報ソース

関連する質問

関連面接ツール

システム設計の回答には「回答する」を使用

まず要件を明確にし、スケール、アーキテクチャ、コンポーネント選定、トレードオフの順に進めます。

ツールを見る