VictoriaMetricsによるモニタリングのスケーリング:Prometheusからの移行に向けた実践ガイド

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Prometheusのリソースの壁に突き当たる

成長を続けるKubernetesクラスターを管理したことがある人なら、誰もが「Prometheusの壁」を知っています。それは通常、金曜日の午後4時といった最悪のタイミングでやってきます。突然、Prometheusがメモリ制限に達し、OOM killが急増し、PVCを拡張する間もなくディスク容量が枯渇します。私は数ヶ月間、インスタンスのシャーディングや保持ポリシーのアグレッシブなチューニングに費やしましたが、最終的にはより持続可能な道が必要であることに気づきました。

Prometheusは信頼性の高いワークホース(働き者)ですが、そのアーキテクチャ上の選択は、環境がスケールするにつれて足かせとなることがあります。高カーディナリティや長期保存は、しばしばコストのかかるボトルネックに変わります。本番環境をVictoriaMetricsに移行した直後、その効果はすぐに現れました。以前のバニラなPrometheus構成と比較して、CPU使用率は3分の1に低下し、ディスクIOPSはほぼ90%も減少しました。

なぜVictoriaMetricsが選ばれるのか

従来の拡張パスは通常、ThanosやCortexに行き着きます。これらは強力ですが、運用負荷が高いのが難点です。オブジェクトストレージの管理や、各Prometheusインスタンス用のサイドカー、そしてシステムを維持するためだけに数十ものマイクロサービスを管理することになります。VictoriaMetricsは異なる道を選び、シンプルさと極限の効率を優先しています。

アーキテクチャの違い

Prometheusはデータをプル(取得)してローカルに保存する自己完結型のユニットです。対照的に、VictoriaMetricsは高性能なドロップイン(そのまま置き換え可能な)代替ツールとして機能します。vmagent経由でデータをプルすることも、Remote Writeのターゲットとして機能させることも可能です。真の魔法はそのストレージエンジンにあります。時系列データ向けに最適化されたカスタムビルドのLSM(Log-Structured Merge)ツリーベースのストレージを使用しています。これにより、圧縮率が大幅に向上します。

「シングルバイナリ」という哲学は、非常に新鮮です。それは確実に動作します。高負荷下で安定稼働させるために、分散システムの博士号は必要ありません。

メリットとトレードオフ

優れた点

  • リソース効率: 私のテストでは、同じ数のアクティブなシリーズに対して、VictoriaMetricsはPrometheusの7分の1のRAMしか使用しませんでした.
  • 強力な圧縮: Prometheusで200GBを占めていたデータが、VictoriaMetricsではわずか22GBにまで縮小されました。
  • ドロップイン互換性: PromQLのスーパーセットであるMetricsQLをサポートしています. 既存のGrafanaダッシュボードをそのまま使用できます。
  • カーディナリティの処理: 特有の「ストップ・ザ・ワールド」によるレイテンシのスパイクを起こすことなく、数百万のユニークなラベルの組み合わせを処理します。

現実的な留意点

  • プッシュ vs プル: スクレイピングもサポートしていますが、基本的にはRemote Writeのフロー向けに設計されています。これには、データパイプラインの設計方法について少し考え方を切り替える必要があります。
  • エコシステムの規模: コミュニティは急速に成長していますが、既存のオペレーターのライブラリは、巨大なPrometheusエコシステムに比べるとまだ小規模です。

実戦で鍛えられた本番環境アーキテクチャ

中規模から大規模な環境では、vmagentvmsingleを使用したセットアップを推奨します。マルチペタバイト規模を管理する場合は、クラスター版を検討してください。

この設計では、vmagentをワークロードの近くに配置してメトリクスをスクレイピングします。メインストレージがオフラインになった場合、ローカルにデータをバッファリングするため、ネットワークの瞬断などによるデータの欠落を防ぐことができます。その後、データはRemote Writeを介して中央のVictoriaMetricsインスタンスにプッシュされます。Grafanaは、このインスタンスをプライマリソースとして指定するだけです。

