Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Thanos入門(Receiver構成)

nutslove
February 17, 2025
18

 Thanos入門(Receiver構成)

Thanosに関する社内勉強会の資料になります。
参考になれば幸いです。

nutslove

February 17, 2025
Tweet

Transcript

  1. 話す内容 2025/2/17 2 • Thanosの概要 • アーキテクチャ • 各コンポーネントについて •

    Receiver構成でのマルチテナント ※主にReceiver構成について話します。
  2. Thanosとは 2025/2/17 4 • PrometheusのHA構成、メトリクス長期保存のためのツール • 色んなコンポーネントから構成されている(マイクロサービス) • メトリクス長期保存のストレージとしてObject Storage(e.g.

    S3) を使用 ➢ 直近数時間分のメトリクスデータはBlock Storage(e.g. EBS)に保存 • メトリクスデータの取得はStore APIという (gRPCで実装されて いる) 統一されたインタフェースを通じて行う ➢ Querier、Store Gateway、Sidecar、Receiver、Rulerに実装されている
  3. Sidecar方式 2025/2/17 6 GitHub - thanos-io/thanos: Highly available Prometheus setup

    with long term storage capabilities. A CNCF Incubating project.
  4. Receiver方式 2025/2/17 7 Sidecar/Receiver 以外の部分は一緒 GitHub - thanos-io/thanos: Highly available

    Prometheus setup with long term storage capabilities. A CNCF Incubating project.
  5. Receiver方式(Write Path) 2025/2/17 8 GitHub - thanos-io/thanos: Highly available Prometheus

    setup with long term storage capabilities. A CNCF Incubating project. ①Prometheusから Thanos Receiverに Remote Write ②非同期でReceiver からObject Storage にアップロード
  6. Receiver方式(Read Path) 2025/2/17 9 GitHub - thanos-io/thanos: Highly available Prometheus

    setup with long term storage capabilities. A CNCF Incubating project. ①Grafanaなどからの クエリーを最初に受け付けて 複数のクエリーに分割 ②分割されたクエリーを Querierが実行 ③中長期データはStore Gateway経由でObject Storageから取得 ④直近のデータは Receiver(Ingesting Receiver)から取得
  7. Sidecar 2025/2/17 11 • Prometheus PodのSidecarとして起動され、Prometheusが 生成するTSDB blockをobject storageにアップロードする •

    PrometheusがTSDB blockを生成する前の(defaultでは直近 2時間)メモリ上のデータについてはPrometheusから直接取得 する必要がある。 ただ、PrometheusはStore APIを理解できないため、 Sidecarがクエリーを受け付けてPrometheusからデータを取得 して返す https://thanos.io/tip/components/sidecar.md/
  8. Receiver (Receive) 2025/2/17 12 • ThanosをPrometheus as a Serviceとして提供するために 提案/追加されたコンポーネント

    • Prometheus Remote Write APIを実装していて、Prometheusなど からRemote Writeでメトリクスデータを受信ことができる • hashring(Consistent hashingアルゴリズム)で、 メトリクスのlabel setで送り先Receiverが決まる • 冗長化のために複数のReceiverにデータをReplicationする • Prometheus同様、ローカルディスクにTSDB blockを持ち、 object storageにアップロードし、object storageにアップロードする前 のメモリ上のデータについては直接クエリーを受け付けて返す • https://thanos.io/tip/proposals-done/201812-thanos-remote-receive.md/ • https://thanos.io/tip/components/receive.md/
  9. hashring (Consistent hashing) 1/2 2025/2/17 13 • メトリクスを複数のReceiverに分散するための仕組み • Receiverたちをjson形式でまとめ、hashring状に配置する

    Receiverの増減を検知して、hashrings.jsonの変更/反映を自動でやってくれる「thanos-receive-controller」というのもある https://github.com/observatorium/thanos-receive-controller
  10. hashring (Consistent hashing) 2/2 2025/2/17 14 • メトリクスのlabel setでhash値を求めて、 転送先Receiverを決める

    Ingesting Receiver-1 {__name__=“up”,env=“dev”,az=“az-1”} {__name__=“up”,env=“dev”,az=“az-3”} {__name__=“up”,env=“dev”,az=“az-2”} Ingesting Receiver-2 Ingesting Receiver-3 Routing Receiver
  11. Routing Receiver / Ingesting Receiver 1/2 2025/2/17 15 • Receiverは2つの役割を持つ

    1. 連携されてきたデータをどのReceiverに転送/replicationす るか決めて各Receiverに転送/replicationする → Routing Receiver 2. 連携されたデータをlocal diskに保存/object storageに uploadする → Ingesting Receiver https://thanos.io/tip/proposals-accepted/202012-receive-split.md/
  12. Routing Receiver / Ingesting Receiver 2/2 2025/2/17 16 • デフォルトではRoutingとIngesting両方の役割を持つStatefulSetの

    Receiverがデプロイされる。 しかし、Receiver増減時「hashrings.json」(ConfigMap)が 更新され、すべてのReceiver Podが再起動されるため、Receiverが柔軟 にスケールできない • そこで考案されたのが、データ転送のみを行うstatelessのRouting Receiverと、データの保存/object storageへのuploadのみを行う statefulのIngesting Receiverの分割。 それによってstatefulのIngesting Receiverの増減時、 statelessの Routing Receiverの再起動のみで済むため、Receiverの柔軟なスケー ルが可能に。 https://thanos.io/tip/proposals-accepted/202012-receive-split.md/
  13. 複数ReceiverへのReplication 2025/2/17 17 • ReceiverもPrometheusと同様に直近のデータはメモリに保持し、 TSDB blockが生成されたらobject storageにuploadする。 なので直近(default 2時間)のデータはReceiverがあるサーバが

    落ちたら、そのReceiverが持っているデータが失われる恐れがある • データ冗長化のために複数のReceiverに同じデータを replicationする設定が可能 ➢ 「--receive.replication-factor=N」フラグでreplication数を指定 • 「(replication-factor + 1) / 2」のReceiverへの書き込みを保証 書き込み(replication)に成功したReceiver数が上記式を下回る場合は (Prometheusなどに)エラーを返す ➢ 例: replication-factor=5の場合、書き込みに成功したReceiverが3未満だとエラー
  14. Querier (Query) 2025/2/17 18 • GrafanaやQuery Frontendからクエリーを受け付けて、 Store Gateway、Receiver/Sidecarからデータを収集する statelessコンポーネント

    • 「--endpoint」フラグにStore Gateway、Receiver/Sidecar のエンドポイントを指定することで、直近のデータは Receiver/Sidecarから、object storage上のデータはStore Gatewayから取得することが可能 https://thanos.io/tip/components/query.md/
  15. データの重複排除(deduplication) 1/2 2025/2/17 19 • PrometheusのHA構成では、同じメトリクスがPrometheusの数の分 重複して保存され、そのままクエリーを実行すると値が2重になってしまう • Thanosではクエリー時にQuerierでデータの重複排除を行う ➢

    Compactorでobject storage内データの重複排除を行うこともできるけど、 リスクがある(と記載されている) • Querierの「--query.replica-label」フラグに重複排除に利用する HA構成のPrometheus間で異なるラベルを指定することで、 重複排除を行ってくれる • https://thanos.io/tip/components/query.md/ • https://thanos.io/tip/components/compact.md/#vertical-compaction-risks
  16. データの重複排除(deduplication) 2/2 2025/2/17 20 • 例 この2つが同じ環境上のHA構成の Prometheusからのデータ(つまり同じデータ) どのPrometheusからのデータかを表す 「replica」ラベルのみ異なる

    「--query.replica-label」フラグに、 どのPrometheusかを表す ”replica” ラベルを指定する Querierによる重複排除がない場合 下の重複排除がない場合の1つ目と2つ目のデータは “replica” ラ ベルを 除けば同じデータなので、同じデータと見なして1つのみを返す https://thanos.io/tip/components/query.md/#an-example-with-a-single-replica-labels この2つは本来同じデータであり、重複排除されるべき
  17. Compactor 2025/2/17 22 • CompactionとDownSamplingを行うコンポーネント • Compactionは2時間単位で作成された複数のBlockを、 より長い期間(e.g. 2週間)単位で1つのBlockにまとめること •

    DownSamplingはPrometheusのスクレープ間隔(e.g. 30秒) 粒度のサンプルを5分、1時間の粒度のサンプルに作り直すこと • CompactionとDownSamplingの主な目的は、 Readパフォーマンスの向上 https://thanos.io/tip/components/compact.md/
  18. ※補足 PrometheusでHTTP Headerの設定 2025/2/17 25 • 「remote_write」ブロックでheaderの設定が可能 apiVersion: v1 kind:

    ConfigMap metadata: name: prometheus-thanos-config namespace: monitoring data: prometheus.yml: | global: scrape_interval: 30s remote_write: - url: http://thanos-routing-receiver.monitoring.svc:19291/api/v1/receive headers: THANOS-TENANT: platform-team