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
37
Thanos入門(Receiver構成)
Thanosに関する社内勉強会の資料になります。
参考になれば幸いです。
nutslove
February 17, 2025
Tweet
Share
More Decks by nutslove
See All by nutslove
GitOpsで始めるクラウドリソース管理
nutslove
1
70
OpenTelemetryによるベンダーニュートラルな監視設定
nutslove
5
430
Grafana Lokiで始めるPodログ/k8s Events管理
nutslove
0
2.2k
Grafana Lokiで始めるログ管理
nutslove
7
9.2k
Istio入門
nutslove
18
8.1k
ステートフルPodのマルチAZ化のために行ったこと
nutslove
2
900
AMP, AMG, X-Ray等、AWSマネージドサービスを活用した監視環境構築
nutslove
2
1.2k
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
23
2.6k
Building Applications with DynamoDB
mza
94
6.3k
Embracing the Ebb and Flow
colly
85
4.6k
StorybookのUI Testing Handbookを読んだ
zakiyama
29
5.6k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Six Lessons from altMBA
skipperchong
27
3.7k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
52
2.4k
Gamification - CAS2011
davidbonilla
81
5.2k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
Why Our Code Smells
bkeepers
PRO
336
57k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
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