Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Thanos入門(Receiver構成)
Search
nutslove
February 17, 2025
0
18
Thanos入門(Receiver構成)
Thanosに関する社内勉強会の資料になります。
参考になれば幸いです。
nutslove
February 17, 2025
Tweet
Share
More Decks by nutslove
See All by nutslove
OpenTelemetryによるベンダーニュートラルな監視設定
nutslove
5
420
Grafana Lokiで始めるPodログ/k8s Events管理
nutslove
0
2k
Grafana Lokiで始めるログ管理
nutslove
7
8.5k
Istio入門
nutslove
18
8k
ステートフルPodのマルチAZ化のために行ったこと
nutslove
2
850
AMP, AMG, X-Ray等、AWSマネージドサービスを活用した監視環境構築
nutslove
2
1.2k
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
RailsConf 2023
tenderlove
29
1k
How STYLIGHT went responsive
nonsquared
98
5.4k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Code Reviewing Like a Champion
maltzj
521
39k
Rails Girls Zürich Keynote
gr2m
94
13k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
4 Signs Your Business is Dying
shpigford
182
22k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.4k
Raft: Consensus for Rubyists
vanstee
137
6.8k
GraphQLとの向き合い方2022年版
quramy
44
13k
Transcript
Thanos入門 2025/2/17 李俊起
話す内容 2025/2/17 2 • Thanosの概要 • アーキテクチャ • 各コンポーネントについて •
Receiver構成でのマルチテナント ※主にReceiver構成について話します。
2025/2/17 3 Thanosの概要
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に実装されている
2025/2/17 5 Thanosアーキテクチャ
Sidecar方式 2025/2/17 6 GitHub - thanos-io/thanos: Highly available Prometheus setup
with long term storage capabilities. A CNCF Incubating project.
Receiver方式 2025/2/17 7 Sidecar/Receiver 以外の部分は一緒 GitHub - thanos-io/thanos: Highly available
Prometheus setup with long term storage capabilities. A CNCF Incubating project.
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 にアップロード
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)から取得
2025/2/17 10 Thanosの各コンポーネント
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/
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/
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
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
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/
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/
複数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未満だとエラー
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/
データの重複排除(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
データの重複排除(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つは本来同じデータであり、重複排除されるべき
Query Frontend 2025/2/17 21 • Querierの前段で最初にクエリーを受け付け、クエリーの分割と クエリー結果のキャッシュ機能を持つコンポーネント • クエリーは検索レンジに応じて分割される ➢「--query-range.split-interval」フラグで変更可能(default:
24h) ➢ 例えば2d分のメトリクスを検索した場合、2つのクエリーに分割される https://thanos.io/tip/components/query-frontend.md/
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/
2025/2/17 23 マルチテナント
Receiver構成でのマルチテナント(Write) 2025/2/17 24 • 「THANOS-TENANT」ヘッダーに値を入れてReceiverに連携 するとReceiverが「THANOS-TENANT」ヘッダーの値を 「tenant_id」ラベルに変換してメトリクスを保存してくれる https://www.youtube.com/watch?v=SAyPQ2d8v4Q
※補足 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
Receiver構成でのマルチテナント(Read) 2025/2/17 26 • Thanos v0.34からQuerierに「--query.enforce-tenancy」 フラグが追加され、 「THANOS-TENANT」ヘッダー (tenant_id ラベル)
の値に一致するメトリクスのみ取得される https://www.youtube.com/watch?v=SAyPQ2d8v4Q