java - Cassandra JMX java.rmi.server.ExportException : Port already in use: 7199

标签 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' 异常。

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

最佳答案

我已经找到解决办法了。问题出在下面一行:

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

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

但这并不意味着问题已经结束,因为在使用 nodetool 时,我开始收到: nodetool: 无法连接到 - ConnectIOException: '远程端点的非 JRMP 服务器'

最终的解决办法是问题出在SSL上。该协议(protocol)不支持 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"

然后一切都像魅力一样发挥作用。

关于java - Cassandra JMX java.rmi.server.ExportException : Port already in use: 7199,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33725162/

相关文章:

java - 使用 Datastax CQL 驱动程序插入 Cassandra 时设置 TTL

hash - Bloomfilter 和 Cassandra = 为什么使用以及为什么散列多次?

java - 构建处理 SSL 的 JMXConnectorServer

java - 如何链接c3p0池identityTokens和JDBC池名称

java - 动态实例化 JMX MBean

java - 使用java打开新选项卡

java - 无法从Java程序中调用外部可执行文件令人困惑

java - 使用 Map 和不同类的 NullPointerException

java - 高效地比较数千个文件 Java

node.js - Nodejs cassandra 数据类型问题