1. 从单机到集群:为什么你的Milvus需要高可用
如果你已经用Docker Compose成功跑起来一个单机版的Milvus,恭喜你,你已经迈出了向量数据库应用的第一步。我刚开始接触Milvus的时候,也是这么干的,一个docker-compose up -d,几分钟就能开始测试向量搜索,感觉特别方便。但是,当我把这个“玩具”部署到真正的生产环境,准备处理千万级甚至上亿的向量数据时,问题就接踵而至了。
我记得很清楚,有一次半夜收到告警,说我们的AI推荐服务挂了。一查,发现是那台跑着Milvus单机版的服务器磁盘IO打满,导致整个服务无响应。虽然数据因为配置了持久化卷没丢,但服务中断了将近半小时,影响很不好。那次之后我才彻底明白,对于企业级应用来说,能用和好用、可靠完全是两码事。单机部署的Milvus(Standalone模式)只适合开发、测试或者非常小规模的场景。它所有的组件——计算节点、查询节点、索引节点、对象存储(MinIO)、元数据存储(etcd)——都挤在一个容器里。这就好比把公司的财务、行政、研发、市场都塞进一个小单间办公,一个人请假,整个公司就停摆了。
所以,我们今天要聊的“企业级部署”,核心目标就是高可用和可扩展性。高可用(High Availability, HA)意味着你的向量数据库服务要能7x24小时不间断运行,即使某个硬件或软件组件发生故障,也能自动切换,保证业务无感知。而可扩展性,则是为了应对未来数据量和查询并发量的增长。Milvus的集群模式(Cluster)正是为此而生。它将各个组件拆分开来,独立部署和伸缩。比如,你可以单独增加查询节点(QueryNode)来应对更高的搜索并发,或者增加数据节点(DataNode)来加速数据导入。这种架构才是支撑起生产环境重担的“正规军”。
从Docker Compose单机版过渡到高可用集群,听起来好像很复杂,但其实思路是清晰的。你可以把它想象成搭建一个高可用的网站:你需要多台应用服务器(Milvus的工作节点),需要负载均衡器(Milvus的Proxy),需要共享存储(MinIO集群),还需要一个可靠的配置中心(etcd集群)。我们接下来的内容,就是手把手带你,用你熟悉的Docker Compose工具,一步步搭建起这样一个坚固的堡垒。
2. 搭建高可用集群:手把手配置Docker Compose
好了,理论说再多不如动手做一遍。我们直接来看如何用Docker Compose定义一套最小化的Milvus高可用集群。是的,你没看错,Docker Compose不仅能跑单机,也能用来定义和启动一个多容器的集群环境,这对于在单台开发机或者资源有限的服务器上模拟生产环境特别有用。当然,真正的生产环境可能会用Kubernetes来编排,但用Compose来理解和搭建是整个学习过程中不可或缺的一环。
首先,我们需要一个全新的目录来管理集群配置。
mkdir -p ~/milvus-ha-cluster && cd ~/milvus-ha-cluster
接下来是重头戏:编写 docker-compose.yml 文件。这个文件会比单机版长不少,因为它要定义多个服务实例。我们先搭建最基础的三件套:etcd集群、MinIO集群和Milvus的核心组件。
2.1 配置高可用的基础服务:etcd与MinIO
在集群模式下,元数据存储etcd和对象存储MinIO本身也需要高可用,否则它们会成为单点故障。我们先配置一个3节点的etcd集群。
version: '3.5'
services:
# 1. 高可用 etcd 集群 (3节点)
etcd1:
container_name: milvus-etcd-1
image: quay.io/coreos/etcd:v3.5.5
environment:
- ETCD_NAME=etcd1
- ETCD_DATA_DIR=/etcd-data
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd1:2380
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd1:2379
- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-for-milvus
- ETCD_INITIAL_CLUSTER_STATE=new
volumes:
- /data/milvus/etcd1:/etcd-data
networks:
- milvus-net
healthcheck:
test: ["CMD", "etcdctl", "--endpoints=http://localhost:2379", "endpoint", "health"]
interval: 30s
timeout: 10s
retries: 3
etcd2:
container_name: milvus-etcd-2
image: quay.io/coreos/etcd:v3.5.5
environment:
- ETCD_NAME=etcd2
- ETCD_DATA_DIR=/etcd-data
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd2:2380
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd2:2379
- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster-for-milvus
-


348

被折叠的 条评论
为什么被折叠?



