rocketMq实战(6)-1机多broker-bug追踪

目前的机器资源还是很紧张, 单个虚拟机上只部署一个broker有点浪费.希望能实现交叉部署,如图

 
在配置文件 中配置好了 listenPort后
当一台虚拟机启动第二个 broker,报出如下异常
java.net.BindException: Address already in use: bind
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Unknown Source)
at sun.nio.ch.Net.bind(Unknown Source)
at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
at sun.nio.ch.ServerSocketAdaptor.bind(Unknown Source)
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:125)
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:498)
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1271)
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:413)
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:399)
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:1019)
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:198)
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:349)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:358)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:374)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
at java.lang.Thread.run(Unknown Source)
 
怀疑是 HaListenPort 的影响,又配置了HaListenPort
再次执行 报出相同异常,没办法,只能debug源码 去追查
使用 eclispe 本地debug broker源码,请参照 本系列文章 rocketMq实战(5)-本地调试broker源码
先加载 broker-c配置文件,再加载broker-d配置文件
broker-c配置如下
brokerClusterName=DefaultCluster
brokerName=broker-c
brokerId=0
listenPort=10911
haListenPort=10912
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
broker-d 配置如下
brokerClusterName=DefaultCluster
brokerName=broker-d
brokerId=0
listenPort=10923
haListenPort=10924
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
开始追踪

 

 
   AbstractBootstrap 是ServerBootstrap 的父类 ,此处执行 address赋值
   启动broker-d时,此处执行两次 第一次 port=23(明显是配置中的) 第二次 port=21(没有配置过啊)?

 继续追踪localAddress

 
BrokerController-initialize()
有个默认的端口号bind 规则如下


 

 设置默认端口号

 如果加载了配置文件 则获取配置文件中的端口号,到此 知道 bug产生的原因,如果两个 broker的listenPort配置 间隔小于2 则会出现上面的bug
HaListenPort 配置了也无效

 broker-c,broker-d 占用情况端口号如下

 综上所诉
HaListenPort配置上是无效的,规则:HaListenPort:nettyServerConfig.getListenPort() + 1
broker启动时有一个默认的端口号bind,规则如下
nettyServerConfig.getListenPort() - 2
由此可知 如果两个 broker的listenPort配置 间隔小于2 则会出现上面的bug.
最后我配置策略如下
broker-c: listentPort=11
broker-c: listentPort=23

猜你喜欢

转载自chenchangqun.iteye.com/blog/2345133