RabbitMQ HA Cluster
High-availability RabbitMQ cluster with mirrored queues, management UI, and monitoring.
Overview
RabbitMQ is an open-source message broker that implements the Advanced Message Queuing Protocol (AMQP), originally developed by Rabbit Technologies and later acquired by VMware. It serves as a reliable intermediary for message passing between applications, providing features like message persistence, routing flexibility, and delivery acknowledgments. RabbitMQ supports multiple messaging protocols including AMQP, MQTT, and STOMP, making it versatile for various messaging patterns from simple task queues to complex routing scenarios.
This high-availability cluster combines three RabbitMQ nodes with HAProxy load balancing to eliminate single points of failure in message broker infrastructure. The cluster uses Erlang's built-in clustering capabilities with mirrored queues to ensure message durability and availability even when individual nodes fail. HAProxy provides intelligent load balancing for both AMQP connections and management UI access, while Prometheus collects metrics from all components and Grafana visualizes cluster health, message rates, and queue depths.
Production environments running microservices, e-commerce platforms, or IoT systems benefit significantly from this stack when message delivery reliability is critical. The combination addresses scenarios where message loss would impact business operations or user experience, providing automatic failover, queue mirroring across nodes, and comprehensive monitoring to detect issues before they affect applications. Organizations transitioning from single RabbitMQ instances or seeking to improve their messaging infrastructure's resilience will find this cluster configuration essential for maintaining service availability.
Key Features
- Three-node RabbitMQ cluster with automatic leader election and node synchronization
- Mirrored queues across all cluster nodes ensuring message persistence during node failures
- HAProxy load balancing for AMQP connections on port 5672 with health checking
- Management UI load balancing with sticky sessions for consistent administrative access
- Prometheus metrics collection from RabbitMQ nodes including queue depths and message rates
- Grafana dashboards for real-time cluster monitoring and historical performance analysis
- Erlang cookie-based cluster authentication for secure inter-node communication
- Support for multiple messaging protocols (AMQP, MQTT, STOMP) across the cluster
Common Use Cases
- 1E-commerce platforms requiring guaranteed order processing and inventory updates
- 2Microservices architectures needing reliable inter-service communication
- 3IoT data collection systems handling sensor data from thousands of devices
- 4Financial systems processing payment transactions with zero tolerance for message loss
- 5Task queue systems distributing background jobs across multiple worker processes
- 6Event-driven architectures requiring message routing between multiple applications
- 7Enterprise integration scenarios connecting legacy systems with modern applications
Prerequisites
- Minimum 4GB RAM for the complete stack (1GB per RabbitMQ node + 1GB for monitoring)
- Docker Engine version 20.10+ with Docker Compose v2 support
- Available ports: 5672 (AMQP), 15672 (Management), 8404 (HAProxy stats), 9090 (Prometheus), 3000 (Grafana)
- Basic understanding of AMQP concepts and RabbitMQ clustering mechanisms
- Familiarity with HAProxy configuration for troubleshooting load balancer issues
- Knowledge of PromQL for customizing Prometheus queries and Grafana dashboards
For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms
docker-compose.yml
docker-compose.yml
1services: 2 rabbitmq1: 3 image: rabbitmq:3-management4 hostname: rabbitmq15 environment: 6 RABBITMQ_ERLANG_COOKIE: ${ERLANG_COOKIE}7 RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}8 RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}9 volumes: 10 - rabbitmq1_data:/var/lib/rabbitmq11 - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro12 - ./definitions.json:/etc/rabbitmq/definitions.json:ro13 networks: 14 - rabbitmq-net15 restart: unless-stopped1617 rabbitmq2: 18 image: rabbitmq:3-management19 hostname: rabbitmq220 environment: 21 RABBITMQ_ERLANG_COOKIE: ${ERLANG_COOKIE}22 RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}23 RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}24 volumes: 25 - rabbitmq2_data:/var/lib/rabbitmq26 - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro27 depends_on: 28 - rabbitmq129 networks: 30 - rabbitmq-net31 restart: unless-stopped3233 rabbitmq3: 34 image: rabbitmq:3-management35 hostname: rabbitmq336 environment: 37 RABBITMQ_ERLANG_COOKIE: ${ERLANG_COOKIE}38 RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}39 RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}40 volumes: 41 - rabbitmq3_data:/var/lib/rabbitmq42 - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro43 depends_on: 44 - rabbitmq145 networks: 46 - rabbitmq-net47 restart: unless-stopped4849 haproxy: 50 image: haproxy:latest51 ports: 52 - "5672:5672"53 - "15672:15672"54 - "8404:8404"55 volumes: 56 - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro57 depends_on: 58 - rabbitmq159 - rabbitmq260 - rabbitmq361 networks: 62 - rabbitmq-net63 restart: unless-stopped6465 prometheus: 66 image: prom/prometheus:latest67 ports: 68 - "9090:9090"69 volumes: 70 - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro71 - prometheus_data:/prometheus72 networks: 73 - rabbitmq-net74 restart: unless-stopped7576 grafana: 77 image: grafana/grafana:latest78 ports: 79 - "3000:3000"80 environment: 81 - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}82 volumes: 83 - grafana_data:/var/lib/grafana84 depends_on: 85 - prometheus86 networks: 87 - rabbitmq-net88 restart: unless-stopped8990volumes: 91 rabbitmq1_data: 92 rabbitmq2_data: 93 rabbitmq3_data: 94 prometheus_data: 95 grafana_data: 9697networks: 98 rabbitmq-net: 99 driver: bridge.env Template
.env
1# RabbitMQ Configuration2ERLANG_COOKIE=secure_erlang_cookie_value3RABBITMQ_USER=admin4RABBITMQ_PASSWORD=secure_rabbitmq_password56# Grafana7GRAFANA_PASSWORD=secure_grafana_passwordUsage Notes
- 1RabbitMQ Management at http://localhost:15672
- 2AMQP connection via HAProxy at localhost:5672
- 3HAProxy stats at http://localhost:8404
- 4Create rabbitmq.conf with cluster settings
Individual Services(6 services)
Copy individual services to mix and match with your existing compose files.
rabbitmq1
rabbitmq1:
image: rabbitmq:3-management
hostname: rabbitmq1
environment:
RABBITMQ_ERLANG_COOKIE: ${ERLANG_COOKIE}
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}
volumes:
- rabbitmq1_data:/var/lib/rabbitmq
- ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
- ./definitions.json:/etc/rabbitmq/definitions.json:ro
networks:
- rabbitmq-net
restart: unless-stopped
rabbitmq2
rabbitmq2:
image: rabbitmq:3-management
hostname: rabbitmq2
environment:
RABBITMQ_ERLANG_COOKIE: ${ERLANG_COOKIE}
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}
volumes:
- rabbitmq2_data:/var/lib/rabbitmq
- ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
depends_on:
- rabbitmq1
networks:
- rabbitmq-net
restart: unless-stopped
rabbitmq3
rabbitmq3:
image: rabbitmq:3-management
hostname: rabbitmq3
environment:
RABBITMQ_ERLANG_COOKIE: ${ERLANG_COOKIE}
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}
volumes:
- rabbitmq3_data:/var/lib/rabbitmq
- ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
depends_on:
- rabbitmq1
networks:
- rabbitmq-net
restart: unless-stopped
haproxy
haproxy:
image: haproxy:latest
ports:
- "5672:5672"
- "15672:15672"
- "8404:8404"
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
depends_on:
- rabbitmq1
- rabbitmq2
- rabbitmq3
networks:
- rabbitmq-net
restart: unless-stopped
prometheus
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
networks:
- rabbitmq-net
restart: unless-stopped
grafana
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
networks:
- rabbitmq-net
restart: unless-stopped
Quick Start
terminal
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 rabbitmq1:5 image: rabbitmq:3-management6 hostname: rabbitmq17 environment:8 RABBITMQ_ERLANG_COOKIE: ${ERLANG_COOKIE}9 RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}10 RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}11 volumes:12 - rabbitmq1_data:/var/lib/rabbitmq13 - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro14 - ./definitions.json:/etc/rabbitmq/definitions.json:ro15 networks:16 - rabbitmq-net17 restart: unless-stopped1819 rabbitmq2:20 image: rabbitmq:3-management21 hostname: rabbitmq222 environment:23 RABBITMQ_ERLANG_COOKIE: ${ERLANG_COOKIE}24 RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}25 RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}26 volumes:27 - rabbitmq2_data:/var/lib/rabbitmq28 - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro29 depends_on:30 - rabbitmq131 networks:32 - rabbitmq-net33 restart: unless-stopped3435 rabbitmq3:36 image: rabbitmq:3-management37 hostname: rabbitmq338 environment:39 RABBITMQ_ERLANG_COOKIE: ${ERLANG_COOKIE}40 RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER}41 RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD}42 volumes:43 - rabbitmq3_data:/var/lib/rabbitmq44 - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro45 depends_on:46 - rabbitmq147 networks:48 - rabbitmq-net49 restart: unless-stopped5051 haproxy:52 image: haproxy:latest53 ports:54 - "5672:5672"55 - "15672:15672"56 - "8404:8404"57 volumes:58 - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro59 depends_on:60 - rabbitmq161 - rabbitmq262 - rabbitmq363 networks:64 - rabbitmq-net65 restart: unless-stopped6667 prometheus:68 image: prom/prometheus:latest69 ports:70 - "9090:9090"71 volumes:72 - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro73 - prometheus_data:/prometheus74 networks:75 - rabbitmq-net76 restart: unless-stopped7778 grafana:79 image: grafana/grafana:latest80 ports:81 - "3000:3000"82 environment:83 - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}84 volumes:85 - grafana_data:/var/lib/grafana86 depends_on:87 - prometheus88 networks:89 - rabbitmq-net90 restart: unless-stopped9192volumes:93 rabbitmq1_data:94 rabbitmq2_data:95 rabbitmq3_data:96 prometheus_data:97 grafana_data:9899networks:100 rabbitmq-net:101 driver: bridge102EOF103104# 2. Create the .env file105cat > .env << 'EOF'106# RabbitMQ Configuration107ERLANG_COOKIE=secure_erlang_cookie_value108RABBITMQ_USER=admin109RABBITMQ_PASSWORD=secure_rabbitmq_password110111# Grafana112GRAFANA_PASSWORD=secure_grafana_password113EOF114115# 3. Start the services116docker compose up -d117118# 4. View logs119docker compose logs -fOne-Liner
Run this command to download and set up the recipe in one step:
terminal
1curl -fsSL https://docker.recipes/api/recipes/rabbitmq-ha-cluster/run | bashTroubleshooting
- RabbitMQ nodes failing to join cluster: Verify ERLANG_COOKIE environment variable is identical across all nodes and check hostname resolution
- HAProxy showing backend servers as DOWN: Check RabbitMQ management plugin is enabled and nodes are responding on port 15672
- Messages not replicating across cluster: Ensure queue mirroring policy is configured in definitions.json or applied via management UI
- High memory usage warnings: Adjust RabbitMQ memory thresholds in rabbitmq.conf and monitor queue depths for unbounded growth
- Prometheus not scraping RabbitMQ metrics: Verify prometheus_rabbitmq_exporter plugin is enabled and accessible on port 15692
- Split-brain cluster scenarios: Implement cluster partition handling strategy and check network connectivity between RabbitMQ nodes
Community Notes
Loading...
Loading notes...
Download Recipe Kit
Get all files in a ready-to-deploy package
Includes docker-compose.yml, .env template, README, and license
Components
rabbitmqhaproxyprometheusgrafana
Tags
#rabbitmq#message-queue#ha#cluster#amqp
Category
Message Queues & BrokersAd Space
Shortcuts: C CopyF FavoriteD Download