Milvus 2.0 重新定義向量資料庫
當我們在 2018 年 10 月為 Milvus 寫下第一行程式碼時,一切恍如昨日。2021 年 3 月,經過全球 1000 多位使用者 19 次的迭代測試後,我們推出了 Milvus 1.0,這是我們第一個擁有長期支援的正式版本。作為全球最流行的開源向量資料庫,Milvus 1.0 成功解決了向量管理中的一些基本問題,例如 CRUD 操作和資料持久性。然而,隨著新的情境與需求出現,我們開始意識到還有許多問題有待解決。這篇文章回顧了我們在過去三年的觀察,Milvus 2.0預期要解決的挑戰,以及為什麼Milvus 2.0被認為是一個更好的解決方案。 要了解更多關於Milvus 2.0的內容,請查看Milvus 2.0 發行紀錄。
Milvus 1.x 面臨的挑戰
資料孤島:Milvus 1.0 只能處理從非結構化資料產生的向量嵌入,對標量分析查詢的支援很少。在其設計上,資料儲存的分離造成資料重複,增加了應用程式開發的複雜性,而向量與標量資料之間的混合搜尋,也因為缺乏統一的最佳化器,而無法令人滿意。
時效與效率之間的兩難:Milvus 1.0 是一個接近即時的系統,它依賴定期或強制刷新來確保資料的可視性。這種方式在許多層面上增加了串流資料處理的複雜性與不確定性。此外,雖然這種批次插入的方式據說可以提高處理效率,但仍會消耗大量資源。因此需要批量載入的方式。
缺乏擴充性與彈性:Milvus 1.0 依賴分片中間件解決方案 Mishards 來實現可擴展性,並依賴網路連接儲存設備 (NAS) 來實現資料持久化。由於下列原因,這種建基於共用儲存的經典架構對整體擴充能力貢獻不大:
- Mishards 只支援一個寫入節點,無法擴充。
- 在 Mishards 中,讀取節點的擴充是使用一致散列式路由來實現的。雖然一致散列很容易實作,也有助於解決資料分佈均勻性的問題,但在資料排程上卻不夠彈性,無法解決資料大小與計算能力不匹配的問題。
- Milvus 1.0 依賴 MySQL 來管理元資料,但獨立的 MySQL 伺服器所能處理的查詢和資料集大小相當有限。
缺乏高可用性:我們觀察到,大多數 Milvus 使用者傾向於偏好可用性而非一致性,而 Milvus 1.x 則缺乏記憶體內複製和災難復原等能力,在高可用性方面不太達標。因此,我們正在探索犧牲某種程度的精確性,以達到更高可用性的可能性。
高昂的成本:Milvus 1.0 依賴 NAS 來儲存資料,其成本通常是本機或物件儲存的十倍。由於向量搜尋嚴重依賴運算資源與記憶體,其所產生的高成本很可能會成為進一步探索大型資料集或複雜業務情境的障礙。
不直覺的使用者體驗:
- 複雜的分散式部署會產生高昂的作業成本。
- 沒有精心設計的圖形使用者介面 (GUI)。
- 不直覺的 API 已經成為應用程式開發的阻力。
是繼續使用修補程式,還是從頭開始,是個大問題。Milvus 之父 Charles Xie 認為,就像許多傳統汽車製造商永遠無法逐步轉型為 Tesla 一樣,Milvus 也必須成為非結構化資料處理與分析領域的遊戲改變者,才能茁壯成長。正是這個信念促使我們啟動 Milvus 2.0,一個重構的雲原生向量資料庫。
Milvus 2.0 的製作過程
設計原則
作為我們的下一代雲原生向量資料庫,Milvus 2.0 是圍繞以下三個原則建立的:
雲原生第一:我們相信,只有支援儲存與運算分離的架構,才能按需擴充,並充分發揮雲端彈性的優勢。我們也想請您注意 Milvus 2.0 的微服務設計,其特色在於讀寫分離、增量與歷史資料分離,以及 CPU 密集型、記憶體密集型與 IO 密集型任務分離。微服務有助於為不斷變化的異質工作負載最佳化資源分配。
日誌即資料:在 Milvus 2.0 中,日誌經紀人是系統的骨幹:所有資料插入和更新作業都必須經過日誌中介,工作節點則透過訂閱和消耗日誌來執行 CRUD 作業。此設計將核心功能 (例如資料持久化和 flashback) 移至儲存層,從而降低系統的複雜性,而日誌發佈子 (log pub-sub) 則讓系統更加靈活,更適合未來的擴充。
統一的批次與串流處理:Milvus 2.0 實現了統一的 Lambda 架構,整合了增量資料和歷史資料的處理。相較於 Kappa 架構,Milvus 2.0 引入日誌回填 (log backfill),將日誌快照與索引儲存於物件儲存空間,以提升故障復原效率與查詢效能。為了將無界(串流)資料分解成有界的視窗,Milvus 採用了新的水印機制,將串流資料依據寫入時間或事件時間切分成多個訊息包,並維護時間線供使用者依時間查詢。
2.0 影像 1.png
系統架構
如前所述,Milvus 2.0 的設計嚴格遵循儲存與運算分離、控制平面與資料平面分離的原則。系統分為四層:存取層、協調器服務、工作節點和儲存。
存取層:介面:存取層是系統的前端層,也是使用者的終點。它負責轉發要求並收集結果。
協調器服務:協調器服務將任務指派給工作節點,並扮演系統大腦的角色。協調器有四種類型:根協調器 (root coordinator)、資料協調器 (data coordinator)、查詢協調器 (query coordinator),以及索引協調器 (index coordinator)。
工作節點:手腳。工作節點是遵循協調器服務指示並回應存取層讀取/寫入要求的啞巴執行器。工作節點有三種類型:資料節點、查詢節點和索引節點。
儲存:骨頭。儲存有三種類型:元儲存、日誌中介和物件儲存。
- 元儲存由 etcd 實作,用來儲存協調服務的收集和檢查點等元資料。
- 日誌中介由 Pulsar 實作,主要用來儲存增量日誌和實作可靠的異步通知。
- 物件儲存由 MinIO 或 S3 實作,主要用來儲存日誌快照和索引檔案。
以下是 Milvus 2.0 的系統架構圖: 2.0 image 2.png
主要功能
運行資料庫的成本不僅涉及運行時的資源消耗,還包括潛在的學習成本和運維成本。實際上,資料庫越容易使用,就越有可能節省這些潛在的成本。從 Milvus 日曆的第一天起,易用性就一直被放在我們的首要位置,而最新的 Milvus 2.0 在降低這些成本方面也有不少可取之處。
永遠在線
資料可靠性和服務持續性是資料庫的基本要求,我們的策略是「故障低、故障小、故障頻繁」。
- "故障低價」是指儲存與運算分離,使得節點故障復原的處理簡單直接且成本低廉。
- 「故障小 」指的是 「分而治之 」策略,即每個協調器服務只處理一小部分讀/寫/增量/歷史資料,從而簡化設計的複雜性。
- "Fail often" 是指引入混沌測試,在測試環境中使用故障注入來模擬硬體故障和相依性故障等情況,加速發現錯誤。
標量與向量資料之間的混合搜尋
為了善用結構化與非結構化資料之間的協同效應,Milvus 2.0 同時支援標量與向量資料,並能在兩者之間進行混合搜尋。混合搜尋可幫助使用者找到符合篩選條件的近似近鄰。目前,Milvus 支援 EQUAL、GREATER THAN 和 LESS THAN 等關係操作,以及 NOT、AND、OR 和 IN 等邏輯操作。
可調整的一致性
作為一個遵循 PACELC 理論的分散式資料庫,Milvus 2.0 必須在一致性與可用性及延遲之間作出取捨。在大多數情況下,在生產過程中過度強調資料的一致性可能會適得其反,因為允許一小部分資料不被察覺對整體召回率的影響不大,但卻能顯著改善查詢效能。不過,我們相信一致性等級,例如強、有邊界的僵化和會話,都有其獨特的應用。因此,Milvus 在請求層級支援可調整的一致性。以測試為例,使用者可能需要強一致性以確保測試結果絕對正確。
時間旅行
資料工程師經常需要進行資料回溯,以修復骯髒的資料和代碼錯誤。傳統資料庫通常透過快照甚至資料重整來實現資料回溯。這可能會帶來過多的開銷和維護成本。Milvus 維護所有資料插入和刪除作業的時間軸,使用者可以在查詢中指定時間戳,擷取指定時間點的資料檢視。有了時間旅行,Milvus 也可以實現輕量級的資料備份或資料克隆。
ORM Python SDK
物件關聯對應 (ORM) 可讓使用者更專注於上層的商業模型,而不是底層的資料模型,讓開發人員更容易管理集合、欄位和程式之間的關係。為了縮短人工智能演算法的概念驗證 (PoC) 與生產部署之間的差距,我們設計了 PyMilvus ORM API,可與嵌入式函式庫、獨立部署、分散式群集,甚至是雲端服務搭配使用。透過統一的 API,我們提供使用者一致的使用經驗,並降低程式碼遷移或適應成本。
2.0 圖片 3.png
支援工具
- Milvus Insight 是 Milvus 的圖形化使用者介面,提供集群狀態管理、元管理、資料查詢等實用功能。Milvus Insight 的原始碼也將作為獨立專案開放源碼。我們正在尋找更多的貢獻者加入這項工作。
- 開箱即用的體驗 (OOBE),更快速的部署:Milvus 2.0 可使用 helm 或 docker-compose 進行部署。
- Milvus 2.0 使用開源時間序列資料庫 Prometheus 來儲存效能與監控資料,並使用開放式可觀察性平台 Grafana 來進行指標可視化。
展望未來
回顧過去,我們認為基於大數據 + AI 應用的系統架構過於複雜。如何讓 Milvus 更容易使用,一直是 Milvus 社群的首要任務。展望未來,Milvus 計畫將專注於以下領域:
DB for AI:除了基本的 CRUD 功能外,Milvus 作為一個資料庫系統,需要有更智慧的查詢最佳化器、更強大的資料查詢能力,以及更全面的資料管理功能。我們下一階段的工作重點將放在 Milvus 2.0 尚未提供的資料處理語言 (DML) 功能和資料類型,包括增加刪除和更新操作,以及支援字串資料類型。
DB 的 AI:對索引類型、系統配置、使用者工作量和硬體類型等參數進行旋鈕調整,會使 Milvus 的使用變得複雜,應盡量避免。我們已著手分析系統負載和收集資料的存取頻率,並計劃在未來引入自動調整功能,以降低學習成本。
成本最佳化:向量檢索最大的挑戰是需要在有限的時間內處理大規模的資料集。這既需要密集的 CPU,也需要密集的記憶體。在實體層引入 GPU 和 FPGA 異質硬體加速可以大幅降低 CPU 開銷。我們也正在開發一種混合的磁碟上和記憶體內 ANN 索引演算法,以便在記憶體有限的情況下實現海量資料集的高效能查詢。更重要的是,我們正在評估 ScaNN 和 NGT 等現有開放原始碼向量索引演算法的效能。
易用性:Milvus 透過提供叢集管理工具、多種語言的 SDK、部署工具、操作工具等,不斷改善其易用性。
要了解更多有關 Milvus 的發行計劃,請查看Milvus 路線圖。
感謝所有 Milvus 社群的貢獻者,沒有他們就不可能有 Milvus 2.0。歡迎提交問題或貢獻您的程式碼給Milvus 社群!
關於作者
栾小凡,現任 Zilliz 工程總監,負責 Milvus 項目的研發管理工作。他有 7 年的工作經驗,專注於建立資料庫/儲存系統。康奈爾大學畢業後,他曾在 Oracle、HEDVIG 和阿里巴巴雲連續工作。
- Milvus 1.x 面臨的挑戰
- Milvus 2.0 的製作過程
- 展望未來
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word