RabbitMQ Ubuntu集群搭建详细步骤
至少准备2台Ubuntu服务器(如ubuntu1、ubuntu2),确保每台服务器满足以下条件:
curl、wget等基础工具。hostnamectl set-hostname <节点名>(如ubuntu1、ubuntu2),并通过hostname命令验证。/etc/hosts中添加集群节点IP与主机名映射(示例):192.168.1.101 ubuntu1
192.168.1.102 ubuntu2
保存后执行ping <节点名>(如ping ubuntu2)验证网络连通性。安装chrony并启用时间同步(所有节点执行):
sudo apt update && sudo apt install -y chrony
sudo systemctl enable --now chrony
sudo chronyc sources # 验证同步状态(显示“^*”表示同步成功)
RabbitMQ依赖Erlang环境,需先安装匹配版本的Erlang(以RabbitMQ 3.12为例,需Erlang/OTP 25+)。
wget -O- https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | sudo apt-key add -
echo "deb https://packages.erlang-solutions.com/ubuntu jammy contrib" | sudo tee /etc/apt/sources.list.d/erlang.list
sudo apt update
sudo apt install -y erlang erlang-asn1 erlang-crypto erlang-eldap erlang-inets erlang-os-mon erlang-public-key erlang-ssl erlang-xmerl
erl -version # 验证安装(显示Erlang版本信息)
sudo apt install -y rabbitmq-server
sudo systemctl enable --now rabbitmq-server # 启动服务并设置开机自启
sudo systemctl status rabbitmq-server # 验证状态(显示“active (running)”)
Erlang Cookie是节点间认证的关键文件,所有节点的/var/lib/rabbitmq/.erlang.cookie内容必须一致。
ubuntu1):sudo cat /var/lib/rabbitmq/.erlang.cookie # 复制cookie内容
ubuntu2):sudo rm -f /var/lib/rabbitmq/.erlang.cookie # 删除旧cookie
sudo vim /var/lib/rabbitmq/.erlang.cookie # 粘贴主节点cookie内容
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie # 设置权限(仅owner可读写)
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie # 设置所有者
为方便Web管理,在所有节点执行:
sudo rabbitmq-plugins enable rabbitmq_management
插件启用后,可通过http://<节点IP>:15672访问管理界面(默认账号guest/guest,仅限本地访问)。
在主节点(如ubuntu1)上确认RabbitMQ服务状态正常:
sudo rabbitmqctl status # 查看节点状态(显示“running”)
在从节点(如ubuntu2)上执行以下命令:
# 停止RabbitMQ应用(不关闭服务)
sudo rabbitmqctl stop_app
# 重置节点(清除本地集群数据,首次加入无需执行)
sudo rabbitmqctl reset
# 加入主节点集群(将<主节点IP>替换为实际IP)
sudo rabbitmqctl join_cluster rabbit@ubuntu1
# 启动RabbitMQ应用
sudo rabbitmqctl start_app
在任意节点执行:
sudo rabbitmqctl cluster_status
输出应显示所有节点(如ubuntu1、ubuntu2)均已加入集群,示例:
Cluster status of node rabbit@ubuntu1
[{nodes,[{disc,[rabbit@ubuntu1,rabbit@ubuntu2]}]}]
默认情况下,RabbitMQ集群仅同步队列元数据(如队列名称、绑定关系),消息存储在节点本地。需配置镜像队列实现消息冗余。
在任意节点执行(将所有队列镜像到所有节点):
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}' --priority 0 --apply-to queues
ha-mode:"all":队列在所有节点同步;ha-sync-mode:"automatic":自动同步队列内容(可选manual手动同步);--apply-to queues:策略应用于队列。创建测试队列并发送消息:
# 在主节点创建队列
sudo rabbitmqadmin declare queue name=test_queue durable=true
# 发送消息
sudo rabbitmqadmin publish exchange=amq.default routing_key=test_queue payload="Hello, RabbitMQ Cluster!"
在从节点查看队列状态:
sudo rabbitmqctl list_queues name durable policy
输出应显示test_queue的policy为ha-all,且durable为true(持久化)。
通过浏览器访问http://<节点IP>:15672,使用默认账号guest/guest登录(若需远程访问,需修改/etc/rabbitmq/rabbitmq.conf,添加loopback_users.guest = false并重启服务)。
sudo rabbitmqctl cluster_status;sudo rabbitmqctl stop_app,然后在主节点执行sudo rabbitmqctl forget_cluster_node rabbit@<节点名>;sudo systemctl restart rabbitmq-server。disc类型,存储元数据到磁盘),1个内存节点(ram类型,缓存元数据到内存);/etc/rabbitmq/rabbitmq.conf中添加cluster_partition_handling = pause_minority(暂停少数分区,避免脑裂);durable=true,发送消息时设置delivery_mode=2(持久化消息),防止节点重启后数据丢失。通过以上步骤,即可完成RabbitMQ在Ubuntu环境下的集群搭建,实现高可用性与负载均衡。