Thanos
https://thanos.io/Thanos-logo_full.svg
Thanos - Highly available Prometheus setup with long term storage capabilities
Prometheus の HA と long-term storage を実現するための OSS
類似プロジェクト
Cortex
table: componentes
Sidecar Prometheus のサイドカーコンテナとしてデプロイされる。クエリ実行や時系列データをクラウドストレージにアップロードする
Store Gateway クラウドストレージのバケットからメトリクスを提供する。主に API ゲートウェイとして動作する。
Compactor クラウドストレージのバケットに保存されているデータのコンパクション、ダウンサンプリング、リテンションを行う。
Receiver Prometheus の remote-write WAL を受信し、クラウドストレージにアップロードや Querier に公開する。
Ruler / Rule 記録、アラートルールを評価して、公開やアップロードを行う。
Querier / Query Prometheus Query API より、Sidecar, Receiver, Store Gateway コンポーネントからデータを取得する。
Query Frontend Prometheus Query API より、レスポンスをキャッシュしながら Querier にプロキシする。
Sidecar
Prometheus のサイドカーコンテナで簡単に実装できる。
Prometheus のローカルストレージから tsdb block を読み込む
Prometheus Operator に対応している。
HA は Prometheus のレプリカと同じ構成になる。
remote-read API の上に StoreAPI を実装し、Querier からクエリできるようにする。
Prometheus の PV に tsdb block を保存する。
ある間隔(default: 2h)で、TSDB blocks を storage に upload する
upload 間隔の 3倍以上の data は、ローカルストレージで保持することが推奨されている
Store Gateway
オブジェクトストレージのバケットの上に StoreAPI を実装する。
API Gateway としての役割を持つ。
起動時に Thanos クラスタに参加して、アクセス可能なデータをアドバタイズする。
ローカルストレージにオブジェクトストレージデータを保持して、バケットと同期している。
TSDB ブロックあたり平均 6MB 使用する。
シャーディング
以下のフラグでクエリする時間を指定できる。
--min-time
--max-time
新しいブロックはすぐに取得できない可能性がある。
非同期ブロックの同期ジョブ(--sync-block-duration="3m")がデフォルトで 3m ごとに実行されるため。
index をキャッシュできる。
in-memory, Memcached, Redis に対応している。
--index-cache-size="250MB"
Bucket をキャッシュできる。
chunks
metadata
index-header
オブジェクトストレージにクエリを問い合わせるときに必要となる最低限の情報。
symbols table to unintern string values
postings offset for posting lookup
ローカルストレージに保存されている。
./data/<block>/index-header
Compactor
オブジェクトストレージのデータをコンパクションする。
Prometheus2.0 のコンパクション手続き形式で実行される。
データのダウンサンプリングをする。
データの削除ができる。
コンポーネントの中で唯一の特徴
バケットに対してシングルトンとしてデプロイする。
Cronjob で実行できる。
HA は必要ない。
external_labels でストリーム(コンパクショングループ)が分けられる。
Prometheus ごとにユニークな値に設定する必要がある。
重複するブロックが見つかると、Overlap エラーが発生する。
Vertical Compactions
複数ブロックを 1 つに垂直圧縮する。
Retention
デフォルトでは retention されない。
以下の引数により指定ができる
--retention.resolution-raw
--retention.resolution-5m
--retention.resolution-1h
ダウンサンプリングするためには、期間を Retention > Downsampling にする必要がある。
先にデータが削除されるため。
Downsampling
解像度(データポイントの距離)を下げること。
raw
Sidecar, Receiver からアップロードされたもの。
デフォルトでは 2h ごと。
10h? 経過すると、8h ごとのブロックにコンパクションされる。
解像度はそのまま。
Prometheus のスクレイプ間隔と同じになる。
5m
raw が 40h 経過すると 2d ごとのブロックにコンパクション・ダウンサンプリングされる。
1h
5m が 10d 経過すると 2w ごとのブロックにコンパクション・ダウンサンプリングされる。
作成されるブロック
コンパクションとダウンサンプリングの 2 つのブロックが作成される。
一時的にデータ量が増える。
コンパクションのみされたものがリテンションされて、データ量が減る。
目的
長期間のクエリを高速にすること。
無効化
--downsampling.disable
長期間データを保持しない場合などに設定される。
Resources
CPU
--compact-concurrency は CPU コア数が推奨されている。
Memory
中規模であれば 10GB 程度
依存関係
オブジェクトストレージのブロックサイズ
コンパクションの並行性
Network
バケットの近くが推奨されている。
Disk
中規模であれば 100GB 程度
中間データやバケットをキャッシュする
Receiver
StatefulSet で動作する。
Push 型で remote-write API をサポートしている。
デフォルトで 2h ごとに TSDB ブロックをオブジェクトストレージにアップロードする。
HA / Multi-tenancy
データを push する Prometheus では、ユニークな外部ラベルを用いる。
データブロックを識別するため。
ハッシュリングして複数ポッドをデプロイする。
角ポッドはユニークなテナントラベルを使用する。
テナント情報を含む HTTP ヘッダで、該当する Receiver を分ける。
--receive.tenant-header="THANOS-TENANT"
ローカルストレージが必要になる。
Prometheus のリテンションは最小値に保てる。
Sidercar と比べて使用量が多くなる。
以下に依存する。
--receive.replication-factor
--tsdb.retention
ポッドのレプリカ
Rule / Ruler
Ruler は使用せず、ローカル Prometheus に残すことが推奨されている。
Ruler は、Query が remote StoreAPI で取得するデータに依存するため。
Query が使用できないときの対策が必要になる。
Querier / Query
ズームインとズームアウトに基づいて、解像度を自動変換する。
Query Frontend
Reference
Prometheus HA with Thanos Sidecar Or Receiver?
Sidecar vs Receiver
Achieve Multi-tenancy in Monitoring with Prometheus & Thanos Receiver
Receiver での Multi-tenancy 構築
dsayan154/thanos-receiver-demo: A simple demo of how to acheive multi-tenant monitoring using prometheus and thanos-receive