Skip to content

RocketMQ 集群部署 java.net.BindException: Address already in use 解决笔记 #70

Open
@Shellbye

Description

@Shellbye

问题描述

上一篇文章中,我记录了两台机器交叉部署 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 占用了,依然启动不了。

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions