EC2同子网Couchbase单节点连接正常,集群连接遇TimeoutError求助
我之前帮朋友排查过几乎一模一样的问题——单个节点能正常连接,一连集群就报TimeoutError,大概率是集群节点的网络访问限制,或者客户端获取集群节点列表后的连接逻辑出了问题,给你几个一步步排查的方向:
1. 先检查EC2安全组的端口配置,别漏了集群通信的端口
单个节点连接可能只用到了管理端口(8091),但集群模式下,客户端会从初始节点拿到整个集群的节点列表,然后要和每个节点的数据服务、查询服务等通信,所以安全组必须开放这些端口:
- 8091: 管理控制台端口(你连单个节点用的就是这个)
- 11210: 数据服务的二进制端口(核心,客户端存读数据用)
- 8092: 视图/查询服务端口
- 4369: 集群节点间Erlang通信端口
- 21100-21299: 集群内部节点的通信端口范围
重点注意:安全组不仅要允许你本地OSX的IP访问这些端口,还要允许集群内所有EC2节点互相访问这些端口——不然集群节点之间都没法通信,客户端拿到节点列表后自然连不上其他节点。
2. 确认集群节点的可访问IP配置
如果你的Couchbase集群用的是EC2私有子网IP,那本地OSX是没法直接访问这些私有IP的!这时候有两个解决办法:
- 给每个集群节点分配弹性公网IP(EIP),然后登录Couchbase控制台,在「Settings > Network」里把每个节点的「Hostname/IP」改成对应的公网IP,这样客户端拿到的节点列表都是公网可访问的。
- 或者通过VPN、SSH隧道打通本地到EC2 VPC的网络,让本地能访问集群的私有IP。
另外,连接集群时尽量指定多个初始节点,避免单个节点故障导致连接失败,代码示例:
from couchbase.cluster import Cluster, PasswordAuthenticator # 用逗号分隔多个集群节点的公网IP cluster = Cluster('couchbase://node1-eip,node2-eip') authenticator = PasswordAuthenticator('你的用户名', '你的密码') cluster.authenticate(authenticator) bucket = cluster.open_bucket('目标bucket')
3. 检查libcouchbase和Python SDK的版本适配
你用的是brew装的libcouchbase-2.8.6,加上pip装的couchbase-2.3.4,理论上兼容,但brew的预编译包有时候会和pip的SDK有路径适配问题,可以试试重新安装SDK:
先卸载现有SDK:
pip uninstall -y couchbase
然后指定brew的libcouchbase路径重新安装:
CFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib" pip install couchbase==2.3.4
如果还是不行,可以试试升级到稍新的SDK版本(比如2.5.x),注意要和libcouchbase版本匹配,libcouchbase 2.8.x可以兼容SDK 2.3到2.5版本。
4. 开启调试日志,定位具体超时的节点
有时候光看超时错误不知道是哪个节点出问题,给Python代码加个调试日志,就能看到具体是连接哪个IP/端口时超时:
import logging from couchbase.cluster import Cluster, PasswordAuthenticator # 开启DEBUG级别的日志 logging.basicConfig(level=logging.DEBUG) cluster = Cluster('couchbase://你的初始节点IP') authenticator = PasswordAuthenticator('用户名', '密码') cluster.authenticate(authenticator) bucket = cluster.open_bucket('bucket名称')
运行后看日志,会明确显示尝试连接哪个节点失败,这样就能针对性排查那个节点的网络问题。
5. 用终端工具验证网络连通性
在OSX终端用nc命令测试每个集群节点的关键端口是否能访问,比如:
# 测试数据端口11210 nc -zv 集群节点公网IP 11210 # 测试管理端口8091 nc -zv 集群节点公网IP 8091
如果某个端口连不通,要么是安全组没开,要么是节点本身的防火墙限制(EC2默认没有本地防火墙,但如果装了iptables之类的要检查)。
内容的提问来源于stack exchange,提问作者thanos

