1. CreateCollection API執行流程_milvus源碼解析
在分析milvus源碼中的CreateCollection API執行流程時,我們需要詳細拆解從客戶端請求到數據最終存儲在etcd的過程。在milvus版本v2.3.2中,CreateCollection API的執行流程大致分為以下幾個關鍵步驟:
首先,客戶端SDK接收用戶創建集合(collection)的請求,並將此請求封裝為createCollectionTask,隨後將其放入ddQueue隊列。
隨後,此任務在proxy內依次執行PreExecute、Execute和PostExecute三個方法。PreExecute階段進行參數校驗等預處理工作,Execute階段則是真正執行邏輯,而PostExecute階段完成執行後的清理工作,通常不做任何操作並返回nil。
在Execute方法中,proxy調用rootCoord的CreateCollection介面,此介面進一步封裝請求為rootcoord里的createCollectionTask。
接下來,rootCoord的CreateCollection介面執行CreateCollectionTask的Prepare、Execute和NotifyDone方法。核心操作在Execute階段,其中涉及到多個步驟,包括expireCacheStep、addCollectionMetaStep、watchChannelsStep、changeCollectionStateStep等。在這些步驟中,重點是addCollectionMetaStep,負責etcd元數據的操作。
在addCollectionMetaStep的Execute方法中,s.core.meta.AddCollection方法被調用。此方法在etcd中創建了多個與集合相關的key-value對,這些key值按照特定規則構建,反映了集合、分區和欄位之間的關系。
具體而言,集合信息通過key `root-coord/database/collection-info/1/445652621026918798` 存儲在etcd中,value為protobuf序列化的etcdpb.CollectionInfo,這表示集合由ID、DbId、schema等組成,schema中不記錄欄位、分區ID或名稱等信息。etcd以二進制形式存儲這些數據。
分區信息通過類似 `root-coord/partitions/445653146967736660/445653146967736661` 的路徑存儲,value為etcdpb.PartitionInfo,同樣採用protobuf序列化後存儲在etcd中。此信息包括partitionID、partitionName、collectionId等。
欄位信息通過 `root-coord/fields/445653146967736660/100` 的路徑存儲,value為schemapb.FieldSchema,包含欄位ID、名稱、描述、數據類型等信息。
在執行完畢後,將所有key-value對批量寫入etcd,最終完成集合的創建。
總結而言,CreateCollection API的執行流程涉及多個組件協作,從客戶端請求開始,經過proxy和rootCoord的處理,最終在etcd中存儲集合、分區和欄位的元數據,實現了集合的創建。整個流程中,etcd作為關鍵的數據存儲層,提供了持久化和高可用性保障。