Cassandra JMX java.rmi.server.ExportException:端口已在使用中:7199

时间:2015-11-15 21:17:41

标签: java cassandra jmx

除了一件事,我们的Cassandra 2.2集群(在CentOS 7上)工作正常。只要我将LOCAL_JMX=no放入 cassandra-env.sh ,Cassandra就无法启动以下错误:

Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 7199; nested exception is:
    java.net.BindException: Address already in use

相关配置如下:

  JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
  JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT"
  JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false"
  JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=true"
  JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password"
  JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStore=/etc/pki/cassandra/keys/.keystore"
  JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStorePassword=password1"
  JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStore=/etc/pki/cassandra/certs/.truststore"
  JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStorePassword=password2"
  JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.need.client.auth=true"
  JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.registry.ssl=true"

我确实验证了端口上是否有任何东西在运行,而且它不是。如果我改变端口,结果相同。 有助于为jmxremote.portjmxremote.rmi.port使用不同的端口,尽管它违反了手册中的建议。不幸的是,即使我无法使用 nodetool 获取NoSuchObjectException: 'no such object in table'例外。

有什么想法吗?非常感谢。

3 个答案:

答案 0 :(得分:3)

我找到了解决方案。问题出在以下几行:

JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false"

当我将其切换为true时,可以使用上面提到的设置(使用公共端口)启动Cassandra。

然而,这并不意味着问题已经结束,因为在使用 nodetool 时,我开始得到:nodetool: Failed to connect to - ConnectIOException: 'non-JRMP server at remote endpoint'

最终解决方案是问题出在SSL中。该协议不支持JMX。因此,唯一的解决方案是关闭它,工作配置如下:

JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=true"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password"
JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStore=/etc/pki/cassandra/keys/.keystore"
JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStorePassword=password1"
JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStore=/etc/pki/cassandra/certs/.truststore"
JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStorePassword=password2"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.need.client.auth=false"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.registry.ssl=false"

然后一切都像魅力一样。

答案 1 :(得分:2)

我遇到了同样的问题,我也启用了

JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=true"

然而,当我使用--ssl选项运行nodetool时,我能够进行身份验证而没有任何问题。也许你错过了--ssl选项?

答案 2 :(得分:0)

Cassandara也与VMware发生冲突。停止VMware服务后,Cassandra正确启动。