Open
Description
问题描述
在上一篇文章中,我记录了两台机器交叉部署 RocketMQ
集群时遇到 `` 这个错误时的解决方案,那么解决了这个问题之后再次启动,又遇到了新的问题,报错如下
java.net.BindException: Address already in use
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67)
at org.apache.rocketmq.store.ha.HAService$AcceptSocketService.beginAccept(HAService.java:177)
at org.apache.rocketmq.store.ha.HAService.start(HAService.java:109)
at org.apache.rocketmq.store.DefaultMessageStore.start(DefaultMessageStore.java:275)
at org.apache.rocketmq.broker.BrokerController.start(BrokerController.java:826)
at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:64)
at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)
看起来是端口被占用了,可不是嘛,毕竟已经启动了一个 broker
,是该换一个端口了,broker
的默认端口是 10911,那我新开一个话,就端口 +1 吧,如下配置
listenPort = 10912
好,再次启动!依然报同样的错,咋回事儿呢?
解决方案
先来看看这两个端口是怎么回事:
$ lsof -nP -i4TCP:10911 | grep LISTEN
java 31634 shellbye 98u IPv6 0x4d6a08172aaae831 0t0 TCP *:10911 (LISTEN)
$ lsof -nPl -i4TCP:10912 | grep LISTEN
java 31634 501 93u IPv6 0x4d6a08172aab04f1 0t0 TCP *:10912 (LISTEN)
居然都被上一个 broker
给占了,咋回事儿了,找了找源码,原来还有一个端口被占用,而且默认是占用的监听端口 +1 :
messageStoreConfig.setHaListenPort(nettyServerConfig.getListenPort() + 1);
所以才导致了这次乌龙事件,这样告诉我们,在设置 broker
的监听端口时,该端口的下一个端口也必须是空闲的,比如假设你把监听端口设置成了 9875,那么还是不行,为什么呢?因为 9876 被 namesvr
占用了,依然启动不了。