RabbitMQ在Ubuntu上的集群搭建步骤
rabbit1、rabbit2),确保IP可达(如192.168.1.101、192.168.1.102)。/etc/hosts文件,添加集群节点IP与主机名映射(如192.168.1.101 rabbit1、192.168.1.102 rabbit2),并通过ping命令验证连通性。ntp或chrony服务,确保所有节点时间一致(避免集群因时间差异出现问题)。RabbitMQ基于Erlang开发,需先安装相同版本的Erlang(建议使用RabbitMQ官方推荐的Erlang版本,可通过rabbitmq-server官方文档查询兼容版本)。
安装Erlang:在所有节点执行以下命令(以Ubuntu 22.04为例):
sudo apt update
sudo apt install -y erlang
安装RabbitMQ:添加RabbitMQ官方APT源(替换为最新版本链接),然后安装:
# 导入RabbitMQ签名密钥
wget -O- https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey | sudo apt-key add -
echo "deb https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
sudo apt update
sudo apt install -y rabbitmq-server
启动服务:安装完成后,RabbitMQ会自动启动,验证状态:
sudo systemctl status rabbitmq-server # 应显示"active (running)"
启用管理插件(可选但推荐):为方便远程管理,启用Web管理界面:
sudo rabbitmq-plugins enable rabbitmq_management
管理界面默认端口为15672(如http://<节点IP>:15672),初始账号为guest(仅本地访问)。
Erlang通过Cookie文件实现节点间认证,所有集群节点的Cookie内容必须完全一致。
Cookie位置:默认路径为/var/lib/rabbitmq/.erlang.cookie(属主为rabbitmq,权限400)。
同步步骤:
rabbit1)上复制Cookie文件到其他节点:scp /var/lib/rabbitmq/.erlang.cookie rabbit2:/var/lib/rabbitmq/
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
验证Cookie一致性:通过cat命令检查所有节点的Cookie内容是否相同。
以rabbit1为主节点,将rabbit2加入集群:
在从节点(rabbit2)上执行:
sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
rabbit@<主节点主机名>):sudo rabbitmqctl join_cluster rabbit@rabbit1
sudo rabbitmqctl start_app
验证集群状态:在任意节点执行以下命令,查看所有节点是否加入:
sudo rabbitmqctl cluster_status
输出应包含所有节点的disc(磁盘节点)或ram(内存节点)状态。
默认情况下,队列仅在单个节点存储,若需实现队列冗余(所有节点都有队列副本),需配置镜像队列策略:
设置镜像策略(将所有队列镜像到所有节点):
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
ha-all:策略名称(可自定义)。"^":匹配所有队列(正则表达式)。ha-mode":"all":表示所有节点都存储队列副本。验证镜像效果:创建队列后,通过管理界面或rabbitmqctl list_queues命令查看队列的Mirrored状态。
--ram)用于提升性能(但重启后数据丢失)。/etc/rabbitmq/rabbitmq.conf中添加以下配置,避免网络分区导致脑裂:cluster_partition_handling = pause_minority
durable=true,消息设置delivery_mode=2(持久化消息),确保节点重启后数据不丢失。sudo rabbitmqctl forget_cluster_node rabbit@<节点主机名>)。