日本語の thanos の記事ってほぼ無いよなーという思い付きで書いてます.
GitHub - thanos-io/thanos: Highly available Prometheus setup with long term storage capabilities. A CNCF Incubating project.
Highly available Prometheus setup with long term storage capabilities. A CNCF Incubating project. - …
アーキテクチャ
各コンポーネントごとに見ていきましょう.
Sidecar
Prometheus と同じホストで動かすオブジェクトストレージにアップロードを行うコンポーネントです. また後述の Query コンポーネントから発行されたクエリを受け取って Prometheus に渡す役割も持っています. tsdb が吐き出されたらストレージにアップロードする仕組みなので,tsdb が吐き出される間隔=アップロード間隔になります. そのため storage.tsdb.min-block-duration と storage.tsdb.max-block-duration を同じ値にする必要があります.
Query
クエリを叩くコンポーネントです. Prometheus と同じ API が実装されているので,Grafana や Trickster の参照元にできます. また Act/Act な Prometheus などの場合クエリの重複排除が必要となりますが,この Query がよしなにしてくれます. 前に確認したときは全部の Sidecar にクエリを投げていた気がしたんですが,今はどの Prometheus にクエリを投げるか判定してやってくれているみたいです.
Store Gateway
オブジェクトストレージのメトリクスを参照できるようにするコンポーネントです. キャッシュをメモリ上に展開するため,メトリクスの量によってはめちゃくちゃメモリを持っていっていました. 今は memcached に変更もできるようになったし,max-size が指定できるようにもなっているので安心.
Compactor
オブジェクトストレージにある tsdb をダウンサンプルするコンポーネントです. Prometheus でもクエリ効率を高めるために圧縮していますが,それのオブジェクトストレージ版です.
Ruler
thanos と Alertmanager を連携するコンポーネントです.
導入メリット
- データの長期保存をオブジェクトストレージに任せることができる
- よしなにクエリの重複排除をやってくれるので Act/Act 構成が組みやすくなる
普通に Prometheus しか使っていない場合は重複排除なんてないので Grafana のデータソースにはいつもは first が設定されていて,有事の際は second に切り替えるとかになると思います(Act/Stan 構成). thanos をデータソースにすれば重複排除をよしにやってくれるので, Act/Act 構成が簡単にできます.
つらいポイント
Store Gateway のメモリがきついかなというところでしたが,下記の issue が v0.11.0 で閉じられているのでそれ以降ならイケてそう.
store: Store gateway consuming lots of memory / OOMing · Issue #448 · thanos-io/thanos
Thanos, Prometheus and Golang version used thanos v0.1.0rc2 What happened Thanos-store is consuming …
まとめ
thanos の導入によってオブジェクトストレージにデータの永続化,またその永続化したデータに対しても PromQL で参照することができます. また重複排除などによってより良い感じの構成にすることが簡単になります. 最近はイマイチポイントも解消されてきていますので,みなさんも使ってみてください.