Как добиться отказоустойчивости в Prometheus?

«Как добиться отказоустойчивости в Prometheus?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для обеспечения отказоустойчивости Prometheus я использую комбинацию подходов, устраняющих единые точки отказа.

1. Высокая доступность (HA) Prometheus: Запускаю два или более идентичных экземпляра Prometheus с одинаковыми конфигурациями prometheus.yml, собирающих одни и те же цели. Для маршрутизации запросов (например, от Grafana) настраиваю балансировщик нагрузки (Nginx, HAProxy) или использую механизм чтения из нескольких источников в Grafana.

2. Использую Thanos или Cortex для глобального представления: Эти системы решают проблему дедупликации данных с нескольких реплик Prometheus и предоставляют долгосрочное хранение. В моей конфигурации каждый экземпляр Prometheus работает с Thanos Sidecar.

# Конфигурация sidecar в StatefulSet Prometheus (Kubernetes)
- args:
  - sidecar
  - --prometheus.url=http://localhost:9090
  - --tsdb.path=/prometheus
  - --objstore.config-file=/etc/thanos/bucket.yml
  - --grpc-address=0.0.0.0:10901
  - --http-address=0.0.0.0:10902

Запросы направляются к Thanos Query, который агрегирует данные со всех sidecar'ов.

3. Настраиваю HA для Alertmanager: Запускаю кластер из 3+ экземпляров Alertmanager. Они образуют пиринговую сеть, реплицируют и дедуплицируют алерты между собой.

# alertmanager.yml фрагмент
cluster:
  peer: 'alertmanager-0.alertmanager.monitoring.svc.cluster.local:9094'
  peer: 'alertmanager-1.alertmanager.monitoring.svc.cluster.local:9094'

4. Обеспечиваю надежное хранение данных:

  • При локальном хранении: использую быстрые SSD в RAID-конфигурации.
  • Чаще применяю remote_write для отправки метрик во внешние долгоживущие хранилища, такие как VictoriaMetrics или Mimir. Это также защищает данные при потере ноды Prometheus.
    # prometheus.yml
    remote_write:
    - url: http://victoria-metrics:8428/api/v1/write
    queue_config:
      max_samples_per_send: 10000
      capacity: 10000

5. Оркестрация (Kubernetes): Разворачиваю Prometheus и Alertmanager как StatefulSet с PersistentVolume, использую PodAntiAffinity для распределения подов по разным нодам и настраиваю readiness/liveness пробы.