milvus-logo
LFAI
首页
  • 概念

数据处理

本文详细介绍了 Milvus 中数据插入、索引建立和数据查询的实现。

数据插入

在 Milvus 中,您可以为每个集合指定若干分片,每个分片对应一个虚拟通道(vchannel)。如下图所示,Milvus 会为日志代理中的每个 v 通道分配一个物理通道(pchannel)。任何传入的插入/删除请求都会根据主键的哈希值路由到分片。

由于 Milvus 没有复杂的事务,因此 DML 请求的验证工作转交给了代理。代理会向 TSO(Timestamp Oracle)请求每个插入/删除请求的时间戳,TSO 是与根协调器共用的计时模块。由于旧的时间戳会被新的时间戳覆盖,因此时间戳可用于确定正在处理的数据请求的顺序。代理从数据协调器分批检索信息,包括实体的分段和主键,以提高总体吞吐量,避免中央节点负担过重。

Channels 1 通道 1

DML(数据操作语言)操作和 DDL(数据定义语言)操作都会写入日志序列,但由于 DDL 操作出现的频率较低,因此只分配一个通道。

Channels 2 通道 2

V 通道保存在底层日志代理节点中。每个通道在物理上不可分割,可用于任何一个节点,但只能用于一个节点。当数据摄取率达到瓶颈时,要考虑两个问题:日志代理节点是否超载并需要扩展,以及是否有足够的分片来确保每个节点的负载平衡。

Write log sequence 写日志顺序

上图封装了写入日志序列过程中涉及的四个组件:代理、日志代理、数据节点和对象存储。该流程涉及四项任务:验证 DML 请求、发布-订阅日志序列、从流日志转换为日志快照,以及持久化日志快照。这四项任务相互解耦,以确保每项任务都由相应的节点类型处理。同一类型的节点是平等的,可以灵活、独立地扩展,以适应各种数据负载,尤其是海量、高波动的流数据。

索引构建

索引建立由索引节点执行。为了避免频繁为数据更新建立索引,Milvus 将一个集合进一步划分为多个分段,每个分段都有自己的索引。

Index building 建立索引

Milvus 支持为每个向量场、标量场和主场建立索引。索引构建的输入和输出都与对象存储有关:索引节点将需要索引的日志快照从段(位于对象存储中)加载到内存,反序列化相应的数据和元数据以建立索引,索引建立完成后序列化索引,并将其写回对象存储。

索引构建主要涉及向量和矩阵操作,因此是计算和内存密集型操作。向量因其高维特性,无法用传统的树形索引高效地建立索引,但可以用这方面比较成熟的技术建立索引,如基于集群或图形的索引。无论其类型如何,建立索引都涉及大规模向量的大量迭代计算,如 Kmeans 或图遍历。

与标量数据的索引不同,建立向量索引必须充分利用 SIMD(单指令、多数据)加速。Milvus 本身支持 SIMD 指令集,如 SSE、AVX2 和 AVX512。鉴于向量索引构建的 "打嗝 "和资源密集性质,从经济角度看,弹性对 Milvus 至关重要。未来的 Milvus 版本将进一步探索异构计算和无服务器计算,以降低相关成本。

此外,Milvus 还支持标量过滤和主字段查询。为了提高查询效率,Milvus 还内置了布鲁姆过滤索引、哈希索引、树型索引和反转索引等索引,并计划引入更多外部索引,如位图索引和粗糙索引。

数据查询

数据查询指的是在指定的集合中搜索与目标向量最近的k 个向量或与向量在指定距离范围内的所有向量过程。向量会连同其相应的主键和字段一起返回。

Data query 数据查询

Milvus 中的集合分为多个部分,查询节点按部分加载索引。当搜索请求到达时,它会广播给所有查询节点进行并发搜索。然后,每个节点修剪本地段,搜索符合条件的向量,并还原和返回搜索结果。

在数据查询中,查询节点是相互独立的。每个节点只负责两项任务:根据查询协调器的指令加载或释放段;在本地段内进行搜索。代理负责减少每个查询节点的搜索结果,并将最终结果返回给客户端。

Handoff 分段

分段有两种,一种是增长分段(用于增量数据),另一种是封存分段(用于历史数据)。查询节点向 vchannel 订阅最新更新(增量数据),作为增长段。当增长数据段达到预定义的阈值时,数据协调器会将其封存,并开始建立索引。然后,查询协调器启动移交操作,将增量数据转为历史数据。查询协调器将根据内存使用情况、CPU 开销和段落数量,在所有查询节点之间平均分配封存的段落。

下一步

翻译自DeepLogo

反馈

此页对您是否有帮助?