Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Shellbye opened this issue Aug 17, 2019 · 0 comments

Comments

@Shellbye
Copy link
Owner

Shellbye commented Aug 17, 2019

问题描述

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant