一、问题现象深度解析
当开发者使用weaviate.Client()初始化连接时,控制台可能抛出以下典型错误:
ConnectionError: Failed to connect to Weaviate server at http://localhost:8080. Reason: [Errno 111] Connection refused
该错误表明Python客户端无法建立与Weaviate服务端的TCP连接,通常发生在以下场景:
- 服务未启动:Weaviate的docker容器或二进制服务未运行
- 端口冲突:8080端口被其他应用程序占用
- 网络隔离:Docker默认网络配置阻止外部访问
- 认证错误:启用认证后未提供正确API密钥
二、六步诊断与解决方案
1. 基础服务状态检查
执行Docker容器状态验证命令:
docker ps -a | grep weaviate
正常运行的容器应显示类似:
weaviate latest "bin/weaviate" Up 2 minutes 0.0.0.0:8080->8080/tcp
2. 网络连通性测试
使用Python的requests库进行手动测试:
import requests
try:
resp = requests.get("http://localhost:8080/v1/meta")
print(resp.status_code)
except Exception as e:
print(f"Connect failed: {str(e)}")
3. 客户端配置优化
推荐的安全连接配置模板:
import weaviate
client = weaviate.Client(
url="http://localhost:8080",
timeout_config=(5, 15), # 连接/读取超时
additional_headers={
"X-OpenAI-Api-Key": "your-key"
}
)
4. 防火墙与端口处理
Linux系统下检查端口占用:
sudo netstat -tulnp | grep 8080
如需释放端口:
sudo kill -9 $(lsof -ti:8080)
5. 容器网络模式调整
启动Docker时指定host网络模式:
docker run --net=host -d weaviate/weaviate
6. 日志深度分析
获取Weaviate服务端详细日志:
docker logs --tail 50 weaviate 2>&1 | grep -i error
三、高级预防措施
- 健康检查机制:实现重试逻辑和熔断机制
- 连接池配置:使用
urllib3优化TCP连接复用 - 多节点部署:配置集群模式提高可用性
四、典型错误对照表
| 错误现象 | 根本原因 | 解决方案 |
|---|---|---|
| Connection refused | 服务未监听端口 | 检查docker-compose.yml配置 |
| Timeout exceeded | 网络延迟过高 | 调整timeout_config参数 |