LoginSignup
8
3

More than 3 years have passed since last update.

Cortexアーキテクチャ

Posted at

何の記事?

PrometheusのHA構成について調べる機会があり、
その際にCortexというツールを見つけたので、仕組みを簡単に紹介します。

PrometheusのHA構成

Prometheusを複数台用意すればOKじゃん!!
というほどPrometheusの冗長化は簡単ではないようです。

Timescale(Postgresを時系列DBにする拡張機能)のブログでは、Prometheusを単純に複数台構成にした場合の問題点が記載されています。

これを基にどんな状態が想定されるか考えてみます。

仮に同じ設定のPrometheusが2台いるとします。
データの損失を防ぐ為、2台のPrometheusにはStorageを用意します。

Prometheus_ha.png

この場合、Prometheus 1とPrometheus 2のスクレイピングの間隔が微妙に異なる場合があります。よって、Storage内でデータの不整合が起きる可能性があります。

それでは、各PrometheusにStorageを用意した場合はどうでしょうか。
この場合は、どちらのStorageを正とするかのロードバランシングの問題が発生します。

まとめると、PrometheusのHA構成にはこのような問題が発生するようです。

  • スクレイピングしたデータの重複/不整合
  • ロードバランシング

Cortexって何?

Githubを見てみると、このようなキーワードが並んでいます。

  • Horizontally scalable
  • Highly available
  • Multi-tenant
  • Long term storage

要するに、

  • Cortexは可用性が高くて、データも損失しにくいよ
  • 複数のPrometheusからデータが収集できるよ
  • 長期のデータ保存ができるよ

と言っているようです。

Cortexアーキテクチャ

Githubにはこのような構成図が掲載されています。
Cortexの肝である、赤で囲った部分にフォーカスして説明していきます。

architecture.png

今回説明する部分を簡略化すると、このような構成になっています。

cortex.png

Load Balancer

LBは残念ながらCortexコンポーネントには含まれないので、自分で構築する必要があります。

Distributor/Consul

CortexではPrometheusからのデータを受け取ると、まずはDistributorがデータを受け取ります。

Distributorの機能は

  • ラベル名が重複したものは最大値を採用する
  • Ingesterにデータを配布する

となります。

Hash Ring

Ingesterへのデータ配布はHash Ringでデータを分割します。
(文章で表現すると難しいのですが、絵心もないので文章で頑張って表現します)

イメージとしては、
データは一つのドーナッツだと思って下さい。
このドーナッツをIngester達で分けることにします。
(今回はIngesterが3つとします)

この時、ドーナッツを3等分するのですが、
その前にドーナッツを千等分してしまいます。
ピース1はIngester1へ配り、ピース2はIngester2に配り・・・としていき、データは3等分されます。

この時、Ingester1が故障した時の保険として、ピース1はIngester2とIngester3にも配布します。

複雑ですが、まずはデータを切り刻んでIngesterに配布している事を理解できれば良いです。

Cortexの紹介ブログでもこのように表現されています。

It’s not like slicing a pie into five pieces. It’s more like slicing a pie into a thousand pieces, and then each ingester claiming every fifth piece

Ingester

実質、Prometheusのデータを保持している部分です。
Hash Ringでデータを分割しているので(かつ別のIngesterが同じデータを持っているので)、ここが故障してもデータの損失は起こりにくいです。
(Ingester1台の障害なら損失は起こりませんが、複数台だと問題が起きる可能性があるようです)

受信したデータはメモリに保存され、チャンク形式でストレージへpushされます。(デフォルトでは12時間)

ストレージの保存形式に関わってくることなのですが、
データの保存形式にはブロック形式もあります。

Chunk Data/Chunk Index

チャンクデータはIndexとデータの実態に分けて保存することができます。
(オプション機能)
データを分けない場合、Indexと実態データはともにChunk Indexに保存されます。

利用可能なストレージは以下の通りです。

  • Chunk Index
    • Amazon DynamoDB
    • Google Bigtable
    • Apache Cassandra
  • Chunk Data(オプション)
    • Amazon DynamoDB
    • Google Bigtable
    • Apache Cassandra
    • Amazon S3
    • Google Cloud Storage
    • Microsoft Azure Storage

Cortexのメリット/デメリット

メリット

  • データの損失が起こりにくく、可用性が高い

デメリット

  • 構成が複雑でコンポーネント内の個々の構築が難しい
    (Consul/memcached等)
  • 万一、Ingesterに障害が起きた場合、最大12時間分のデータが損失する

参考

https://medium.com/weaveworks/what-is-cortex-2c30bcbd247d
https://github.com/cortexproject/cortex

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3