Ubuntu环境下RabbitMQ集群搭建详细步骤
环境要求
/etc/hosts文件配置主机名解析)。安装Erlang与RabbitMQ
在所有节点执行以下命令安装:
# 更新软件源
sudo apt update
# 安装Erlang(通过Erlang Solutions仓库安装,确保版本兼容)
wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb && sudo dpkg -i erlang-solutions_2.0_all.deb
sudo apt update
sudo apt install -y erlang
# 安装RabbitMQ
sudo apt install -y rabbitmq-server
# 启动RabbitMQ服务并设置开机自启
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
配置主机名与hosts文件
node1、node2、node3):sudo hostnamectl set-hostname node1 # 替换为对应主机名
/etc/hosts文件,添加所有节点的IP与主机名映射(所有节点需一致):sudo vim /etc/hosts
# 示例(替换为实际IP):
192.168.1.101 node1
192.168.1.102 node2
192.168.1.103 node3
同步Erlang Cookie
Erlang Cookie是RabbitMQ节点间认证的关键(位于/var/lib/rabbitmq/.erlang.cookie),所有节点的Cookie文件内容必须完全一致:
node1上复制Cookie文件到其他节点(如node2、node3):# 在node1执行:
scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie node3:/var/lib/rabbitmq/
sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
sudo chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
启动RabbitMQ服务
在所有节点执行以下命令,确保服务处于运行状态:
sudo systemctl start rabbitmq-server
sudo systemctl status rabbitmq-server # 检查状态(应为"active (running)")
启用管理插件(可选但推荐)
为方便远程管理,启用RabbitMQ Web管理界面:
sudo rabbitmq-plugins enable rabbitmq_management
# 默认访问地址:http://<节点IP>:15672(初始用户:guest/guest,仅限本地访问)
将节点加入集群
node2、node3上执行(主节点node1无需停止):sudo rabbitmqctl stop_app
sudo rabbitmqctl reset
node2、node3上执行(以node1为主节点):sudo rabbitmqctl join_cluster rabbit@node1 # node1为主节点主机名
注:若需将节点设置为内存节点(仅缓存元数据,提升性能但不持久化),可使用
--ram参数:
sudo rabbitmqctl join_cluster --ram rabbit@node1(推荐至少保留1个磁盘节点,确保元数据不丢失)。
sudo rabbitmqctl start_app
验证集群状态
在任意节点(如node1)上执行以下命令,查看集群节点列表:
sudo rabbitmqctl cluster_status
输出示例(表示集群搭建成功):
Cluster status of node rabbit@node1
[{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]}]
镜像队列会将队列数据复制到集群中的多个节点,避免单点故障。配置所有队列镜像到所有节点的策略:
# 在任意节点执行(如node1):
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
ha-all:策略名称(可自定义);"^":匹配所有队列(正则表达式);"ha-mode":"all":表示队列数据同步到所有节点。http://<节点IP>:15672;guest(密码:guest),默认仅限本地访问;# 创建用户(如admin)
sudo rabbitmqctl add_user admin your_password
# 设置用户标签(administrator为管理员权限)
sudo rabbitmqctl set_user_tags admin administrator
# 授权用户管理所有虚拟主机
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
节点类型
网络分区处理
配置集群的分区处理策略,避免网络分区导致脑裂(集群分裂为多个独立部分):
echo 'cluster_partition_handling = pause_minority' >> /etc/rabbitmq/rabbitmq.conf
sudo systemctl restart rabbitmq-server
pause_minority:当网络分区发生时,暂停少数派节点的服务,待网络恢复后同步数据。
数据持久化
镜像队列仅保证元数据同步,若需队列中的消息持久化,需在声明队列时设置durable=true(生产者端配置):
# Python示例(使用pika库)
channel.queue_declare(queue='my_queue', durable=True)
扩容与缩容
forget_cluster_node命令)。按照以上步骤操作,即可完成Ubuntu环境下RabbitMQ集群的搭建。集群搭建后,可通过管理界面或命令行验证节点状态、队列镜像情况,确保高可用性。