You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:54:49