Slide 1

Slide 1 text

Thanos入門 2025/2/17 李俊起

Slide 2

Slide 2 text

話す内容 2025/2/17 2 • Thanosの概要 • アーキテクチャ • 各コンポーネントについて • Receiver構成でのマルチテナント ※主にReceiver構成について話します。

Slide 3

Slide 3 text

2025/2/17 3 Thanosの概要

Slide 4

Slide 4 text

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に実装されている

Slide 5

Slide 5 text

2025/2/17 5 Thanosアーキテクチャ

Slide 6

Slide 6 text

Sidecar方式 2025/2/17 6 GitHub - thanos-io/thanos: Highly available Prometheus setup with long term storage capabilities. A CNCF Incubating project.

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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 にアップロード

Slide 9

Slide 9 text

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)から取得

Slide 10

Slide 10 text

2025/2/17 10 Thanosの各コンポーネント

Slide 11

Slide 11 text

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/

Slide 12

Slide 12 text

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/

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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/

Slide 16

Slide 16 text

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/

Slide 17

Slide 17 text

複数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未満だとエラー

Slide 18

Slide 18 text

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/

Slide 19

Slide 19 text

データの重複排除(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

Slide 20

Slide 20 text

データの重複排除(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つは本来同じデータであり、重複排除されるべき

Slide 21

Slide 21 text

Query Frontend 2025/2/17 21 • Querierの前段で最初にクエリーを受け付け、クエリーの分割と クエリー結果のキャッシュ機能を持つコンポーネント • クエリーは検索レンジに応じて分割される ➢「--query-range.split-interval」フラグで変更可能(default: 24h) ➢ 例えば2d分のメトリクスを検索した場合、2つのクエリーに分割される https://thanos.io/tip/components/query-frontend.md/

Slide 22

Slide 22 text

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/

Slide 23

Slide 23 text

2025/2/17 23 マルチテナント

Slide 24

Slide 24 text

Receiver構成でのマルチテナント(Write) 2025/2/17 24 • 「THANOS-TENANT」ヘッダーに値を入れてReceiverに連携 するとReceiverが「THANOS-TENANT」ヘッダーの値を 「tenant_id」ラベルに変換してメトリクスを保存してくれる https://www.youtube.com/watch?v=SAyPQ2d8v4Q

Slide 25

Slide 25 text

※補足 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

Slide 26

Slide 26 text

Receiver構成でのマルチテナント(Read) 2025/2/17 26 • Thanos v0.34からQuerierに「--query.enforce-tenancy」 フラグが追加され、 「THANOS-TENANT」ヘッダー (tenant_id ラベル) の値に一致するメトリクスのみ取得される https://www.youtube.com/watch?v=SAyPQ2d8v4Q