Milvus支持流数据和批量数据处理。本文我们将学习世界上最先进的向量数据库Milvus如何获取精确的实时查询结果。
开始阅读本文前,建议大家先阅读以下文章,这样会更好理解本文的内容。
为查询节点加载数据
执行查询前,首先需要为查询节点加载数据。
有两种数据需要加载,包括来自日志代理(支持回放的发布订阅系统)中的流数据以及来自对象存储(下面称为持久存储)中的历史数据。

数据坐标负责处理不断插入Milvus数据库的数据流。当用户调用collection.load()加载一个集合时,查询坐标将询问数据坐标来了解哪些段保存在存储中,并了解它们对应的检查点。检查点是一种标记,表示检查点之前的持久段已被使用,而检查点之后的持久段还未被使用。
之后,查询坐标根据数据坐标反馈的信息输出分配策略:按段或按通道。段分配器负责将持久存储(批数据)中的段分配给不同的查询节点。如上图所示,段分配器将段1和段3(S1,S3)分配给查询节点1,将段2和段4(S2,S4)分配给查询节点2。通道分配器分配不同的查询节点来监视日志代理中的多个数据操作通道。如上图所示,通道分配器分配查询节点1监视通道1(Ch1),查询节点2监视通道2(Ch2)。
根据分配策略,每个查询节点加载了段数据并相应的监视通道。图中的查询节点1通过分配的段S1和S3加载了来自持久存储的历史数据(批数据)。与此同时,查询节点1通过订阅日志代理中的通道1加载了增量数据(流数据)。
查询节点数据管理
查询节点需要管理历史数据和增量数据。历史数据存储在密封段里,增量数据存储在新建的段里。
历史数据管理
历史数据管理主要关注两点:负载均衡和查询节点故障切换。

如图所示,查询节点4分配了比其他节点多的密封段。这将很可能减缓查询节点4的整个查询过程。要解决这个问题,系统需要将查询节点4上的一些段分配给其他节点。这称为负载均衡。
增量数据管理
查询节点监视数据操作通道接收增量数据。该过程需要引入流程图。查询节点首先过滤所有的数据插入消息来保证只加载特定分区的数据。Milvus中每个集合都有一个相应的通道,集合中的所有分区共享该通道。因此,如果用户只加载特定分区的数据,那么就需要流程图来过滤插入数据。否则,一个集合中所有的分区数据都会加载到查询节点上。
过滤数据后,增量数据插入到新建的段里,然后再传递给服务器时间节点。
在数据插入过程中,给每个数据插入消息分配一个时间戳。每当服务器时间节点收到插入节点的报时信号时,就会提供一个更新后的tsafe值。tsafe表示安全时间,该时间点之前的插入数据都可以查到。例如:如果tsafe值为9,意思是小于该值内插入的数据都可以查到。
Milvus实时查询
Milvus中的实时查询是通过查询消息实现的。查询消息通过代理插入到日志代理中。然后,查询节点通过监视日志代理中的查询通道来获取查询消息。
查询消息
一个查询消息包括如下查询相关的信息:
-
msgID:消息ID。系统分配给查询消息的ID。 -
collectionID:要查询的集合的ID (如果用户指定的话)。 -
execPlan:执行计划主要用于查询中的属性过滤。 -
service_ts:服务时间戳和上面提到的tsafe一起更新。服务时间戳表示该服务所在的时间点。服务时间戳之前插入的所有数据都可查询。 -
travel_ts:表示过去的一段时间。将对这段时间内的数据进行查询。 -
guarantee_ts: 如果需要对某一个时间段之后的数据进行查询,只有当service_ts大于guarantee_ts时,才会执行查询。
实时查询
当收到查询消息时,Milvus首先会判断是否service_ts大于guarantee_ts,如果是,执行查询。历史数据查询和增量数据查询会同时进行。由于流数据和批数据之间可能会发生数据重叠,这时需要执行“local reduce”操作来过滤冗余查询结果。
然而,如果service_ts小于guarantee_ts,该查询消息会被标记为未解决的消息,直到service_ts大于guarantee_ts才会被处理。
查询结果最终会推送到结果通道。代理从通道获取查询结果。同样的,因为代理从多个查询节点接收结果,查询结果很可能重复,因此代理会执行“global reduce”。
为了确保代理在返回结果给SDK前已接收到所有查询结果,结果消息会保存一份信息记录,包括搜索的密封段,搜索的数据操作通道和全局密封段(所有查询节点上的所有段)。只有下面所有条件都满足,系统才可判断代理已收到所有查询结果:
- 所有查询消息中记录的所有搜索的密封段的并集大于全局密封段。
- 集合中所有的数据操作通道可查询。
最后,代理将“global reduce”之后的结果返回给Milvus SDK。
原文标题:Using the Milvus Vector Database for Real-Time Querying
原文作者:xi ge
原文地址:https://dzone.com/articles/using-the-milvus-vector-database-for-real-time-querying




