存储/计算解聚
按照数据平面和控制平面解聚的原则,Milvus 由相互独立的四个层级组成,具有可扩展性和容灾恢复性。
访问层
访问层由一组无状态的代理组成,是系统的前端层和用户的终端。它验证客户端请求并减少返回的结果:
- 代理本身是无状态的,使用负载均衡组件(如 Nginx、Kubernetes Ingress、NodePort 和 LVS)提供统一的服务地址。
- 由于 Milvus 采用大规模并行处理(MPP)架构,代理在将最终结果返回给客户端之前将中间结果聚合和后处理。
协调器服务
协调器服务将任务分配给工作节点,充当系统的大脑。它承担的任务包括集群拓扑管理、负载均衡、时间戳生成、数据声明和数据管理。
有三种类型的协调器:根协调器(root coord)、数据协调器(data coord)和查询协调器(query coord)。
根协调器(root coord)
根协调器处理数据定义语言(DDL)和数据控制语言(DCL)请求,如创建或删除集合、分区或索引,以及管理 TSO(时间戳 Oracle)和时间轮发行。
查询协调器(query coord)
查询协调器管理查询节点的拓扑和负载均衡,以及从增长段到密封段的切换。
数据协调器(data coord)
数据协调器管理数据节点的拓扑,维护元数据,并触发刷新、压缩和其他后台数据操作。
工作节点
这是系统的执行者。工作节点是通过协调器服务中的指令执行来自代理的数据操作语言(DML)命令的无状态节点。由于存储和计算的分离,工作节点可以在 Kubernetes 上部署时支持系统的扩展和容灾恢复。工作节点分为三种类型:
查询节点
查询节点接收增量日志数据并将其转换为增长段,通过订阅日志代理加载历史数据,实现向量和标量数据之间的混合搜索。
数据节点
数据节点通过订阅日志代理接收增量日志数据,处理变异请求,并将日志数据打包成日志快照并存储在对象存储中。
索引节点
索引节点构建索引。索引节点不需要驻留在内存中,并且可以使用无服务器框架来实现。
存储
存储是系统的骨干,负责数据持久化。它由元数据存储、日志代理和对象存储组成。
元数据存储
元数据存储存储元数据的快照,例如集合模式、节点状态和消息消费检查点。存储元数据要求具有极高的可用性、强一致性和事务支持,因此 Milvus 选择了 etcd 作为元数据存储。Milvus 还使用 etcd 进行服务注册和健康检查。
对象存储
对象存储存储日志的快照文件、标量和矢量数据的索引文件和中间查询结果。Milvus 使用 MinIO 作为对象存储,可以方便地部署在 AWS S3 和 Azure Blob 上,这两者是全球最流行、性价比最高的存储服务之一。但是,对象存储的访问延迟较高,并且按查询次数收费。为了改善性能并降低成本,Milvus 计划在基于内存或基于 SSD 的缓存池上实施冷热数据分离。
日志代理
日志代理是支持回放的发布-订阅系统。它负责流数据持久化、可靠异步查询的执行、事件通知和查询结果的返回。在工作节点从系统故障中恢复时,它还确保增量数据的完整性。Milvus 集群使用 Pulsar 作为日志代理;Milvus 独立版本使用 RocksDB 作为日志代理。此外,日志代理还可以方便地替换为 Kafka 和 Pravega 等流数据存储平台。
Milvus 以日志代理为中心,遵循“日志即数据”的原则,因此 Milvus 不维护物理表,而是通过日志持久化和快照日志来保证数据的可靠性。
日志代理是 Milvus 的主干,负责数据持久化和读写解聚,由于其固有的发布-订阅机制。上述图示是对该机制的简化描述,其中系统分为两个角色,日志代理(用于维护日志序列)和日志订阅者。前者记录改变集合状态的所有操作,后者订阅日志序列以更新本地数据,并以只读方式提供服务。发布-订阅机制还为变更数据捕获(CDC)和全球分布式部署提供了扩展性空间。
下一步是什么
- 阅读 主要组件 以获取有关 Milvus 架构的更多详细信息。