分散式架構概觀
Milvus 的目標是為大規模向量實現高效率的相似性搜尋與分析。一個獨立的 Milvus 實例可以輕鬆處理十億級向量的向量搜尋。然而,對於 100 億、1000 億甚至更大的資料集,則需要 Milvus 集群。集群可作為上層應用程式的獨立實例,並能滿足海量規模資料的低延遲、高並發的業務需求。Milvus 集群可以重發請求、分開讀寫、水平擴展和動態擴充,因此可以提供無限制擴展的 Milvus 實例。Mishards 是 Milvus 的分散式解決方案。
本文將簡單介紹 Mishards 架構的元件。更詳細的資訊將在接下來的文章中介紹。
1-milvus-cluster-mishards.png
分散式架構概觀
2-distributed-architecture-overview.png
服務追蹤
3-service-tracing-milvus.png
主要服務元件
- 服務發現框架,例如 ZooKeeper、etcd 和 Consul。
- 負載平衡器,例如 Nginx、HAProxy、Ingress Controller。
- Mishards 節點:無狀態、可擴充。
- 只寫入的 Milvus 節點:單一節點,不可擴充。您需要為此節點使用高可用性解決方案,以避免單點故障。
- 唯讀的 Milvus 節點:有狀態節點且可擴充。
- 共用儲存服務:所有 Milvus 節點都使用共用儲存服務來共用資料,例如 NAS 或 NFS。
- 元資料服務:所有 Milvus 節點都使用此服務來共用元資料。目前僅支援 MySQL。此服務需要 MySQL 高可用性解決方案。
可擴充的元件
- Mishards
- 只讀的 Milvus 節點
元件介紹
Mishards 節點
Mishards 負責分解上游請求,並將子請求路由到子服務。將結果總結後再返回上游。
4-mishards-nodes.jpg
如上圖所示,Mishards 在接受 TopK 搜尋請求後,會先將該請求拆解成子請求,並將子請求傳送給下游服務。當收集到所有的子回應後,再將這些子回應合併並傳回給上游。
由於 Mishards 是無狀態服務,因此不會儲存資料或參與複雜的計算。因此,節點對配置要求不高,計算能力主要用於合併子結果。因此,可以增加 Mishards 節點的數量,以達到高並發的目的。
Milvus 節點
Milvus 節點負責 CRUD 相關的核心作業,所以對配置的要求相對較高。首先,記憶體大小要夠大,以避免太多磁碟 IO 作業。其次,CPU 配置也會影響效能。隨著集群大小的增加,需要更多的 Milvus 節點來提高系統吞吐量。
唯讀節點與可寫節點
- Milvus 的核心作業是向量插入和搜尋。搜尋對 CPU 和 GPU 配置的要求極高,而插入或其他作業的要求則相對較低。將執行搜尋的節點與執行其他作業的節點分離,可帶來更經濟的部署。
- 就服務品質而言,當一個節點執行搜尋作業時,相關硬體是在滿載狀態下執行,無法確保其他作業的服務品質。因此,使用了兩種節點類型。搜尋要求由唯讀節點處理,其他要求則由可寫節點處理。
只允許一個可寫節點
目前,Milvus 不支援多個可寫入實體分享資料。
在部署過程中,需要考慮可寫節點的單點故障。需要為可寫節點準備高可用性解決方案。
唯讀節點擴充能力
當資料大小極大或延遲要求極高時,您可以將只讀節點視為有狀態節點進行水平擴充。假設有 4 台主機,且每台主機的配置如下:CPU 核心:16、GPU:1、記憶體:64 GB。下圖顯示了橫向擴充有狀態節點時的群集。運算能力和記憶體都是線性擴充。資料分為 8 個分片,每個節點處理來自 2 個分片的請求。
5-read-only-node-scalability-milvus.png
當某些分片的請求數量很大時,可以為這些分片部署無狀態唯讀節點,以提高吞吐量。以上面的主機為例。當主機合併為無伺服器集群時,運算能力會呈線性增加。由於要處理的資料不會增加,因此相同資料分片的處理能力也會呈線性增加。
6-read-only-node-scalability-milvus-2.png
元資料服務
關鍵字MySQL
關於 Milvus 元資料的更多資訊,請參考 如何檢視元資料。在分散式系統中,Milvus 可寫節點是元資料的唯一生產者。Mishards 節點、Milvus 可寫節點和 Milvus 只讀節點都是元資料的消費者。目前,Milvus 只支援 MySQL 和 SQLite 作為 metadata 的儲存後端。在分散式系統中,服務只能部署為高可用的 MySQL。
服務發現
關鍵字:Apache Zookeeper、etcd、Consul、Kubernetes
7-service-discovery.png
服務發現提供所有 Milvus 節點的資訊。Milvus 節點會在上線時登錄資訊,並在離線時登出。Milvus 節點也可以透過定期檢查服務的健康狀態來偵測異常的節點。
服務發現包含許多框架,包括 etcd、Consul、ZooKeeper 等。Mishards 定義了服務發現介面,並提供藉由外掛擴充的可能性。目前,Mishards 提供兩種外掛,分別對應 Kubernetes 集群和靜態配置。您可以依照這些外掛的實作,自訂您自己的服務發現。這些介面是臨時的,需要重新設計。更多有關寫自己的外掛的資訊將在接下來的文章中闡述。
負載平衡與服務分片
關鍵字:Nginx、HAProxy、Kubernetes
7-load-balancing-and-service-sharding.png
服務發現和負載平衡是一起使用的。負載平衡可以設定為輪詢、散列或一致散列。
負載平衡器負責將使用者請求重新傳送至 Mishards 節點。
每個 Mishards 節點透過服務發現中心取得所有下游 Milvus 節點的資訊。所有相關的 metadata 都可以透過 metadata 服務取得。Mishards 透過消耗這些資源來實現分片。Mishards 定義了與路由策略相關的介面,並透過外掛提供擴充。目前,Mishards 提供了基於最低區段層級的一致散列策略。如圖所示,共有 10 個區段,從 s1 到 s10。根據基於區段的一致散列策略,Mishards 將關於 s1、24、s6 和 s9 的請求路由到 Milvus 1 節點,將關於 s2、s3 和 s5 的請求路由到 Milvus 2 節點,將關於 s7、s8 和 s10 的請求路由到 Milvus 3 節點。
根據您的業務需求,您可以依據預設的一致散列路由外掛程式自訂路由。
追蹤
關鍵字:OpenTracing, Jaeger, Zipkin
鑑於分散式系統的複雜性,請求會傳送到多個內部服務調用。為了幫助找出問題,我們需要追蹤內部服務的呼叫鏈。隨著複雜度的增加,可用追蹤系統的好處也就不言而喻了。我們選擇 CNCF OpenTracing 標準。OpenTracing 提供了平台獨立、廠商獨立的 API,讓開發人員可以方便地實作追蹤系統。
8-tracing-demo-milvus.png
前面的圖表是在搜尋調用時進行追蹤的範例。搜尋連續呼叫get_routing
、do_search
和do_merge
。do_search
也呼叫search_127.0.0.1
。
整個追蹤記錄形成以下樹狀:
8-search-traceid-milvus.png
下圖顯示每個節點的 request/response 資訊和標記的範例:
request-response-info-tags-node-milvus.png
OpenTracing 已整合至 Milvus。更多資訊將在接下來的文章中涵蓋。
監控與警示
關鍵字:Prometheus、Grafana
10-monitor-alert-milvus.jpg
摘要
作為服務中介軟體,Mishards 整合了服務發現、路由請求、結果合併與追蹤。此外,還提供基於外掛的擴充功能。目前,基於 Mishards 的分散式解決方案仍有以下缺點:
- Mishards 使用代理作為中間層,有延遲成本。
- Milvus 可寫節點是單點服務。
- 依賴高可用性的 MySQL 服務。 -當有多個分片且單一分片有多個複本時,部署會變得複雜。
- 缺乏快取層,例如存取元資料。
我們會在即將推出的版本中修正這些已知問題,讓 Mishards 可以更方便地應用在生產環境中。
Like the article? Spread the word