Multi-Host Cluster Deployment (Standard Mode)
Environment Preparation
Prepare three machines with RabbitMQ installed (refer to installation documentation):
- 10.10.1.41
- 10.10.1.42
- 10.10.1.43
Tip: When using virtual machines, create a base VM with RabbitMQ installed, then use linked clones for efficiency.
Configuration Steps
- Modify
/etc/hostson 10.10.1.41:
sudo nano /etc/hosts
Add node mappings:
10.10.1.41 node1
10.10.1.42 node2
10.10.1.43 node3
- Set hostnames on each machine:
hostnamectl set-hostname node1 # On node1
hostnamectl set-hostname node2 # On node2
hostnamectl set-hostname node3 # On node3
- Distribute hosts file to other nodes:
sudo scp /etc/hosts root@node2:/etc/
sudo scp /etc/hosts root@node3:/etc/
- Synchronize Erlang cookie:
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/
Note: Skip this step if using cloned VMs.
Firewall Configuration
Enable required ports on all nodes:
sudo firewall-cmd --permanent --add-port={4369,5672,25672,15672}/tcp
sudo firewall-cmd --reload
Cluster Formation
- Start RabbitMQ on all nodes:
sudo systemctl start rabbitmq-server
- Join node2 to cluster:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1 --ram
rabbitmqctl start_app
- Verify cluster status:
rabbitmqctl cluster_status
- Join node3 similarly:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@node1 --ram
rabbitmqctl start_app
- Confirm all nodes appear in
cluster_statusoutput.
Single-Host Multi-Node Deployment
Environment Setup
- Use a single machine (e.g., 10.10.1.41)
Firewall Configuraton
Open ports for multiple instances:
sudo firewall-cmd --permanent --add-port={4369,5672,5673,5674,25672,25673,25674,15672,15673,15674}/tcp
sudo firewall-cmd --reload
Node Configuration
- Configure environment variables in
/etc/rabbitmq/rabbitmq-env.conf:
NODE_PORT=5672
NODE_NAME=rabbit1
- Stop default service:
sudo systemctl stop rabbitmq-server
- Start nodes manually:
# Node1
rabbitmq-server -detached
# Node2
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached
# Node3
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached
- Form cluster:
# Join rabbit2
rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit2 join_cluster rabbit1 --ram
rabbitmqctl -n rabbit2 start_app
# Join rabbit3
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset
rabbitmqctl -n rabbit3 join_cluster rabbit1 --ram
rabbitmqctl -n rabbit3 start_app
-
Verify cluster status with
rabbitmqctl cluster_status. -
Node removal:
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit1 forget_cluster_node rabbit3
Mirror Queue Configuration
- Provides high availability (see RabbitMQ HA docs)
- Standard clusters share metadata only; mirror queues replicate content
Policy Setup
- In Admin UI: Policies → Add policy
- Configure:
Name: ha-all
Pattern: ^
Apply to: Queues
Priority: 0
Definition: ha-mode = all
Policy Parameters
| ha-mode | ha-params | Description |
|---|---|---|
| all | (empty) | Mirror to all nodes |
| exactly | count | Mirror to specified number of nodes |
| nodes | nodename | Mirror to specific nodes |
Note: Mirroring reduces throughput due to synchronization overhead but provides fault tolerance.
Queue Persistence Tests
| Queue Durable | Message Persistent | Mirrored | Result |
|---|---|---|---|
| No | No | No | Data loss on node failure |
| Yes | No | No | Queue survives restart but messages lost |
| Yes | Yes | No | Same as above |
| Any | Any | Yes | Data preserved across node failures |