我们的 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.port
和 jmxremote.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/