一、现象
搭建了 rocketmq 的双主双从集群,在使用同步模式下,在向 master 发送消息时,返回的消息状态码为 SLAVE_NOT_AVAILABLE
二、解决方式
这个问题是由于没有开放对应端口:
在配置文件中找到自己设置的 Master 开放端口:
rocketmq 默认端口:9876
配置的 ListenPort 端口:10911
vip 通道端口为:ListenPort - 2 = 10909
HA 通道端口为: ListenPort + 1 = 10912
需要检查 Master 是否打开了这两个端口
端口对应描述:
以配置的 ListenPort 为 10911 为例
端口号 | 作用 | 描述 |
9876 | nameserver 对外暴露的端口,允许消费者和生产者连接 | |
10909 | fastListen 端口 | 在消费者或生产者中配置 isVipChannel 为 false 即可 |
10912 | HA 高可用端口,用于主从同步,为 Master 常见新的 socket 连接 | 若没有开放,则无法连接到 Slave |
三、解决过程和原因
跟踪 log 日志
tail -f /~/log/rocketmqlogs/broker.log
发现使用了10911端口,但这是自己设置的 ListenPort 端口
初步猜测是由于端口没开放的原因,故关闭 Master 防火墙,再次发送消息,发现发送成功
由于是主从配置,猜测是某个被进程使用的端口没有对外暴露,查看当前进程使用的端口:
netstat -ntpl
找到 java 进程,有两个靠近我设置的 10911 端口的端口 10909、10912 被使用
经查询可得:
vip 通道端口为 ListenPort(10911-2) = 10909
HA 高可用端口为 ListenPort(10911+1) = 10912
那么,他们是否一定要对外暴露呢?
vip 通道端口一般没什么作用
而 HA 高可用端口用于主从集群时,创建 Master 和 Slave 之间的 socket 连接。故需要对外暴露