今天下午,有用户反馈直播间人数不对,负责这块的同事准备让运维重启这个服务紧急处理。发现服务无法重启,于是我开始帮忙协助排查这块问题。

随即打开日志,发现如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[2025-06-30 14:50:46]
content: Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - home node 'rabbit@prod-rabbitmq3' of durable queue 'live.watchingOnlineUser.start' in vhost '/xxxx' is down or inaccessible, class-id=50, method-id=10)

[2025-06-30 14:50:46]
content: at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)

[2025-06-30 14:50:46]
content: at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)

[2025-06-30 14:50:46]
content: at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:502)

[2025-06-30 14:50:46]
content: at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:293)

[2025-06-30 14:50:46]
content: at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:141)

[2025-06-30 14:50:46]
content: ... 13 common frames omitted

可以看到,队列live.watchingOnlineUser.close最初创建在节点prod-rabbitmq3上,prod-rabbitmq3节点宕机或无法访问了,导致无法路由消息到这个队列,因为:

  1. 该队列是持久化的(本应写入磁盘)。
  2. 它的节点prod-rabbitmq3已宕机。
  3. 该队列没有配置 HA 到其它节点。

解决方案

紧急处理

  1. 重启宕机节点,尽快恢复运行。
  2. 删除并重建队列(如果接受数据丢失)
1
rabbitmqadmin delete queue name='live.watchingOnlineUser.close' vhost='/xxxx'

长期解决方案

配置队列镜像,也就是开启镜像集群模式。(由此推断出之前运维使用的是:普通模式)

1
rabbitmqctl set_policy ha-queues "^live\." '{"ha-mode":"all"}' --apply-to queues --vhost /xxxx

这条命令会给所有以live.开头的队列设置全节点镜像。

重启相关命令

接下来梳理一下相关命令

查看集群状态

1
rabbitmqctl cluster_status

这会显示当前集群中所有节点的状态,确认节点是否显示为down

查看节点状态

1
rabbitmqctl status

重启服务

1
systemctl restart rabbitmq-server

检查启动日志

1
2
3
4
5
# 查看最近的日志
journalctl -u rabbitmq-server --since "5 minutes ago" -f

# 或查看日志文件
tail -f /var/log/rabbitmq/rabbit@prod-rabbitmq3.log

常见问题处理

如果启动失败:检查磁盘空间,内存,端口冲突

1
2
3
4
# 检查磁盘空间,内存,端口冲突
df -h
free -h
netstat -tulnp | grep 5672

如果节点无法重新加入集群

可能需要重置节点并重新加入集群:

1
2
3
4
5
6
7
8
9
10
11
# 首先停止服务
systemctl stop rabbitmq-server

# 重置节点状态(注意:这会清除本地数据)
rabbitmqctl reset

# 重新加入集群
rabbitmqctl join_cluster rabbit@<其他健康节点名>

# 启动服务
systemctl start rabbitmq-server