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也正确,客户端命令也可正常执行。
以上是我自己总结的,如果有误的话,麻烦评论回复留言或者私信,避免误人子弟,我好纠正。