如何用Docker Compose搭建非外部API向量化器的多节点Weaviate集群?
双节点Weaviate集群+高可用向量化器配置方案
核心架构思路
- 部署2个Weaviate节点组成集群,通过内部gossip协议实现节点通信与数据同步
- 至少部署2个
transformers-inference实例,避免向量化服务单点故障 - 用Nginx作为负载均衡,统一接收Weaviate的向量化请求并转发到多个transformers实例,实现服务高可用
完整docker-compose.yml配置
以下是包含双节点Weaviate、双transformers实例、Nginx负载均衡的完整配置:
version: '3.4' services: # Weaviate节点1 weaviate-node1: image: semitechnologies/weaviate:1.18.3 ports: - "8080:8080" environment: DEFAULT_VECTORIZER_MODULE: text2vec-transformers ENABLE_MODULES: text2vec-transformers,backup-s3 # 指向Nginx负载均衡的内部地址 TRANSFORMERS_INFERENCE_API: http://t2v-loadbalancer:80 CLUSTER_HOSTNAME: 'node1' CLUSTER_JOIN: 'weaviate-node2' PERSISTENCE_DATA_PATH: "./data/node1" QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' AUTHORIZATION_ADMINLIST_ENABLED: 'false' volumes: - weaviate-data-node1:/var/lib/weaviate restart: unless-stopped # Weaviate节点2 weaviate-node2: image: semitechnologies/weaviate:1.18.3 ports: - "8081:8080" environment: DEFAULT_VECTORIZER_MODULE: text2vec-transformers ENABLE_MODULES: text2vec-transformers,backup-s3 TRANSFORMERS_INFERENCE_API: http://t2v-loadbalancer:80 CLUSTER_HOSTNAME: 'node2' CLUSTER_JOIN: 'weaviate-node1' PERSISTENCE_DATA_PATH: "./data/node2" QUERY_DEFAULTS_LIMIT: 25 AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' AUTHORIZATION_ADMINLIST_ENABLED: 'false' volumes: - weaviate-data-node2:/var/lib/weaviate restart: unless-stopped # Transformers向量化器实例1 t2v-transformers-1: image: semitechnologies/transformers-inference:sentence-transformers-multi-qa-MiniLM-L6-cos-v1 environment: ENABLE_CUDA: 1 # 多GPU场景下可指定设备,比如 CUDA_VISIBLE_DEVICES: 0 restart: unless-stopped deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] # Transformers向量化器实例2 t2v-transformers-2: image: semitechnologies/transformers-inference:sentence-transformers-multi-qa-MiniLM-L6-cos-v1 environment: ENABLE_CUDA: 1 # 多GPU场景下可指定设备,比如 CUDA_VISIBLE_DEVICES: 1 restart: unless-stopped deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] # Nginx负载均衡 t2v-loadbalancer: image: nginx:alpine volumes: - ./nginx.conf:/etc/nginx/nginx.conf ports: - "8000:80" depends_on: - t2v-transformers-1 - t2v-transformers-2 restart: unless-stopped volumes: weaviate-data-node1: weaviate-data-node2:
配套Nginx配置文件(nginx.conf)
在docker-compose.yml同级目录创建nginx.conf,实现轮询负载均衡:
events { worker_connections 1024; } http { upstream transformers { server t2v-transformers-1:8080; server t2v-transformers-2:8080; # 可添加更多transformers实例 } server { listen 80; location / { proxy_pass http://transformers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
关键配置说明
Weaviate集群配置
- 两个节点通过
CLUSTER_JOIN参数互相指定对方,自动组建集群 - 所有Weaviate节点均指向Nginx负载均衡地址,而非单个transformers实例,避免单点依赖
- 每个节点挂载独立数据卷,确保数据存储隔离
- 两个节点通过
向量化器高可用
- 部署至少2个transformers实例,当其中一个故障时,Nginx会自动将请求转发至正常实例
- 多GPU环境下,可通过
CUDA_VISIBLE_DEVICES为每个实例分配独立GPU,提升并行处理能力
负载均衡策略
- 默认采用轮询策略,也可根据业务需求调整为加权轮询、IP哈希等策略
- Nginx与transformers实例处于同一Docker网络,内部通信无需暴露外部端口
启动与验证
- 将
docker-compose.yml和nginx.conf放在同一目录 - 执行启动命令:
docker-compose up -d - 验证Weaviate集群状态:访问任意节点的
/v1/cluster/nodes端点(如http://localhost:8080/v1/cluster/nodes),应返回2个节点的详细信息 - 验证向量化服务:通过Weaviate导入测试数据,观察两个transformers实例的日志,确认请求被轮询转发
内容的提问来源于stack exchange,提问作者junbetterway
相关产品推荐
相关产品推荐

