数据处理
本文详细描述了 Milvus 中的数据插入、索引构建和数据查询的实现过程。
数据插入
你可以在 Milvus 中为每个集合指定一定数量的分片,每个分片对应一个虚拟通道(vchannel)。如下图所示,Milvus 为日志代理中的每个 vchannel 分配一个物理通道(pchannel)。根据主键的哈希值,任何插入/删除请求都会路由到分片。
由于 Milvus 没有复杂的事务,所以 DML(数据操纵语言)请求的验证向前移动到代理中。代理会向 TSO(时间戳 Oracle)请求每个插入/删除请求的时间戳,TSO 是与根协调器共存的定时模块。旧的时间戳被新的时间戳覆盖,时间戳用于确定正在处理的数据请求的顺序。代理从数据坐标中批量检索信息,包括实体的段和主键,以增加整体吞吐量并避免过度负担中心节点。
DML(数据定义语言)操作和 DDL(数据操作语言)操作都写入日志序列,但是 DDL 操作只分配一个通道,因为 DDL 操作的发生频率较低。
Vchannels 是在底层的日志代理节点中维护的。每个通道在物理上是不可分的,并且可以供任何一个但仅供一个节点使用。当数据摄取速率达到瓶颈时,需要考虑两个因素:日志代理节点是否过载并且需要扩展,以及是否有足够的分片以确保每个节点的负载平衡。
上图概括了写日志序列过程中涉及的四个组件:代理、日志代理、数据节点和对象存储。该过程涉及四个任务:DML 请求的验证、日志序列的发布-订阅、将流式日志转换为日志快照、以及日志快照的持久化。这四个任务相互解耦,以确保每个任务由其对应的节点类型处理。相同类型的节点是相等的,可以弹性扩展和独立扩展,以适应各种数据负载,特别是大规模和高波动的流式数据。
索引构建
索引构建由索引节点执行。为避免频繁对数据更新进行索引构建,Milvus 将每个集合进一步划分为段,每个段都有自己的索引。
Milvus 支持为每个向量字段、标量字段和主键字段构建索引。索引构建的输入和输出都与对象存储交互:索引节点将日志快照从段(位于对象存储中)加载到内存中进行索引构建,反序列化相应的数据和元数据来构建索引,索引构建完成后将索引序列化并写回对象存储。
索引构建主要涉及向量和矩阵操作,因此计算和内存密集。由于向量具有高维特性,无法使用传统的基于树的索引对其进行高效索引,但可以使用在该主题中更成熟的技术,如基于聚类或图的索引。无论其类型如何,建立索引都涉及到对大规模向量进行大规模迭代计算,例如 Kmeans 或图遍历。
与标量数据的索引不同,构建向量索引必须充分利用 SIMD(单指令多数据)加速。Milvus 对 SIMD 指令集(如 SSE、AVX2 和 AVX512)具有固有的支持。鉴于向量索引构建的 "中断" 和资源密集性,弹性在经济条件下对 Milvus 至关重要。未来的 Milvus 版本将进一步探索异构计算和无服务器计算,以降低相关成本。
此外,Milvus 还支持标量过滤和主键字段查询。它具有内置索引以提高查询效率,如 Bloom 过滤器索引、哈希索引、基于树的索引和倒排索引,并计划引入更多的外部索引,如位图索引和粗糙索引。
数据查询
数据查询是指在指定的集合中搜索与目标向量最近的 k 个向量或与向量之间的指定距离范围内的 所有 向量的过程。向量与其对应的主键和字段一起返回。
Milvus 将集合分割为多个段,查询节点按段加载索引。当收到搜索请求时,它会广播到所有查询节点进行并发搜索。然后每个节点修剪本地段,搜索满足条件的向量,并减少并返回搜索结果。
数据查询中的查询节点彼此独立。每个节点仅负责两个任务:根据查询协调器的指示加载或释放段;在本地段内进行搜索。代理负责从每个查询节点减少搜索结果并将最终结果返回给客户端。
有两种类型的段,增长段(用于增量数据)和封存段(用于历史数据)。查询节点订阅 vchannel 以接收最新更新(增量数据)作为增长段。当增长段达到预定阈值时,数据协调器封存它并开始索引构建。然后由查询协调器发起的 切换 操作将增量数据转换为历史数据。查询协调器将封存段均匀分布在所有查询节点中,根据内存使用、CPU 开销和段数量进行分配。
下一步做什么
-
了解有关如何使用 Milvus 矢量数据库进行实时查询的内容(https://milvus.io/blog/deep-dive-5-real-time-query.md)。 (opens in a new tab)
-
了解 Milvus 中的数据插入和数据持久化的内容(https://milvus.io/blog/deep-dive-4-data-insertion-and-data-persistence.md)。 (opens in a new tab)
-
了解 Milvus 中的数据处理方式(https://milvus.io/blog/deep-dive-3-data-processing.md)。 (opens in a new tab)