RabbitMQ在Ubuntu上的扩展方法
RabbitMQ的扩展主要通过集群部署(水平扩展节点)和镜像队列(高可用性扩展)实现,以下是针对Ubuntu系统的详细操作步骤:
一、前置准备
-
安装Erlang环境
RabbitMQ基于Erlang开发,需先安装兼容版本的Erlang(如RabbitMQ 3.9需Erlang OTP 22+)。在Ubuntu上可通过以下命令安装:sudo apt update sudo apt install erlang安装完成后,通过
erl -version验证版本是否符合要求。 -
安装RabbitMQ Server
在所有需要扩展的节点上安装RabbitMQ:sudo apt update sudo apt install rabbitmq-server安装完成后,启动服务并设置为开机自启:
sudo systemctl start rabbitmq-server sudo systemctl enable rabbitmq-server -
配置Erlang Cookie
RabbitMQ节点间通过Erlang Cookie(位于/var/lib/rabbitmq/.erlang.cookie)认证通信。需确保所有节点的Cookie文件内容一致且权限正确(400,属主为rabbitmq:rabbitmq)。- 从主节点复制Cookie到其他节点:
scp /var/lib/rabbitmq/.erlang.cookie user@node2:/var/lib/rabbitmq/ scp /var/lib/rabbitmq/.erlang.cookie user@node3:/var/lib/rabbitmq/ - 修改权限:
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
- 从主节点复制Cookie到其他节点:
二、构建RabbitMQ集群(水平扩展节点)
-
配置节点主机名与hosts文件
- 为每个节点设置静态hostname(如
rmq1、rmq2、rmq3):hostnamectl set-hostname rmq1 --static - 在所有节点的
/etc/hosts文件中添加节点IP与hostname映射(确保同一局域网内能互相解析):192.168.1.100 rmq1 192.168.1.101 rmq2 192.168.1.102 rmq3
- 为每个节点设置静态hostname(如
-
启动主节点并验证状态
在主节点(如rmq1)上启动RabbitMQ服务,检查集群状态:sudo systemctl start rabbitmq-server sudo rabbitmqctl status确认服务运行正常(
Status: running)。 -
将其他节点加入集群
在从节点(如rmq2、rmq3)上执行以下命令:- 停止RabbitMQ服务:
sudo systemctl stop rabbitmq-server - 加入主节点集群(
rabbit@主节点hostname):sudo rabbitmqctl join_cluster rabbit@rmq1 - 启动从节点服务:
sudo systemctl start rabbitmq-server
- 停止RabbitMQ服务:
-
验证集群状态
在任意节点上运行cluster_status命令,查看所有节点是否加入集群:sudo rabbitmqctl cluster_status输出应包含所有节点的
running状态(如rabbit@rmq1、rabbit@rmq2)。
三、配置镜像队列(高可用性扩展)
镜像队列将队列数据复制到集群中的多个节点,避免单点故障。设置所有队列镜像的策略如下:
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
ha-all:策略名称(可自定义);"^":匹配所有队列(也可指定队列前缀,如"order_");"ha-mode":"all":表示队列数据复制到所有节点。
设置后,新创建的队列会自动镜像到所有节点。若需修改现有队列,需先删除旧队列再重新创建。
四、扩展后的验证
-
节点状态验证
通过cluster_status确认所有节点处于running状态,且running节点数等于集群总节点数。 -
队列镜像验证
在任意节点创建队列(如test_queue),然后在其他节点查看队列是否存在(sudo rabbitmqctl list_queues name durable),并确认durable属性为true(表示镜像队列)。 -
故障转移验证
停止主节点服务(sudo systemctl stop rabbitmq-server),检查其他节点是否能自动接管队列(通过cluster_status查看节点状态,通过生产者/消费者测试消息收发是否正常)。
注意事项
- 版本一致性:所有集群节点的RabbitMQ和Erlang版本必须一致,否则会导致集群无法正常工作。
- 网络连通性:节点间需开放
4369(Erlang端口映射)、5672(AMQP协议)、15672(管理界面)等端口。 - 数据持久化:镜像队列需配合队列的
durable属性(true)和消息的persistent属性(true),确保消息不丢失。