Connecting to Cassandra JMX
Access Cassandra metrics and operations via JMX.
Local Connection (Default and Recommended)
Section titled “Local Connection (Default and Recommended)”By default, Cassandra binds the JMX port (7199) to localhost only. This is the recommended and most secure configuration. All JMX management operations should be performed locally on each node.
Security Best Practice
Keeping JMX bound to localhost eliminates network exposure and simplifies security. For cluster-wide operations, use SSH to execute commands on each node or use orchestration tools like Ansible.
nodetool (Recommended)
Section titled “nodetool (Recommended)”# Default local connectionnodetool status
# With authentication (when JMX authentication is enabled)nodetool -u cassandra -pw cassandra_password status
# With password file (recommended for scripts)nodetool -u cassandra -pwf /path/to/jmx_password_file statusJConsole
Section titled “JConsole”# Connect locallyjconsole
# Select local Cassandra process from listVisualVM
Section titled “VisualVM”# Launch VisualVMvisualvm
# Add local application# Or connect via JMX: service:jmx:rmi:///jndi/rmi://localhost:7199/jmxrmiRemote Connection (Not Recommended)
Section titled “Remote Connection (Not Recommended)”Security Consideration
Remote JMX access exposes an additional network attack surface. Consider alternatives:
- SSH tunneling: Use SSH to access nodes and run nodetool locally
- Orchestration tools: Use Ansible, Puppet, or similar for cluster-wide operations
- Monitoring agents: Deploy agents that collect JMX metrics locally
If remote JMX is required, authentication and SSL must be enabled.
Enable Remote JMX
Section titled “Enable Remote JMX”# Enable remote JMX (use only if absolutely necessary)JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote"JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=7199"JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=7199"JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=<node_ip>"
# NEVER use in production without authentication# JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"# JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false"Connect Remotely
Section titled “Connect Remotely”# nodetool (only when JMX is bound to remote interface)nodetool -h <node_ip> -p 7199 -u cassandra -pw password status
# JConsolejconsole <node_ip>:7199Secure JMX Connection
Section titled “Secure JMX Connection”Enable Authentication
Section titled “Enable Authentication”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 -Dcom.sun.management.jmxremote.access.file=/etc/cassandra/jmxremote.access"Create Password File
Section titled “Create Password File”cassandra cassandra_passwordreadonly readonly_passwordCreate Access File
Section titled “Create Access File”cassandra readwritereadonly readonlySet Permissions
Section titled “Set Permissions”chmod 400 /etc/cassandra/jmxremote.passwordchmod 400 /etc/cassandra/jmxremote.accesschown cassandra:cassandra /etc/cassandra/jmxremote.*Connect with Authentication
Section titled “Connect with Authentication”# Local connection with authenticationnodetool -u cassandra -pw cassandra_password status
# Using password file (recommended)nodetool -u cassandra -pwf /etc/cassandra/jmxremote.password statusSSL/TLS for JMX
Section titled “SSL/TLS for JMX”Generate Keystore
Section titled “Generate Keystore”keytool -genkeypair -alias jmx-server \ -keyalg RSA -keysize 2048 \ -validity 365 \ -keystore /etc/cassandra/jmx-keystore.jks \ -storepass keystorepassEnable SSL
Section titled “Enable SSL”JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=true"JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.need.client.auth=true"JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStore=/etc/cassandra/jmx-keystore.jks"JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStorePassword=keystorepass"JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStore=/etc/cassandra/jmx-truststore.jks"JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStorePassword=truststorepass"Programmatic Access
Section titled “Programmatic Access”Java Client
Section titled “Java Client”import javax.management.*;import javax.management.remote.*;import java.util.*;
public class CassandraJMX { public static void main(String[] args) throws Exception { String host = "localhost"; int port = 7199;
JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi" );
// With authentication Map<String, Object> env = new HashMap<>(); env.put(JMXConnector.CREDENTIALS, new String[]{"cassandra", "password"});
JMXConnector connector = JMXConnectorFactory.connect(url, env); MBeanServerConnection mbs = connector.getMBeanServerConnection();
// Access StorageService ObjectName storageService = new ObjectName( "org.apache.cassandra.db:type=StorageService" );
String clusterName = (String) mbs.getAttribute(storageService, "ClusterName"); System.out.println("Cluster: " + clusterName);
connector.close(); }}Python Client
Section titled “Python Client”from jmxquery import JMXConnection, JMXQuery
# Connectjmx = JMXConnection("service:jmx:rmi:///jndi/rmi://localhost:7199/jmxrmi")
# Query metricsmetrics = jmx.query([ JMXQuery(mBeanName="org.apache.cassandra.metrics:type=Client,name=connectedNativeClients", attribute="Value")])
for metric in metrics: print(f"{metric.attribute}: {metric.value}")JMX URLs
Section titled “JMX URLs”Service URL Format
Section titled “Service URL Format”service:jmx:rmi:///jndi/rmi://<host>:<port>/jmxrmiCommon Ports
Section titled “Common Ports”| Port | Purpose |
|---|---|
| 7199 | Default JMX port |
| 7200 | Alternative if 7199 in use |
Troubleshooting
Section titled “Troubleshooting”Connection Refused
Section titled “Connection Refused”# Check JMX is enabledps aux | grep cassandra | grep jmxremote
# Check port is listeningnetstat -tlnp | grep 7199ss -tlnp | grep 7199Authentication Failed
Section titled “Authentication Failed”# Check password file permissionsls -la /etc/cassandra/jmxremote.*
# Should be 400 owned by cassandra userSSL Handshake Error
Section titled “SSL Handshake Error”# Verify keystorekeytool -list -keystore /etc/cassandra/jmx-keystore.jks
# Test connection with debugjava -Djavax.net.debug=ssl -jar jmxterm.jarNext Steps
Section titled “Next Steps”- JMX MBeans - MBean reference
- JMX Metrics - Metrics guide
- Monitoring - Monitoring setup