Kubernetesを使用している場合は、VictoriaMetrics Operatorを使用してください。Prometheus Operatorと同様に、ライフサイクル管理の重労働を肩代わりしてくれます。

実践:Docker Composeによるデプロイ

プロトタイプを動かしてみましょう。このセットアップには、コアエンジン、スクレイピング用のvmagent、そしてGrafanaが含まれます。

# docker-compose.yml
version: '3.8'
services:
  victoriametrics:
    container_name: victoriametrics
    image: victoriametrics/victoria-metrics:v1.93.5
    ports:
      - "8428:8428"
    volumes:
      - vmdata:/storage
    command:
      - "--storageDataPath=/storage"
      - "--retentionPeriod=1y"
    restart: always

  vmagent:
    container_name: vmagent
    image: victoriametrics/vmagent:v1.93.5
    depends_on:
      - victoriametrics
    ports:
      - "8429:8429"
    volumes:
      - vmagentdata:/vmagentdata
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - "--promscrape.config=/etc/prometheus/prometheus.yml"
      - "--remoteWrite.url=http://victoriametrics:8428/api/v1/write"
    restart: always

  grafana:
    container_name: grafana
    image: grafana/grafana:10.0.3
    ports:
      - "3000:3000"
    restart: always

volumes:
  vmdata:
  vmagentdata:

vmagentがサービスをターゲットにするための、標準的なprometheus.ymlが必要です:

# prometheus.yml
global:
  scrape_interval: 15s # スクレイピングの間隔を15秒に設定

scrape_configs:
  - job_name: 'vmagent'
    static_configs:
      - targets: ['vmagent:8429']
  - job_name: 'victoriametrics'
    static_configs:
      - targets: ['victoriametrics:8428']

docker-compose up -dを実行します。これで、テストの準備が整った本番グレードのバックエンドが手に入ります。

Grafanaの接続

VictoriaMetricsは事実上Prometheusとして「振る舞う」ため、統合はシームレスです。データを表示するには:

  1. localhost:3000でGrafanaを開きます。
  2. Connections > Data Sources に移動します。
  3. 新しい Prometheus ソースを追加します。
  4. URLを http://victoriametrics:8428 に設定します。
  5. **Save & Test** をクリックします。

これだけで完了です。既存のすべてのダッシュボードをそのまま使用できます。強化されたレート計算やラベル操作など、MetricsQLの機能を活用したい場合は、パネルで直接使い始めることができます。

パフォーマンスの現実

自分で数値を検証するまで、ストレージに関する主張には当初懐疑的でした。秒間15万サンプルをプッシュする本番クラスターにおいて、Prometheusは1週間あたり約220GBのディスクを消費していました。VictoriaMetricsは、全く同じ負荷をわずか24GBで処理しました。

これらの結果を得るには、--retentionPeriodフラグに注目してください。Prometheusの複雑なブロック管理とは異なり、VictoriaMetricsはデータライフサイクルを直線的に処理します。1y(1年)に設定すると、システムはほぼゼロのオーバーヘッドで自動的に削除を管理します。

万が一高いCPU使用率に遭遇した場合(まれですが)、--search.maxQueryDurationフラグを調整してください。これにより、大規模で非効率なクエリがシステムをロックアップするのを防ぎます。しかし、ほとんどのユーザーにとって、デフォルト設定は完璧に調整されています。

現場からの総評

モニタリングのコアを切り替えるのは大きな決断です。しかし、既存のツールとの完全な互換性を保ちながら、シングルバイナリのバックエンドが提供する運用のシンプルさは無視できません。移行以来、モニタリングインフラに関連する「オンコール」の疲労は解消されました。

Prometheusの世話を焼くことや、TSDB의 破損と戦うことに疲れているなら、VictoriaMetricsを試してみてください。まずは現在のセットアップと並行して、Remote Writeのターゲットとして設定することから始めてみましょう。リソースの節約を目の当たりにすれば、移行はスタックの自然な進化のように感じられるはずです。

Share: