hosts配置导致jmx无法连接远程jvm

近日团队有一个集群项目部分机器发生了宕机,于是想通过jvisualvm远程连接到集群机器,可是部分机器能正常建立jmx连接,查看远程jvm统计信息。部分机器在连接过程中弹出错误窗口,显示无法使用service:jmx:rmi:///jndi/rmi://controller:8777/jmxrmi连接到controller:8777

远程集群所有机器的jmx相关配置为

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8777
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.rmi.port=8777

jvisualvm连接过程中,在远程机器上查看tcp连接情况:

$ jps
27506 controller-launcher.jar
17784 RegistryImpl
27708 Main
28925 Jps
$ netstat -tlpna | grep 8777
tcp 0 0 0.0.0.0:8777 0.0.0.0:* LISTEN 27708/java

进程在监听8777端口,但是没有建立tcp连接。

在jvisualvm所在机器上ping远程机器能ping通,说明网络没问题。
由于远程机器的jmx配置没有配置 -Djava.rmi.server.hostname,它的官方解释为:

java.rmi.server.hostname
The value of this property represents the host name string that should be associated with remote stubs for locally created remote objects, in order to allow clients to invoke methods on the remote object. The default value of this property is the IP address of the local host, in "dotted-quad" format.

By default, the remote stubs for locally created remote objects that are sent to client contains the IP address of the local host in dotted-quad format. For remote stubs to be associated with a specific interface address, the java.rmi.server.hostname system property must be set to IP address of that interface.

说明jmx server默认是在local host的ip地址上提供RMI服务

在远程机器上查看主机名对应的ip地址:

$ host controller
controller has address 10.242.93.40
$ hostname -i
10.85.35.39

原来主机名的dns注册地址与本地解析的地址不一致,查询/etc/hosts配置文件内容:

$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.85.35.39 controller

原来不知哪位同事修改了/etc/hosts文件,并为主机名设置了一个与公司在dns上登记的不一样的ip地址。

删除掉/etc/hosts文件中配置内容:10.85.35.39 controller,重新启动controller,jvisualvm就可以正常连接远程机器,监视jvm运行数据了。

这里如果不改/etc/hosts中的配置,通过-Djava.rmi.server.hostname=10.242.93.40 jmx选项明确指定jmx server远程调用服务关联的ip地址为10.242.93.40,jvisualvm也可以连接上远程机器

你可能感兴趣的:(hosts配置导致jmx无法连接远程jvm)