[root@rabbitmq02 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@localhost ...
[root@rabbitmq02 ~]# rabbitmqctl reset
Resetting node rabbit@localhost ...
[root@rabbitmq02 ~]# rabbitmqctl join_cluster rabbit@rabbitmq01
Clustering node rabbit@localhost with rabbit@rabbitmq01
16:55:49.806 [error] Feature flags: error while running:
Feature flags: rabbit_ff_controller:running_nodes[]
Feature flags: on node rabbit@rabbitmq01:
Feature flags: exception error: {erpc,noconnection}
Feature flags: in function erpc:call/5 (erpc.erl, line 710)
Feature flags: in call from rabbit_ff_controller:rpc_call/5 (rabbit_ff_controller.erl, line 1394)
Feature flags: in call from rabbit_ff_controller:list_nodes_clustered_with/1 (rabbit_ff_controller.erl, line 486)
Feature flags: in call from rabbit_ff_controller:check_node_compatibility_task/2 (rabbit_ff_controller.erl, line 398)
Feature flags: in call from rabbit_db_cluster:can_join/1 (rabbit_db_cluster.erl, line 60)
Feature flags: in call from rabbit_db_cluster:join/2 (rabbit_db_cluster.erl, line 92)
Feature flags: in call from erpc:execute_call/4 (erpc.erl, line 589)
Error:
{:aborted_feature_flags_compat_check, {:error, {:erpc, :noconnection}}}
[root@rabbitmq02 ~]#
你遇到的这个错误:
Error:
{:aborted_feature_flags_compat_check, {:error, {:erpc, :noconnection}}}
表示 RabbitMQ 的 副节点(rabbitmq02)在尝试与主节点(rabbitmq01)建立集群时,无法连接并调用主节点的 feature flags 服务(分布式 RPC 调用失败)。
✅ 错误核心含义
这个错误本质上是:
副节点无法与主节点 rabbit@rabbitmq01 建立 Erlang 分布式连接(ERPC 通信失败)
即副节点在执行 join_cluster 时,尝试通过 erlang RPC 与主节点通信失败,常见于:
✅ 解决方案步骤(强烈建议按顺序检查)
🔧 步骤 1:确认主节点名称一致且服务正常
在主节点 rabbitmq01 上执行:
rabbitmqctl status
应看到输出:
Status of node rabbit@rabbitmq01 ...
如果你看到 rabbit@localhost 或 rabbit@其他名,说明主节点的节点名不一致,需要设置:
# 编辑环境文件(如果未设置)
echo 'NODENAME=rabbit@rabbitmq01' > /etc/rabbitmq/rabbitmq-env.conf
systemctl restart rabbitmq-server.service
echo 'NODENAME=rabbit@rabbitmq02' > /etc/rabbitmq/rabbitmq-env.conf
systemctl restart rabbitmq-server.service
echo 'NODENAME=rabbit@rabbitmq03' > /etc/rabbitmq/rabbitmq-env.conf
systemctl restart rabbitmq-server.service
🔧 步骤 2:两节点都设置相同的
.erlang.cookie
在 主节点 执行:
cat /var/lib/rabbitmq/.erlang.cookie
将其内容复制到 副节点:
echo '<主节点内容>' > /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
🔁 建议主节点和副节点的 root 用户下也保持一致,避免 sudo rabbitmqctl 时不一致。
🔧 步骤 3:检查网络与主机名解析
在副节点(rabbitmq02)上执行:
ping rabbitmq01
如果 ping 不通,添加 /etc/hosts:
echo "192.168.x.x rabbitmq01" >> /etc/hosts
你也可以使用 IP 形式加入集群(不推荐,但可用于测试):
rabbitmqctl join_cluster rabbit@192.168.1.101
🔧 步骤 4:开放 Erlang 通信端口(默认是 25672)
两台机器都执行:
firewall-cmd --permanent --add-port=25672/tcp
firewall-cmd --reload
或者关闭防火墙进行测试(临时):
systemctl stop firewalld
🔧 步骤 5:重新执行加集群命令
在副节点 rabbitmq02 上执行完整流程:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq01
rabbitmqctl start_app
[root@rabbitmq02 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbitmq02 ...
[root@rabbitmq02 ~]# rabbitmqctl reset
Resetting node rabbit@rabbitmq02 ...
[root@rabbitmq02 ~]# rabbitmqctl join_cluster rabbit@rabbitmq01
Clustering node rabbit@rabbitmq02 with rabbit@rabbitmq01
[root@rabbitmq02 ~]#
[root@rabbitmq03 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbitmq03 ...
[root@rabbitmq03 ~]# rabbitmqctl reset
Resetting node rabbit@rabbitmq03 ...
[root@rabbitmq03 ~]# rabbitmqctl join_cluster rabbit@rabbitmq01
Clustering node rabbit@rabbitmq03 with rabbit@rabbitmq01
[root@rabbitmq03 ~]#
✅ 验证集群状态
# 在主节点或副节点查看:
rabbitmqctl cluster_status
应看到两节点都在:
[root@rabbitmq01 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq01 ...
Basics
Cluster name: rabbit@rabbitmq01
Total CPU cores available cluster-wide: 2
Disk Nodes
rabbit@rabbitmq01
rabbit@rabbitmq02
rabbit@rabbitmq03
✅ 总结与建议
以下是一个自动化 RabbitMQ 节点加入集群的脚本,适用于 CentOS 系统,目标是让副节点自动加入主节点集群,避免你每次手动处理 cookie、主机名、端口检查等操作。
✅ 自动化脚本:
join-rabbitmq-cluster.sh
#!/bin/bash
# === 配置项(根据实际情况修改) ===
CLUSTER_MASTER_HOSTNAME="rabbitmq01"
CLUSTER_MASTER_IP="192.168.1.101"
NODE_NAME=$(hostname)
COOKIE_PATH="/var/lib/rabbitmq/.erlang.cookie"
echo "========== 🐰 RabbitMQ 集群自动加入脚本 =========="
echo "👉 当前节点: $NODE_NAME"
echo "👉 目标加入主节点: $CLUSTER_MASTER_HOSTNAME ($CLUSTER_MASTER_IP)"
# === 步骤 1: 设置主机名解析 ===
echo "[Step 1] 添加主机名解析..."
grep -q "$CLUSTER_MASTER_HOSTNAME" /etc/hosts || echo "$CLUSTER_MASTER_IP $CLUSTER_MASTER_HOSTNAME" >> /etc/hosts
# === 步骤 2: 从主节点同步 cookie 文件 ===
echo "[Step 2] 同步 Erlang Cookie..."
scp root@$CLUSTER_MASTER_IP:$COOKIE_PATH $COOKIE_PATH
chmod 400 $COOKIE_PATH
chown rabbitmq:rabbitmq $COOKIE_PATH
# === 步骤 3: 停止 RabbitMQ 应用并重置 ===
echo "[Step 3] 重置当前节点 RabbitMQ..."
rabbitmqctl stop_app
rabbitmqctl reset
# === 步骤 4: 尝试加入集群 ===
echo "[Step 4] 尝试加入主节点 rabbit@$CLUSTER_MASTER_HOSTNAME..."
rabbitmqctl join_cluster rabbit@$CLUSTER_MASTER_HOSTNAME
if [ $? -eq 0 ]; then
echo "[OK] 加入成功,启动应用..."
rabbitmqctl start_app
echo "✅ 当前集群状态:"
rabbitmqctl cluster_status
else
echo "❌ 加入失败,请检查节点名、网络或 cookie 是否正确。"
fi
✅ 使用方式
1. 拷贝并粘贴保存到副节点
vi join-rabbitmq-cluster.sh
chmod +x join-rabbitmq-cluster.sh
2. 修改以下字段为你实际值:
CLUSTER_MASTER_HOSTNAME="rabbitmq01"
CLUSTER_MASTER_IP="192.168.1.101"
3. 确保副节点能 ssh 到主节点(用于拷贝 cookie)
# 如首次登录主节点需要免密或 ssh 连接能力
ssh-copy-id root@192.168.1.101
4. 执行脚本:
sudo ./join-rabbitmq-cluster.sh
🧠 脚本优点
自动配置 /etc/hosts
自动拉取 cookie 保证一致性
自动加入集群并显示结果
适配多节点部署,方便运维批量处理
评论区