Налаштування RabbitMQ кластера для веб-застосунку

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування RabbitMQ кластера для веб-застосунку
Складна
~3-5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Налаштування кластера RabbitMQ для веб-додатків

Автономний RabbitMQ—це одна точка відмови. Кластер з трьох вузлів з quorum queues забезпечує відмовостійкість при втраті одного вузла без втрати повідомлень.

Кластер RabbitMQ поділяє метадані (exchanges, bindings, користувачів) між усіма вузлами, але очереди можуть бути локальними (classic) або реплікованими (quorum/stream). Для прод—тільки quorum queues.

Архітектура кластера

                 Load Balancer (HAProxy / Nginx)
                         |
         ┌───────────────┼───────────────┐
         ↓               ↓               ↓
    rabbit-1:5672   rabbit-2:5672   rabbit-3:5672
    rabbit-1:15672  rabbit-2:15672  rabbit-3:15672 (management)

Quorum очереди реплікуються через Raft-протокол. Кворум: 2 з 3 вузлів повинні підтвердити запис.

Встановлення на Ubuntu 22.04

# Додаємо репозиторій Erlang (версія важлива—RabbitMQ 3.13 вимагає Erlang 26)
curl -1sLf 'https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/setup.deb.sh' | bash
apt install -y erlang-base erlang-asn1 erlang-crypto erlang-eldap erlang-ftp \
    erlang-inets erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
    erlang-runtime-tools erlang-snmp erlang-ssl erlang-syntax-tools erlang-tftp \
    erlang-tools erlang-xmerl

# RabbitMQ
curl -1sLf 'https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/setup.deb.sh' | bash
apt install -y rabbitmq-server=3.13.*

systemctl enable rabbitmq-server

Налаштування вузлів

/etc/rabbitmq/rabbitmq.conf—однаковий для всіх вузлів (крім імен):

# rabbit-1 (для інших вузлів змінюємо тільки ім'я)
nodename = rabbit@rabbit-1

# Мережа
listeners.tcp.default = 5672
management.tcp.port = 15672

# Кластер—усі вузли мають знати один одного
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@rabbit-1
cluster_formation.classic_config.nodes.2 = rabbit@rabbit-2
cluster_formation.classic_config.nodes.3 = rabbit@rabbit-3

# Алертинг при досягненні watermark пам'яті
vm_memory_high_watermark.relative = 0.6
vm_memory_high_watermark_paging_ratio = 0.75
disk_free_limit.relative = 1.5

# TLS
# ssl_options.cacertfile = /etc/rabbitmq/ssl/ca.crt
# ssl_options.certfile   = /etc/rabbitmq/ssl/rabbit-1.crt
# ssl_options.keyfile    = /etc/rabbitmq/ssl/rabbit-1.key

# Heartbeat
heartbeat = 60

# Розмір frame
frame_max = 131072

# Логування
log.file.level = warning
log.console = true
log.console.level = warning

Erlang cookie—має бути однаковим на всіх вузлах (використовується для автентифікації в кластері):

# Генеруємо на першому вузлі
openssl rand -hex 32 | tr -d '\n' > /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie

# Копіюємо на інші вузли
scp /var/lib/rabbitmq/.erlang.cookie rabbit-2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie rabbit-3:/var/lib/rabbitmq/.erlang.cookie

Приєднання вузлів до кластера

# Запускаємо всі три вузли
systemctl start rabbitmq-server

# На rabbit-2 і rabbit-3:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit-1
rabbitmqctl start_app

# Перевіряємо стан кластера
rabbitmqctl cluster_status

Налаштування Quorum Queues

Quorum queues—правильний вибір для прод. Classic mirrored queues застарілі й видалені в RabbitMQ 4.0.

# Створення policy для quorum очередей
rabbitmqctl set_policy quorum-queues "^quorum\." \
    '{"queue-mode":"quorum"}' \
    --priority 1 \
    --apply-to queues

# Або створюємо очередь з явним типом через Management API
curl -u admin:password -X PUT http://rabbit-1:15672/api/queues/%2F/order-processing \
  -H "Content-Type: application/json" \
  -d '{
    "durable": true,
    "arguments": {
      "x-queue-type": "quorum",
      "x-quorum-initial-group-size": 3,
      "x-delivery-limit": 5,
      "x-dead-letter-exchange": "dlx",
      "x-dead-letter-routing-key": "order-processing.failed"
    }
  }'

HAProxy для балансування навантаження

# /etc/haproxy/haproxy.cfg
global
    log /dev/log local0
    maxconn 50000

defaults
    mode tcp
    log global
    retries 3
    timeout connect 5s
    timeout client  30s
    timeout server  30s

frontend rabbitmq-frontend
    bind *:5672
    default_backend rabbitmq-backend

backend rabbitmq-backend
    balance roundrobin
    option tcp-check
    server rabbit-1 rabbit-1:5672 check inter 5s rise 2 fall 3
    server rabbit-2 rabbit-2:5672 check inter 5s rise 2 fall 3
    server rabbit-3 rabbit-3:5672 check inter 5s rise 2 fall 3

frontend rabbitmq-mgmt
    bind *:15672
    default_backend rabbitmq-mgmt-backend

backend rabbitmq-mgmt-backend
    balance roundrobin
    server rabbit-1 rabbit-1:15672 check
    server rabbit-2 rabbit-2:15672 check
    server rabbit-3 rabbit-3:15672 check

Налаштування користувачів і прав доступу

# Видаляємо за замовчуванням користувача guest
rabbitmqctl delete_user guest

# Створюємо адміністратора
rabbitmqctl add_user admin $(openssl rand -base64 32)
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

# Приложення—обмежені права
rabbitmqctl add_user webapp $(openssl rand -base64 32)
rabbitmqctl set_user_tags webapp
# Тільки потрібні exchange і очереди
rabbitmqctl set_permissions -p / webapp \
    "^(order|notification|user)\." \
    "^(order|notification|user)\." \
    "^(order|notification|user)\."

# Моніторинг—тільки читання
rabbitmqctl add_user monitoring $(openssl rand -base64 32)
rabbitmqctl set_user_tags monitoring monitoring

Моніторинг

Prometheus exporter вбудований з RabbitMQ 3.8:

# Включаємо плагіни
rabbitmq-plugins enable rabbitmq_prometheus rabbitmq_management

# Метрики доступні на :15692/metrics

Ключові алерти:

  • rabbitmq_queue_messages{queue="order-processing"} > 10000—очередь зростає
  • rabbitmq_node_mem_used / rabbitmq_node_mem_limit > 0.8—memory pressure
  • rabbitmq_disk_space_available_bytes < 5368709120—мало місця на диску
  • rabbitmq_nodes{running="1"} < 3—вузол кластера упав

Таймлайн

День 1—встановлення Erlang і RabbitMQ на 3 вузли, синхронізація Erlang cookie, налаштування hostname у /etc/hosts.

День 2—формування кластера, створення quorum-очередей, налаштування користувачів, policy, dead letter exchange.

День 3—налаштування HAProxy, включення Prometheus exporter, імпорт Grafana dashboard (офіційний: ID 10991), тестування відмовостійкості (вимкнення одного вузла).

День 4—інтеграція з додатком, тест продуктивності, налаштування алертів.