Spring Boot应用无法连接Cassandra集群,抛出ConnectionInitException异常
问题详情
异常日志:
Failed to connect to the Cassandra cluster: Could not reach any contact point,
make sure you've provided valid addresses (showing first 1 nodes, use getAllErrors() for more):
Node(endPoint=/192.168.60.24:9042, hostId=null, hashCode=2b19536d):
[com.datastax.oss.driver.api.core.connection.ConnectionInitException:
[s0|control|connecting...] Protocol initialization request, step 1 (OPTIONS): failed to send request
通过Postman调用接口测试连接,请求地址:http://localhost:8080/migration/test/cassandra?cassandraHost=localhost&cassandraUsername=cassandra&cassandraPassword=cassandra
排查与解决步骤
确认Cassandra服务状态
执行命令检查节点是否正常运行:nodetool status
若服务未启动,启动Cassandra:
Linux:sudo systemctl start cassandra
Windows:运行安装目录下的cassandra.bat或启动对应服务。验证网络连通性
从Spring Boot所在机器测试Cassandra节点的网络可达性:- ping节点IP:
ping 192.168.60.24 - 测试9042端口开放情况:
telnet 192.168.60.24 9042或nc -zv 192.168.60.24 9042
- ping节点IP:
核对连接地址一致性
异常日志显示尝试连接的是192.168.60.24:9042,但请求参数传的是cassandraHost=localhost,需确认两者是否指向同一节点。若Cassandra绑定的是192.168.60.24而非localhost,请求参数应改为该IP。检查Cassandra监听配置
打开cassandra.yaml配置文件,核对以下参数:listen_address:Cassandra节点监听的IP,确保应用可访问rpc_address:客户端连接IP,若应用在其他机器,需改为可访问IP或0.0.0.0
修改后重启Cassandra服务。
验证认证配置
查看cassandra.yaml中的authenticator参数:- 若为
PasswordAuthenticator,确保传入的用户名密码正确 - 若为
AllowAllAuthenticator,则无需认证(可去掉请求中的用户名密码参数)
- 若为
排查防火墙/安全组
确保Cassandra节点的9042端口未被防火墙、安全组拦截,允许Spring Boot所在机器的访问。获取完整错误信息
在代码中调用getAllErrors()获取所有节点的错误详情,精准定位问题:try { // Cassandra连接初始化逻辑 } catch (NoHostAvailableException e) { e.getAllErrors().forEach((node, error) -> { System.err.println("节点 " + node + " 连接失败:" + error.getMessage()); }); }
内容的提问来源于stack exchange,提问作者Balaji4you

