Thanos
https://thanos.io/Thanos-logo_full.svg
類似プロジェクト
table: componentes
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 を読み込む
HA は Prometheus のレプリカと同じ構成になる。
remote-read API の上に StoreAPI を実装し、Querier からクエリできるようにする。 Prometheus の PV に tsdb block を保存する。
ある間隔(default: 2h)で、TSDB blocks を storage に upload する
upload 間隔の 3倍以上の data は、ローカルストレージで保持することが推奨されている
Store Gateway
API Gateway としての役割を持つ。
起動時に Thanos クラスタに参加して、アクセス可能なデータをアドバタイズする。
ローカルストレージにオブジェクトストレージデータを保持して、バケットと同期している。
TSDB ブロックあたり平均 6MB 使用する。
シャーディング
以下のフラグでクエリする時間を指定できる。
--min-time
--max-time
新しいブロックはすぐに取得できない可能性がある。
非同期ブロックの同期ジョブ(--sync-block-duration="3m")がデフォルトで 3m ごとに実行されるため。
index をキャッシュできる。
--index-cache-size="250MB"
Bucket をキャッシュできる。
chunks
metadata
オブジェクトストレージにクエリを問い合わせるときに必要となる最低限の情報。
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
--compact-concurrency は CPU コア数が推奨されている。
中規模であれば 10GB 程度
依存関係
オブジェクトストレージのブロックサイズ
コンパクションの並行性
バケットの近くが推奨されている。
中規模であれば 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
Sidecar vs Receiver
Receiver での Multi-tenancy 構築