我正在使用 Cassandra 4 并启用了 SSL。
为了连接到 JMX,我在 cassandra-env.sh 中添加了以下选项并启动了 Cassandra
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=true"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.registry.ssl=true"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.need.client.auth=false"
JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStore=/home/murali/cassandra/cassandra4.0.13/conf/certs/keystore.cass4"
JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStorePassword=cassandra"
JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStore=/home/murali/cassandra/cassandra4.0.13/conf/certs/cassandra4.client.truststore.jks"
JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStorePassword=cassandra"
#JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.enabled.protocols=TLSv1.2"
#JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.enabled.cipher.suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
尝试如下连接 JConsole,
$ jconsole -J-Djavax.net.ssl.keyStore=certs/keystore.cass4
-J-Djavax.net.ssl.keyStorePassword=cassandra
-J-Djavax.net.ssl.trustStore=certs/cassandra4.client.truststore.jks
-J-Djavax.net.ssl.trustStorePassword=cassandra
但是使用JMX SSL连接失败。
并尝试使用 javax.rmi 包连接 java 代码,并抛出以下错误。
java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.CommunicationException \[Root exception is java.rmi.NoSuchObjectException: no such object in table\]
注意:jConsole 和 java 使用了 jdk 8 和 11,但错误是相同的。
请告诉我们您对成功连接 JMX 和查看 Cassandra 指标的建议。
如果没有 (1) 完整的错误消息和 (2) 完整的堆栈跟踪,就不可能知道失败的原因,但通常至少是以下一种(或多种):
另一件事需要注意的是,您可能正在远程连接 jconsole。默认情况下,出于安全原因,远程 JMX 连接被禁用,因为它使节点容易受到攻击,因此 JMX 只能在
localhost
上访问。
要启用JMX远程访问,您需要取消注释
cassandra-env.sh
中的以下行:
# JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=<public name>"
您需要使用可从运行 jconsole 的计算机访问的 IP 地址来配置它。然后紧接着该行添加:
LOCAL_JMX=no
请注意,您需要重新启动 Cassandra 才能使
cassandra-env.sh
中的更改生效。干杯!