Files
KnowStreaming/docs/dev_guide/解决连接JMX失败.md
2022-09-06 15:13:03 +08:00

4.7 KiB
Raw Permalink Blame History

Logo

JMX-连接失败问题解决

集群正常接入KnowStreaming之后即可以看到集群的Broker列表此时如果查看不了Topic的实时流量或者是Broker的实时流量信息时那么大概率就是JMX连接的问题了。

下面我们按照步骤来一步一步的检查。

1、问题说明

类型一JMX配置未开启

未开启时,直接到2、解决方法查看如何开启即可。

check_jmx_opened

类型二:配置错误

JMX端口已经开启的情况下,有的时候开启的配置不正确,此时也会导致出现连接失败的问题。这里大概列举几种原因:

  • JMX配置错误:见2、解决方法
  • 存在防火墙或者网络限制:网络通的另外一台机器telnet试一下看是否可以连接上。
  • 需要进行用户名及密码的认证:见3、解决方法 —— 认证的JMX

错误日志例子:

# 错误一: 错误提示的是真实的IP这样的话基本就是JMX配置的有问题了。
2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap     : JMX connect exception, host:192.168.0.1 port:9999.
java.rmi.ConnectException: Connection refused to host: 192.168.0.1; nested exception is: 


# 错误二错误提示的是127.0.0.1这个IP这个是机器的hostname配置的可能有问题。
2021-01-27 10:06:20.730 ERROR 50901 --- [ics-Thread-1-62] c.x.k.m.c.utils.jmx.JmxConnectorWrap     : JMX connect exception, host:127.0.0.1 port:9999.
java.rmi.ConnectException: Connection refused to host: 127.0.0.1;; nested exception is: 

类型三连接特定IP

Broker 配置了内外网而JMX在配置时可能配置了内网IP或者外网IP此时 KnowStreaming 需要连接到特定网络的IP才可以进行访问。

比如:

Broker在ZK的存储结构如下所示我们期望连接到 endpoints 中标记为 INTERNAL 的地址,但是 KnowStreaming 却连接了 EXTERNAL 的地址,此时可以看 4、解决方法 —— JMX连接特定网络 进行解决。

 {
  	"listener_security_protocol_map": {"EXTERNAL":"SASL_PLAINTEXT","INTERNAL":"SASL_PLAINTEXT"},
  	"endpoints": ["EXTERNAL://192.168.0.1:7092","INTERNAL://192.168.0.2:7093"],
  	"jmx_port": 8099,
  	"host": "192.168.0.1",
  	"timestamp": "1627289710439",
  	"port": -1,
    "version": 4
  }

2、解决方法

这里仅介绍一下比较通用的解决方式,如若有更好的方式,欢迎大家指导告知一下。

修改kafka-server-start.sh文件:

# 在这个下面增加JMX端口的配置
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
    export JMX_PORT=9999  # 增加这个配置, 这里的数值并不一定是要9999
fi

 

修改kafka-run-class.sh文件

# JMX settings
if [ -z "$KAFKA_JMX_OPTS" ]; then
  KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=${当前机器的IP}"
fi

# JMX port to use
if [  $JMX_PORT ]; then
  KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
fi

3、解决方法 —— 认证的JMX

如果您是直接看的这个部分,建议先看一下上一节:2、解决方法以确保JMX的配置没有问题了。

JMX的配置等都没有问题的情况下,如果是因为认证的原因导致连接不了的,可以在集群接入界面配置你的JMX认证信息。

4、解决方法 —— JMX连接特定网络

可以手动往ks_km_physical_cluster表的jmx_properties字段增加一个useWhichEndpoint字段,从而控制 KnowStreaming 连接到特定的JMX IP及PORT。

jmx_properties格式:

{
    "maxConn": 100,           # KM对单台Broker的最大JMX连接数
    "username": "xxxxx",     # 用户名,可以不填写
    "password": "xxxx",      # 密码,可以不填写
    "openSSL": true,         # 开启SSL, true表示开启ssl, false表示关闭
    "useWhichEndpoint": "EXTERNAL"  #指定要连接的网络名称填写EXTERNAL就是连接endpoints里面的EXTERNAL地址
}

 

SQL例子

UPDATE ks_km_physical_cluster SET jmx_properties='{ "maxConn": 10, "username": "xxxxx", "password": "xxxx", "openSSL": false , "useWhichEndpoint": "xxx"}' where id={xxx};

注意:

  • 目前此功能只支持采用 ZK 做分布式协调的kafka集群。