Grafana Mimir: Object Storageを利用したPrometheusメトリクスの「無限」ストレージソリューション

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

Prometheus運用における「ディスクフル」の懸念

20〜30台のサーバーを監視するPrometheusクラスターを運用しているなら、真夜中にディスク容量不足の警告を受け取った経験が一度はあるはずです。Prometheusはデフォルトでデータをローカルディスクに保存します。メトリクスが増加したり、レポート作成のために1〜2年分のデータを保持する必要がある場合、SSD/NVMeディスクのコストは非常に高額になります。また、数百GBのTSDBデータを手動でバックアップしたり移動したりするのは、まさに悪夢です。

以前の私のシステムでは、ディスクを保護するためにデータを15日間しか保持できませんでした。しかし、Mimirを導入したことで、古いメトリクスをすべてObject Storage(S3/MinIO)に転送できるようになりました。これにより、物理ディスクの追加コストを一切かけずに、6ヶ月前のトレンドをわずか数秒で照会できるようになりました。MimirはGrafana Labsによるオープンソースプロジェクトであり、非常に柔軟なアーキテクチャで数十億のメトリクスを処理する能力を備えています。

なぜThanosではなくMimirを選んだのか?

有名なThanosを検討する方も多いでしょう。しかし、両方を試した結果、Mimirにはより実用的な利点があると感じました。

  • 超高速なデプロイ: Mimirはmonolithicモードをサポートしています。Thanosのように5〜7つの個別のコンポーネントを管理する代わりに、単一のバイナリファイルだけでシステム全体を実行できます。
  • PullではなくPushメカニズム: Mimirはremote_writeを介してデータを受け取ります。Prometheusの横にSidecarをインストールする必要がないため、監視対象ノードの負荷を軽減できます。
  • クエリ速度: インテリジェントなシャーディングとハッシングメカニズムのおかげで、Mimirは大量のデータに対する複雑なクエリを大幅に速く処理します。

動作モデル

データフローは次のようになります:Prometheusがメトリクスを収集し、remote_writeを通じて即座にMimirへ送信します。ここでMimirはデータを圧縮し、MinIO(Object Storage)に長期保存します。最後に、GrafanaがMimirに直接接続してデータを取得し、グラフを表示します。

Docker Composeによるインストール手順

開始するには、Dockerがインストールされた Linuxサーバーが必要です。MinIO、Mimir、Prometheus、Grafanaを含む完全なラボ環境を構築します。

1. MinIOの設定(メトリクス保存先)

docker-compose.ymlファイルを作成します。MinIOは、AWS S3の代わりとして低コストなストレージの役割を果たします。

services:
  minio:
    image: minio/minio
    container_name: mimir-minio
    volumes:
      - ./minio-data:/data
    environment:
      MINIO_ROOT_USER: mimiradmin
      MINIO_ROOT_PASSWORD: mimirpassword
    command: server /data --console-address ":9001"
    ports:
      - "9000:9000"
      - "9001:9001"

2. Grafana Mimirの設定

mimir-config.yamlファイルを作成します。これはMimirをMinIOに接続するための最も重要な部分です。

target: all
common:
  storage:
    backend: s3
    s3:
      endpoint: minio:9000
      access_key_id: mimiradmin
      secret_access_key: mimirpassword
      insecure: true
      bucket_name: mimir-metrics

multitenancy_enabled: false

blocks_storage:
  backend: s3
  s3:
    bucket_name: mimir-blocks
  tsdb:
    dir: /tmp/mimir/tsdb

server:
  http_listen_port: 9009

3. PrometheusからMimirへの接続

prometheus.ymlファイルを開き、remote_write設定を追加します。このコマンドにより、Prometheusは収集したデータを即座に転送するようになります。

global:
  scrape_interval: 15s

remote_write:
  - url: http://mimir:9009/api/v1/push

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

4. システムの起動

docker-compose.ymlにMimir、Prometheus、Grafanaを追加し、docker-compose up -dコマンドを実行します。数分後、モニタリングスタック全体が稼働準備完了となります。

Grafanaでのデータソース設定

ポート3000でGrafanaにアクセスします。Prometheus(ポート9090)に直接向ける代わりに、URLをhttp://mimir:9009/prometheusとして新しいPrometheusデータソースを追加します。

ここで素晴らしいのは、GrafanaがMimirを巨大なPrometheusサーバーとして認識することです。Mimirは、RAMからの最新データとMinIOからの古いデータを自動的に統合し、最も正確な結果を返します。

運用における実践的なアドバイス

本番環境でMimirをしばらく運用してみて、重要な注意点が3つあります:

  • バケットを手動で作成する: MimirはMinIO上にバケットを自動作成しません。Mimirを起動する前に、ポート9001にアクセスしてmimir-metricsmimir-blocksという2つのバケットを事前に作成しておく必要があります。
  • RAMは非常に重要な要素です: Mimirはデータのインデックス作成と圧縮にRAMを必要とします。15〜20台のサーバーを監視する場合、OOM(Out of Memory)によるコンテナの再起動を防ぐために、少なくとも4GBのRAMを割り当ててください。
  • PrometheusのRetentionを短く保つ: Prometheus側では--storage.tsdb.retention.time=2hに設定することをお勧めします。データはすでにMimirが管理しているため、これによりローカルディスクの負荷を最小限に抑えることができます。

まとめ

よりプロフェッショナルで持続可能なモニタリングシステムを構築したいのであれば、Grafana Mimirへの移行は正しい選択です。毎週新しいデータのために古いデータを削除することを心配する必要はもうありません。非常に安価なObject Storageを利用することで、Mimirはクエリ速度を安定させながら、メトリクスを好きなだけ長期間保存することを可能にします。

Share: