基于Docker Swarm的双VM Weaviate多节点集群搭建失败求助
Docker Swarm搭建Weaviate多节点集群失败的排查与解决
问题概述
在两台VM上通过Docker Swarm部署Weaviate向量数据库集群时,容器已成功启动,但节点无法完成集群加入操作。日志显示节点间UDP Ping超时,互相标记对方为故障节点,最终节点2因Schema同步超时触发致命错误,集群组建失败。
关键日志分析
- 节点1日志:持续出现
Failed UDP ping: node2 (timeout reached),并将node2标记为故障节点 - 节点2日志:尝试与node1同步时出现
dial tcp 172.25.0.3:7101: i/o timeout,最终因Schema同步失败退出
解决方案
1. 验证VM间网络连通性
- 确认两台VM的主机IP可互相访问,开放以下端口(UDP/TCP均需放行):
- node1:UDP 7100、TCP 7101
- node2:UDP 7102、TCP 7103
- 关闭VM防火墙(临时测试)或添加规则:
# 在node1上执行 ufw allow 7100/udp ufw allow 7101/tcp # 在node2上执行 ufw allow 7102/udp ufw allow 7103/tcp
2. 调整Docker Compose配置
移除不必要的主机端口映射(Docker Swarm overlay网络可直接实现容器间通信),并修正集群加入地址为服务名,同时添加集群通告地址确保节点能正确识别彼此:
networks: cluster_network: driver: overlay services: weaviate-node-1: init: true command: - --host - 0.0.0.0 - --port - '8080' - --scheme - http image: semitechnologies/weaviate:1.23.6 restart: on-failure:0 volumes: - ./data-node-1:/var/lib/weaviate environment: LOG_LEVEL: 'debug' QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' ENABLE_MODULES: 'text2vec-openai,text2vec-cohere,text2vec-huggingface' DEFAULT_VECTORIZER_MODULE: 'none' CLUSTER_HOSTNAME: 'node1' CLUSTER_GOSSIP_BIND_PORT: '7100' CLUSTER_DATA_BIND_PORT: '7101' CLUSTER_ADVERTISE_ADDR: '<node1主机IP>:7100' # 替换为node1的实际主机IP networks: - cluster_network deploy: placement: constraints: - node.labels.node == node1 # 确保部署到node1 weaviate-node-2: init: true command: - --host - 0.0.0.0 - --port - '8080' - --scheme - http image: semitechnologies/weaviate:1.23.6 restart: on-failure:0 volumes: - ./data-node-2:/var/lib/weaviate environment: LOG_LEVEL: 'debug' QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' PERSISTENCE_DATA_PATH: '/var/lib/weaviate' ENABLE_MODULES: 'text2vec-openai,text2vec-cohere,text2vec-huggingface' DEFAULT_VECTORIZER_MODULE: 'none' CLUSTER_HOSTNAME: 'node2' CLUSTER_GOSSIP_BIND_PORT: '7102' CLUSTER_DATA_BIND_PORT: '7103' CLUSTER_JOIN: 'weaviate-node-1:7100' # 使用服务名替代主机IP CLUSTER_ADVERTISE_ADDR: '<node2主机IP>:7102' # 替换为node2的实际主机IP deploy: placement: constraints: - node.labels.node == node2 networks: - cluster_network
3. 重新部署集群
# 移除旧集群 docker stack rm stackdemo # 等待服务清理完成后重新部署 docker stack deploy --compose-file docker-compose.yml stackdemo
4. 验证集群状态
- 查看服务日志确认集群组建成功:
docker service logs -f stackdemo_weaviate-node-1 docker service logs -f stackdemo_weaviate-node-2 - 访问Weaviate集群状态接口:
正常情况下会返回包含两个节点的集群信息。curl http://<node1主机IP>:8080/v1/cluster
内容的提问来源于stack exchange,提问作者Kunal Singh
相关产品推荐
相关产品推荐

