Milvus 2.1.x 到 Milvus 2.2.x 升級實踐

近日,Milvus 2.2.0 發佈,新版本里支持了許多激動人心的功能,包括:磁盤索引(DiskANN)、從文件中批量導入數據(bulk_insert)、基於角色的訪問控制(RBAC)、集合生存時間(TTL)等。不少社區的小夥伴對新版本都已經躍躍欲試。不過與以往版本直接升級鏡像的簡單操作相比,由於 2.2 和 2.1 的元數據發生了變化,以及接口側的一些行爲發生了改變,所以升級的手續要比以前多一丟丟了。下面就讓我們來看看如何優雅地將 Milvus 從 2.1.x 版本升級到 2.2.x 版本

整個升級過程主要涉及兩部分的變更,分別是部署側和接口側。部署側主要是鏡像和元數據的變更,接口側主要是 sdk 的行爲變更,從而需要在原來的業務代碼上做一些調整。接下來我們會對這兩部分分別介紹。本文以 Milvus 2.1.4 升級到 Milvus 2.2.0 爲例進行介紹,因爲 2.1.0 到 2.1.4 之間的所有版本,數據和接口都是兼容的,所以其他 2.1.x 版本的升級都是類似的。

#01

部署側升級

Milvus 2.2.0 以前,RootCoord 同時負責管理集合的元信息以及索引的元信息,IndexCoord 只負責索引任務的調度。爲了讓索引元信息與 RootCoord 解耦,Milvus  2.2 決定把原來由 RootCoord 管理的索引元信息轉移到由 IndexCoord 管理。所以,部署側升級的核心工作就是將 Milvus 2.1.4 的元數據結構修改爲 Milvus 2.2.0 的元數據結構,並用新的 Milvus 2.2.0 鏡像啓動 Milvus 的各個組件

由於 Milvus 具有單機和分佈式兩種形態,部署模式支持 docker compose、Helm、k8s operator,爲了表述更加清晰,我們使用表格來說明各自的操作步驟和注意事項。

由於 APT/YUM 和 Ansible 不是社區推薦的主流部署模式,所以本次的升級實踐暫不討論這兩種部署模式。

單機版

分佈式

#02

接口側升級

API 層面,爲了統一社區三大官方 SDK(Python SDK、Java SDK、Go SDK)的行爲,以及統一用戶對 Milvus 的使用規範,Milvus 2.2.0 對 create_index()、drop_index()、load()、release()、flush() 這幾個接口做了限制和補充。歸納起來分爲索引和數據加載以及數據落盤(flush)兩大類。索引和數據加載

  • 沒有建立索引的集合無法加載。
  • 集合加載後不能再創建索引。
  • 集合釋放後才能刪除索引。涉及到的接口包含:create_index()、drop_index()、load()、release()。下面通過一些 2.1.4 和 2.2.0 的應用代碼的寫法對比,來詳細說明上面三條變更帶來的變化。

對於“沒有建立索引的集合無法加載”這條規則,有一個特殊的要注意的情況,那就是 Flat 暴搜。在 2.2.0 之前,數據插入集合後,用戶可以直接調用load()接口,然後就可以使用 Flat 做暴搜。在 2.2.0 之後,爲了遵循“沒有建立索引的集合無法加載”這條規則,即使你想要使用 Flat 做暴搜,那麼你也需要在 load 之前顯式創建 Flat 索引。具體的使用代碼如下:

hello_milvus = Collection(...)
hello_milvus.insert(...)
index = {
  "index_type""FLAT",
  "metric_type""L2",
  "params": {},
}
hello_milvus.create_index("embeddings", index)
hello_milvus.load()
hello_milvus.search(...)


數據落盤(Flush)

Flush() 是在 Milvus 2.2.0 裏面新增的一個接口,含義是對數據段 (segment) 進行密封 (sealed) 並將其同步到對象存儲中。在之前的版本里面,Milvus 裏面沒有暴露 Flush() 接口,但是在調用 num_entities() 或 create_index() 的時候,會隱式地調用 Flush API。

Flush() 一般用在數據插入結束之後,創建索引之前,這樣可以保證所有的數據都成功落盤並順利創建索引。需要注意的是,當你進行多次數據插入的時候,最好不要過於頻繁地調用 Flush() 接口。因爲太過頻繁地調用Flush(),會生成很多小的數據段(segment),進而會觸發很多 compaction 操作,對系統的 IO 和穩定性產生較大影響

以上就是接口側升級的主要內容,最後還需要提醒大家,使用 Milvus 2.2.0 的時候,需要把 SDK 也升級到 2.2.0 版本,避免發生異常的不兼容情況

#03

結語

當你做完部署側和接口側的升級後,恭喜你,你已經順利完成 2.1.x 到 2.2.x 的升級工作了。版本間數據和接口不兼容還是挺煩人的一件事,社區後面一定會減少這樣的不兼容變更,讓每一位 Milvuser 獲得更加良好的使用體驗~

Milvus 2.2.x 比 Milvus 2.1.x 的性能提升了 50+%,具體信息可以參考 Milvus 官網上的 Benchmark:https://milvus.io/docs/benchmark.md。心動不如行動,趕快來體驗極速的向量檢索服務吧!



Zilliz 是向量數據庫系統領域的開拓者和全球領先者,研發面向 AI 生產系統的向量數據庫系統。Zilliz 以發掘非結構化數據價值爲使命,致力於打造面向 AI 應用的新一代數據庫技術,幫助企業便捷地開發 AI 應用。Zilliz 的產品能顯著降低管理 AI 數據基礎設施的成本,幫助 AI 技術賦能更多的企業、組織和個人。

本文分享自微信公衆號 - ZILLIZ(Zilliztech)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章