侧边栏壁纸
博主头像
ProSayJ 博主等级

Talk is cheap. Show me the code.

  • 累计撰写 43 篇文章
  • 累计创建 16 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

RabbitMQ-集群运维常见异常之-rabbitmqctl join_cluster rabbit@rabbitmq01

YangJian
2025-06-21 / 0 评论 / 0 点赞 / 9 阅读 / 0 字
[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 与主节点通信失败,常见于:

原因分类

详细问题

主机名解析问题

rabbit@rabbitmq01 无法在副节点解析或连接

Erlang Cookie 不一致

/var/lib/rabbitmq/.erlang.cookie 不一样,分布式认证失败

端口被防火墙/iptables 拦截

Erlang 使用动态端口建立连接(默认范围 25672)

主节点 RabbitMQ 服务未启动或节点名不匹配

主节点未正确运行,或者名称不同如 rabbit@localhost


✅ 解决方案步骤(强烈建议按顺序检查)


🔧 步骤 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


✅ 总结与建议

问题

检查点

节点名不匹配

检查 NODENAME 设置是否一致

cookie 不一致

确保 .erlang.cookie 内容相同

无法连接

检查 DNS 或 /etc/hosts

端口被阻挡

放行 25672 / 防火墙

主节点未启动

rabbitmqctl status 检查主节点运行状态


以下是一个自动化 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 保证一致性

  • 自动加入集群并显示结果

  • 适配多节点部署,方便运维批量处理


0

评论区