Milvus QueryCoordV2学习笔记

前言

年前看了些Milvus QueryCoordV2的代码整理了一些笔记(算是半成品),省去了很多细节。一直为做最终的整理, 直到准备去社区做分享才开始临时抱佛脚翻笔记, 之前看的东西也快忘了。本着输出倒逼输入的原则,还是把他发出来提供给大家指正。最少也是给大家提供个索引

以下是内容目录

  • 从一个Load Collection 大概的流程串起来
  • 分别看下这几个组件的实现
    • 元数据
    • Checker
    • TaskScheduler & disHandler
    • Observer
  • NodeUp/NodeDown

LoadCollection流程

image-20230407162358270

概括

QueryCoordV2负责将Segment,Channel分配到QueryNode,更新QueryNode中的LeaderView信息。相较QueryCoordV1,QueryCoordV2在分配数据过程都是异步的操作。在分配的逻辑上也会每个QueryNode粒度分别去分配。

image-20230101151140203

元数据组件

1.Meta

在ETCD中维护集合和副本的信息,包含了两个Manager

  • CollectionManager:维护集群的集合和分区基础信息和Load进度

    type CollectionManager struct {
         
    	rwmutex sync.RWMutex
    	collections map[UniqueID]*Collection
    	partitions  map[UniqueID]*Partition
    	store       Store
    }
    
    type Collection struct {
         
    	*querypb.CollectionLoadInfo 
    	LoadPercentage int32 //Load进度
    	CreatedAt      time.Time
    	UpdatedAt      time.Time
    }
    
  • ReplicaManager:维护副本和分配给这个副本的QueryNode节点ID

    type ReplicaManager struct {
         
    	rwmutex sync.RWMutex
    
    	idAllocator func() (int64, error)
    	replicas    map[UniqueID]*Replica
    	store       Store
    }
    
    type Replica struct {
         
    	ID                   int64  
    	CollectionID         int64   
    	Nodes                []int64  //分配给这个副本的QueryNode节点ID
    }
    

2.DistributionManager

在内存中维护Segment/Channel/LeaderView在QueryNode实际的分配快照。包含了三个Manager

  • SegmentDisManager: 记录Segment的分配情况

    type SegmentDistManager struct {
         
    	rwmutex sync.RWMutex
    
    	// nodeID -> []*Segment
    	segments map[UniqueID][]*Segment
    }
    
    type Segment struct {
         
    	*datapb.SegmentInfo
    	Node    int64 // Node the segment is in
    	Version int64 // Version is the timestamp of loading segment
    }
    
  • ChannelDistManager:记录Channel分配的情况

    type ChannelDistManager struct {
         
    	rwmutex sync.RWMutex
    
    	// NodeID -> Channels
    	channels map[UniqueID][]*DmChannel
    }
    
    type DmChannel struct {
         
    	*datapb.VchannelInfo
    	Node    int64
    	Version int64
    }
    

    image-20230101165847107

  • LeaderViewManager: 记录每个节点Leader与Segment/Channel的之间的关系

    type LeaderViewManager struct {
         
    	rwmutex sync.RWMutex
    	views   map[int64]channelViews // 节点ID -> Views (one per shard)
    }
    
    type channelViews map[string]*LeaderView  //channel -> View
    
    type LeaderView struct {
         
    	ID              int64
    	CollectionID    int64
    	Channel         string
    	Segments        map[int64]*querypb.SegmentDist
    	GrowingSegments typeutil.UniqueSet
    }
    

3.TargetManager

记录需要分配给QueryNode的Segment/Channel

type TargetManager struct {
   
	rwmutex sync.RWMutex
	segments   map[int64]*datapb.SegmentInfo
	dmChannels map[string]*DmChannel
}

后面handoff/load等在QueryNode的操作,会修改TargetManager。通过TargetManager和DistManager,Checker会比对每个replica的差异情况,生成LoadTask/ReduceTask。接下来我们看下Checker的逻辑

Checker

刚才我们提到Checker比对TargetManager和DistManager之间的差异,生成LoadTask/ReduceTask的逻辑。简单说下

实现入口

CheckerController会有个协程定时去check,生成Task加入到TaskScheduler,现在已有的Checker :

  • SegmentChecker: 生成Segment相关的Task
  • ChannelChecker: 生成Channel相关的Task
  • RebalanceChecker: 根据Rebalance策略,生成Loaded Collection的Segment/Channel Task
// check is the real implementation of Check
func (controller *CheckerController) check(ctx context.Context) {
   
	tasks := make([]task.Task, 0)
	for _, checker := range controller.checkers {
   
		tasks = append(tasks, checker.Check(ctx)...)
	}

	for _, task := range tasks {
   
		err := controller.scheduler.Add(task)
		if err != nil {
   
			task.Cancel()
			continue
		}
	}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Milvus 是一个开源的向量相似度搜索引擎,而Spring Boot 是一个用于构建基于 Java 的独立、生产级的应用程序的框架。 Milvus Spring Boot 是将 Milvus 与 Spring Boot 框架结合使用的一种方式。借助 Spring Boot,我们可以更方便地构建基于 Milvus 的应用程序。 首先,我们可以使用 Spring Boot 的依赖管理功能,将 Milvus 的 Java 客户端库添加到项目中。这样,我们就可以在我们的应用程序中直接使用 Milvus 的功能,如向量的插入、查询和删除等。 其次,Spring Boot 提供了强大的配置管理功能,我们可以轻松地将 Milvus 的连接配置信息添加到应用程序的配置文件中,例如指定 Milvus 的 IP 地址、端口号和连接池大小等。这样,我们就可以灵活地管理 Milvus 与其他组件的连接。 另外,Spring Boot 还提供了便捷的 RESTful API 开发功能。我们可以利用这一特性,将 Milvus 的搜索引擎功能以接口的形式暴露给客户端,使得客户端可以通过 HTTP 请求来进行向量的检索。这样,我们可以轻松地建立一个灵活、高性能的分布式向量搜索系统。 总的来说,Milvus Spring Boot 结合了 Milvus 的强大功能和 Spring Boot 的便捷开发特性,使得我们可以更快速、灵活地搭建起一个高性能的向量搜索应用程序。它在大数据、人工智能等领域有广泛的应用前景,可以应对各种复杂的向量查询需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值