Перейти к содержанию

4. Кластеры и High Availability


В этой теме — кластер RabbitMQ, отказоустойчивость и поведение при сбоях: classic vs quorum очереди, (устаревшее) mirroring, сетевые разделения (network partitions), лидерство и практики эксплуатации в production. Цель — понимать, что будет при падении ноды и как избежать split-brain‑сюрпризов.


Определения

Термин Определение
RabbitMQ cluster Набор нод RabbitMQ, объединённых общим состоянием (metadata) и коммуникацией Erlang; используется для масштабирования и HA.
Classic queue «Классическая» очередь (историческая реализация). Может быть в single‑node виде или в mirrored (quorum‑не‑Raft) варианте (mirroring).
Quorum queue Очередь на основе Raft‑репликации: один лидер + реплики; лучшее поведение при сбоях, рекомендовано для HA в production.
Leader election Выбор лидера (в quorum) для принятия записей; при отказе лидера происходит переизбрание.
Network partition Ситуация, когда кластер «разрезан» сетью: ноды не видят друг друга (split network).
Split-brain Когда части системы продолжают работать независимо, принимая конфликтующие изменения; в брокерах это особенно опасно для метаданных/очередей.

Когда нужен кластер (и когда не нужен)

Кластер имеет смысл, когда:

  • нужен HA (пережить падение ноды без простоя на уровне очередей);
  • нужен больший throughput по подключениям/каналам;
  • нужно распределение нагрузки (несколько нод принимают соединения).

Не делать кластер «просто потому что можно»:

  • усложняется эксплуатация (обновления, сетевые разделения, диски);
  • требует дисциплины в настройках, мониторинге и тестировании отказов.

Classic vs Quorum queues (production выбор)

Что выбирать

  • Quorum queues — default выбор для критичных очередей в production (HA и предсказуемость).
  • Classic queues — подходят для простых сценариев или когда HA очередей не нужна (и вы готовы к падению одной ноды как к остановке очереди).

Почему quorum обычно лучше

  • Raft даёт понятную модель лидер/реплики и поведение при отказах.
  • Меньше «магии» вокруг split-brain и сетевых проблем.

Важный нюанс

Quorum — это не «бесплатная» репликация:

  • больше I/O и CPU, чем у single classic;
  • нужен правильный размер диска и мониторинг latency.

Network partitions: как кластер реагирует на “разрез сети”

При partition часть нод может потерять связь с остальными. Важно заранее выбрать стратегию, чтобы кластер не жил «двумя жизнями».

Ключевые подходы (на уровне концепции):

  • Pause minority: меньшинство останавливается, чтобы не принимать конфликтующие изменения.
  • Autoheal: попытка автоматически восстановиться после исчезновения partition (может быть опасно без понимания последствий).

Best practice:

  • в production выбирать поведение, которое предотвращает split-brain (обычно “останавливать меньшинство” по смыслу);
  • тестировать на стенде: “разрезали сеть” → “что видят клиенты” → “как быстро восстановились”.

Практика: поднять кластер из 3 нод (Docker Compose)

Ниже — минимальная демонстрационная схема (для обучения). В production обычно разворачивают в Kubernetes (operator/Helm) или на VM с конфигурационным менеджментом.

# docker-compose.yaml (упрощённо; демонстрация принципа)
services:
  rmq1:
    image: rabbitmq:3-management
    hostname: rmq1
    environment:
      RABBITMQ_ERLANG_COOKIE: "same-cookie-for-all"
    ports: ["15672:15672", "5672:5672"]
  rmq2:
    image: rabbitmq:3-management
    hostname: rmq2
    environment:
      RABBITMQ_ERLANG_COOKIE: "same-cookie-for-all"
  rmq3:
    image: rabbitmq:3-management
    hostname: rmq3
    environment:
      RABBITMQ_ERLANG_COOKIE: "same-cookie-for-all"

Комментарии:

  • Erlang cookie должен быть одинаковым для всех нод.
  • В production нужны persistent volumes для данных и настройки ресурсов/лимитов.

Дальше ноды объединяются в cluster командами rabbitmqctl (порядок зависит от окружения). Это намеренно оставлено как упражнение, потому что в production чаще используются готовые инструменты (Helm/operator), а важно — понимать принципы.


Проверка и диагностика кластера (CLI)

# Статус ноды
rabbitmqctl status

# Состояние кластера (какие ноды входят)
rabbitmqctl cluster_status

# Обзор очередей
rabbitmqctl list_queues name durable messages_ready messages_unacknowledged consumers

Production best practices (HA)

Топология и инфраструктура

  • 3 ноды минимум для кластера (кворум); 5 — если нужен больший запас по отказам (по стоимости/сложности).
  • Разносить ноды по разным failure domain (AZ/стойки), но помнить про latency сети и диска.
  • Следить за disk I/O: для quorum очередей диск — критичен.

Очереди и настройки

  • Для критичных потоков использовать quorum queues.
  • Не смешивать «всё подряд» в одном vhost: разделять по окружениям и по нагрузке.
  • Делать DLQ обязательным элементом дизайна (иначе “плохие сообщения” будут ломать поток бесконечно).

Обновления и отказоустойчивость

  • Обновлять ноды по одной (rolling), контролируя метрики и состояние кластера.
  • Тестировать «убили ноду» регулярно на staging: что происходит с publish/consume, сколько времени восстановление.

Мониторинг и алерты

  • Алерты: memory alarm, disk alarm, рост backlog, отсутствие consumer’ов.
  • В quorum очередях следить за задержками и состоянием реплик (как минимум через management UI + exporter).

Дополнительные материалы