一、現象
搭建了 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 連接。故需要對外暴露