Couchbase Java SDK:已成功打开Bucket但查询时连接超时
问题场景
Java初始化Couchbase客户端时,日志显示客户端已成功创建并打开Bucket:
2023-04-22T15:44:28.624000+0200 [INFO] com.couchbase.client.core.node.Node [cb-io-1-3] Connected to Node foo
2023-04-22T15:44:28.674000+0200 [INFO] com.couchbase.client.core.node.Node [cb-io-1-3] Disconnected from Node foo
2023-04-22T15:44:28.731000+0200 [INFO] com.couchbase.client.core.config.ConfigurationProvider [cb-computations-3] Selected network configuration: default
2023-04-22T15:44:28.753000+0200 [INFO] com.couchbase.client.core.config.ConfigurationProvider [cb-computations-3] Opened bucket bucket-name
但执行Bucket查询时出现连接超时异常:
2023-04-22T15:45:43.738000+0200 [WARN] com.couchbase.client.core.endpoint.Endpoint [cb-io-1-4] [10.10.7.100:11210][KeyValueEndpoint]: Could not connect to remote socket: Operation timed out: /xxx:11210
2023-04-22T15:45:43.741000+0200 [WARN] com.couchbase.client.core.endpoint.Endpoint [cb-io-1-6] [10.10.7.114:11210][KeyValueEndpoint]: Could not connect to remote socket: Operation timed out: /xxx:11210
已尝试将客户端超时时间延长至数分钟,但仅延迟了错误出现的时间。此外,使用Couchbase SDK Doctor时也无法连接指定DNS:
[ERRO] Failed to fetch configuration via cccp from
cb-dns:11207(error: tls: first record does not look like a TLS handshake)
[ERRO] Failed to fetch terse configuration via http fromcb-dns:18091(error: Get "http://cb-dns:18091/pools/default/b/bucket-name": context deadline exceeded (Client.Timeout exceeded while awaiting headers))
[ERRO] All endpoints specified by your connection string were unreachable, further cluster diagnostics are not possible
可能原因及解决办法
1. 集群节点服务端口无法访问
日志中11210是Couchbase的KV服务端口,超时说明客户端机器无法连通该端口:
- 用
telnet 10.10.7.100 11210或nc -zv 10.10.7.100 11210测试端口连通性,确认端口是否开放。 - 检查集群侧防火墙、安全组规则,确保允许客户端机器访问11210、11207(CCCP端口)、18091(REST端口)等核心服务端口。
2. DNS解析或TLS配置不匹配
SDK Doctor的报错指向DNS连接和TLS握手问题:
- 执行
nslookup cb-dns或dig cb-dns,确认cb-dns能否正确解析到集群节点IP。 - 核对TLS配置:若集群启用了TLS,客户端连接字符串需指定
ssl=true并配置正确的证书路径;若集群未启用TLS,客户端需关闭TLS连接,避免握手失败。
3. 集群网络配置返回内部IP
日志显示Selected network configuration: default,若集群配置的是内部通信IP,客户端获取配置后无法访问实际节点:
- 登录Couchbase控制台,检查集群的网络配置,确保对外暴露的IP是客户端可访问的公网/跨网段IP。
4. 临时连接与实际查询的网络差异
初始化时的Connected to Node foo只是短暂获取集群元数据的临时连接,并未维持长连接。后续查询需要建立实际KV连接,此时网络不通就会触发超时:
- 确认客户端与集群之间的网络链路是否稳定,排查是否存在路由跳转、NAT转发异常等问题。
5. Bucket权限验证问题
虽然日志显示Opened bucket bucket-name,但可能仅获取了元数据,实际查询时权限不足:
- 在Couchbase控制台检查客户端使用的账号是否拥有目标Bucket的读写权限。
内容的提问来源于stack exchange,提问作者Niko

