Spring Boot 3.0.0连接IPv6环境Cassandra集群失败求助
Spring Boot 3.0.0 + Spring Data Cassandra 4.0.0 连接IPv6 Cassandra集群失败排查
问题背景
将Spring Boot升级至v3.0.0、Spring Data Cassandra升级至v4.0.0后,无法连接测试环境(stg env)的Cassandra集群。该集群采用IPv6地址,数据中心非DC1。本地可正常连接localhost的Cassandra,但测试环境连接失败,抛出AllNodesFailedException。已添加程序化配置localDC的CqlSession Bean,同时配置了application.yml,相关配置及报错日志如下:
程序化配置类
@Bean(destroyMethod = "close") public CqlSession session() { CqlSession session = CqlSession.builder() .addContactPoint(InetSocketAddress.createUnresolved("[240b:c0e0:1xx:xxx8:xxxx:x:x:x]", port)) .withConfigLoader( DriverConfigLoader.programmaticBuilder() .withString(DefaultDriverOption.LOAD_BALANCING_LOCAL_DATACENTER, localDatacenter) .withString(DefaultDriverOption.AUTH_PROVIDER_PASSWORD,password) .withString(DefaultDriverOption.CONNECTION_INIT_QUERY_TIMEOUT,"10s") .withString(DefaultDriverOption.CONNECTION_CONNECT_TIMEOUT, "20s") .withString(DefaultDriverOption.REQUEST_TIMEOUT, "20s") .withString(DefaultDriverOption.CONTROL_CONNECTION_TIMEOUT, "20s") .withString(DefaultDriverOption.SESSION_KEYSPACE,keyspace) .build()) //.addContactPoint(InetSocketAddress.createUnresolved(InetAddress.getByName(contactPoints).getHostName(), port)) .build(); } return session;
application.yml配置
spring: data: cassandra: keyspace-name: xxx contact-points: [xxxx:xxxx:xxxx:xxx:xxx:xxx] port: xxx local-datacenter: xxxx use-dc-aware: true username: xxxxx password: xxxxx ssl: true SchemaAction: CREATE_IF_NOT_EXISTS
测试环境报错日志(中文翻译)
Caused by: com.datastax.oss.driver.api.core.AllNodesFailedException: 无法连接到任何接触点,请确保提供了有效的地址(仅显示前1个节点,可调用getAllErrors()查看更多): 节点(endPoint=/[240b:cOe0:102:xxxx:xxxx:x:x:x]:3xxx,hostId=null,hashCode=4e9ba6a8): [com.datastax.oss.driver.api.core.connection.ConnectionInitException: [s0|controllid:0x984419ed,L:/[240b:cOe0:102:5dd7:xxxx:x:x:xxx]:4xxx - R:/[240b:c0e0:102:xxxx:xxxx:x:x:x]:3xxx] 协议初始化请求第1步(OPTIONS):意外失败,com.datastax.oss.driver.apt.core.connection.ClosedConnectionException: 与远程节点的连接已丢失]
排查方向
- IPv6地址格式与拼写检查
- 程序化配置中
InetSocketAddress.createUnresolved的IPv6地址无需额外加方括号,直接传入纯IPv6字符串(如"240b:c0e0:1xx:xxx8:xxxx:x:x:x")即可,Java会自动处理IPv6格式。 - 对比日志中的地址:日志里出现
cOe0(字母O)和c0e0(数字0)的差异,确认配置中的IPv6地址是否存在拼写错误。
- 程序化配置中
- 配置冲突与完整性
- Spring Data Cassandra检测到自定义
CqlSessionBean时,会忽略application.yml中的配置,导致SSL、用户名等配置未生效。需在程序化配置中补充缺失项:- 添加SSL配置:
withString(DefaultDriverOption.SSL_ENABLED, "true") - 添加用户名配置:
withString(DefaultDriverOption.AUTH_PROVIDER_USERNAME, username)
- 添加SSL配置:
- Spring Data Cassandra检测到自定义
- 数据中心名称验证
- 确认
localDatacenter的值与Cassandra集群的DC名称完全匹配(大小写敏感),可通过nodetool status命令查看集群DC名称。
- 确认
- 网络连通性验证
- 在测试环境服务器上用
nc -zv [IPv6地址] 端口测试网络连通性,确认端口未被防火墙/安全组拦截,且服务器已正确配置IPv6路由。
- 在测试环境服务器上用
- 驱动版本兼容性
- 确认Spring Data Cassandra 4.0.0对应DataStax Java Driver 4.x的依赖版本匹配,避免版本兼容问题。
内容的提问来源于stack exchange,提问作者Vaishnav Puram
相关产品推荐
相关产品推荐

