Налаштування кластера 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—інтеграція з додатком, тест продуктивності, налаштування алертів.







