Cassandra 3.11.2 JMX指定网卡绑定失败及连接被拒求助
从你的描述来看,JMX已经成功绑定到指定网卡192.168.1.100:7199,但nodetool连接被拒绝,这通常和JMX认证配置、防火墙拦截或者RMI参数设置有关。下面是一步步的排查和解决方法:
1. 检查JMX认证配置
当LOCAL_JMX=no时,Cassandra默认会启用JMX认证,但你的cassandra-env.sh配置里没有明确设置认证相关参数,这会导致连接请求被拒绝。
临时关闭认证(仅测试环境)
如果是测试环境,可以在else块中添加关闭认证和SSL的参数:
else JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.remote.port=$JMX_PORT" JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT" JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=192.168.1.100" # 添加以下两行关闭认证和SSL JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false" JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false" fi
生产环境配置认证
生产环境建议开启认证,需要:
- 创建JMX认证文件(默认路径是
/etc/cassandra/jmxremote.password和/etc/cassandra/jmxremote.access) - 在
cassandra-env.sh中添加认证参数:
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"
注意要设置文件权限为600,并确保Cassandra进程用户拥有读取权限。
2. 验证防火墙设置
虽然netstat显示端口在监听,但防火墙可能拦截了外部连接请求。执行以下命令开放7199端口(以iptables为例):
iptables -A INPUT -p tcp --dport 7199 -s 192.168.1.0/24 -j ACCEPT # 保存规则 iptables-save > /etc/iptables/rules.v4
如果使用ufw:
ufw allow from 192.168.1.0/24 to any port 7199 ufw reload
3. 确认Cassandra启动时加载了正确的JVM参数
查看Cassandra的启动日志(默认路径/var/log/cassandra/system.log),搜索JVM_OPTS相关的日志,确认java.rmi.server.hostname、jmx.remote.port等参数是否正确加载。例如:
INFO [main] 202x-xx-xx xx:xx:xx,xxx CassandraDaemon: JVM Arguments: [-Dcassandra.jmx.remote.port=7199, -Dcom.sun.management.jmxremote.rmi.port=7199, -Djava.rmi.server.hostname=192.168.1.100, ...]
4. 用JMX工具直接测试连接
使用jconsole工具测试JMX连接,确认是否是nodetool的问题:
jconsole 192.168.1.100:7199
如果jconsole能连接,说明问题出在nodetool的配置上,可以检查~/.cassandra/nodetoolrc文件,确保里面的参数和cassandra-env.sh匹配:
host=192.168.1.100 port=7199
5. 检查端口占用情况
确保7199端口没有被其他进程占用:
lsof -i :7199
如果显示的进程不是Cassandra,需要停止占用进程或者修改JMX端口。
完成以上步骤后,重启Cassandra服务,再尝试用nodetool连接:
systemctl restart cassandra nodetool -h 192.168.1.100 status
内容的提问来源于stack exchange,提问作者ozzieisaacs

