kafka开启JMX_PORT,使用kafka命令行工具执行脚本时报端口被占用问题

kafka开启JMX_PORT,使用kafka命令行工具执行脚本时报端口被占用问题

遇到的原因:使用efak工具时,需要用到kafka的JMX_PORT端口引发的血案。

解决方案:
修改bin/kafka-run-class.sh文件:
找到如下代码:

if [  $JMX_PORT ]; then
  KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
fi

替换如下:

ISKAFKASERVER="false"
if [[ "$*" =~ "kafka.Kafka" ]]; then
    ISKAFKASERVER="true"
fi
if [ $JMX_PORT ] && [ "true" == "$ISKAFKASERVER" ]; then
  KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
fi

重启kafka即可。

网上大多数提供的解决方案如下,其实就是判断条件这一丝丝的差异,我个人是认为不正确的:

if [ $JMX_PORT ] && [ -z "$ISKAFKASERVER" ]; then

个人辩解:-z “$ISKAFKASERVER” 表示ISKAFKASERVER变量值长度为0时为真即ISKAFKASERVER为空串,可是上边就已经定义好了初始化并不会出现空串的情况,也就是说永远为false,所以该新增条件实际上是阻断了JMX_PORT设置的条件。

我使用的docker部署的kafka,并且开放了JMX_PORT端口,这个时候我在容器内部使用kafka客户端命令就出现地址被占用问题,然后一开始我也是网上找解决方案,找到这个,也按照上述修改了脚本重启的docker容器,此时在进入容器执行客户端命令是可以成功的,但是我发现我zookeeper中存的kafka的相关信息的JMX_PORT端口变为了-1,所以可以断定我的JMX_PORT配置失效了,没有满足条件,所以不会走设置JMX_PORT的逻辑。

总结:新加的脚本条件是判断当前参数是不是kafka服务端的命令,如果是ISKAFKASERVER为true,需要设置JMX_PORT端口,如果是客户端命令则不设置JMX_PORT端口。
所以判断逻辑修改如下,判断ISKAFKASERVER是不是为true字符串:
if [ KaTeX parse error: Expected 'EOF', got '&' at position 12: JMX_PORT ] &̲& [ "true" == "ISKAFKASERVER" ]; then
修改之后,我重启docker,zookeeper中保存的JMX_PORT也正确,客户端命令也可正常执行。
以上是我自己总结的,如果有误的话,麻烦评论回复留言或者私信,避免误人子弟,我好纠正。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值