強制合併壓縮Compatible with Milvus 3.0.x
強制合併 (Force Merge) 旨在將小而分散的區段整合為較少且較大的區段,以改善查詢效能和儲存效率。本指南說明如何使用強制合併壓縮。
此功能處於公開預覽階段。請勿在生產環境中使用。
概述
標準壓縮透過多對一合併,將區段大小保持在設定的maxSize 附近,但仍可能會留下無法在不超過限制的情況下進一步合併的中等大小片段。例如,如下圖所示,如果一個資料集中有五個 2 MB 的區段,而maxSize 是 3 MB,則合併任何兩個區段都會超出限制,因此標準壓縮無法進一步減少區段數,而保留碎片佈局。
強制合併 (Force merge) 增加了target_size 參數,並支援在可能的情況下,在較小的公差範圍內,朝向所需的大小重組區段。如下圖所示,如果指定的target_size 為 4 MB,五個 2 MB 的小區段可以進一步合併為較少的較大區段。這可減少多餘的區段數目,支援大於預設maxSize 設定的目標,而且當目標非常大時,系統可針對目前的硬體和 QueryNode 擴充架構,選擇實際的輸出大小和區段數目。
若要瞭解使用哪種壓縮方法,請參閱常見問題集。
R8eow3kaqhktokblcmocnvxmnee
強制合併壓縮擴充了現有的 CompactionAPI 的target_size 參數。它是完全向後相容的:不含target_size 的現有壓縮呼叫仍可如以往一樣運作。
強制合併以非同步方式運作。它不會阻塞搜尋或查詢作業,但會在執行期間消耗 I/O 和記憶體資源。
使用強制合併壓縮
先決條件
Milvus 3.0 或更新版本
PyMilvus 3.0 或更新版本
全局設定
下列設定參數控制強制合併行為。請在 Milvus 設定檔或透過環境變數設定。
dataCoord:
segment:
maxSize: 512 # Default segment max size (MB).
# Used when target_size is 0 or omitted.
compaction:
maxFullSegmentThreshold: 100
# When segment count exceeds this threshold,
# a faster greedy algorithm is used instead
# of the standard merge algorithm.
forceMerge:
datanodeMemoryFactor: 4.0
# DataNode memory divided by this factor
# determines the the largest segment
# size the system can allow.
querynodeMemoryFactor: 4.0
# Minimum QueryNode memory divided by this
# factor. Used in automatic size calculation
# to ensure merged segments can be loaded.
參數 |
預設值 |
說明 |
|---|---|---|
|
512 |
預設網段最大大小 (MB)。 |
|
100 |
選擇演算法的段數臨界值。當區段數超過此值時,Milvus 會使用較快的貪婪演算法進行合併規劃。
|
|
4.0 |
資料節點記憶體除以此因子,以計算系統可允許的最大區段大小。
|
|
4.0 |
最小 QueryNode 記憶體除以此因子。在自動大小計算 (
|
要將上述變更套用到您的 Milvus 叢集,請依照「使用 Helm 設定 Milvus」和「使用 Milvus Operators 設定 Milvus」中的步驟。
觸發強制合併壓縮
您可以使用target_size 參數呼叫compact() 來觸發強力合併壓縮。有關參數的詳細資訊,請參閱下面的參數參考。
有三種強制合併壓縮模式可供使用:
compact("my_collection", target_size=?)
│
├─ Mode 1: target_size = 0 (or omitted)
│ Uses config maxSize (default 512 MB)
│ Equivalent to standard compaction
│
├─ Mode 2: target_size = 2048
│ Merges segments to ~2 GB each
│ Must be >= config maxSize
│
└─ Mode 3: target_size = max_int64
Auto-calculates optimal size based on
segment distribution and node memory
以下舉例說明如何使用每種強制合併壓縮模式。
預設 (標準壓縮)
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
# Standard compaction — uses config maxSize (default 512 MB)
job_id = client.compact("target_collection")
明確目標大小
# Merge segments to approximately 2 GB each
job_id = client.compact(
"target_collection",
target_size="2048" # The unit is MB
)
自動計算大小
# Let Milvus determine the optimal segment size
max_int64 = (1 << 63) - 1
job_id = client.compact(
"target_collection",
target_size=max_int64
)
參數參考
下表說明參數。
參數 |
類型 |
說明 |
|---|---|---|
|
str |
必須填寫。要壓縮的集合名稱。 |
|
int |
可選。目標區段大小,單位為 MB。參數值有 3 個選項:
|
如果指定的target_size 小於設定的dataCoord.segment.maxSize ,則會以錯誤拒絕請求。
檢查壓縮進度
強制合併壓縮以非同步方式執行。使用傳回的工作 ID 檢查進度:
# Check compaction state
state = client.get_compaction_state(job_id)
print(f"State: {state}")
最佳做法
請勿在生產環境中使用強制合併壓縮。
在大多數情況下使用自動大小計算模式。將
target_size設為max_int64,可讓 Milvus 分析您的區段分佈和節點資源,以決定最佳大小。這是建議的方法,除非您有特定的大小需求。考慮效能權衡。強制合併壓縮是一項資源密集的作業。它會讀取、合併和重寫區段資料。將其排程在低流量時段,以盡量減少對查詢延遲的影響。
監控之前和之後的網段數量。使用
get_compaction_state()和list_persistent_segments來驗證壓縮是否如預期產生較少、較大的分段。
常見問題
強制合併 (Force Merge) 與標準壓縮有何不同?
這兩種壓縮作業有不同的目的。
標準壓縮 (targetSize=0 或省略) 是盡最大努力的增量清理路徑。
強制合併 (targetSize>0) 是一種集合層級的重新包裝路徑,以產生更少、更大、接近目標的區段。
關鍵差異在於合併的形狀:標準壓縮實際上是每個任務 m → 1,而強制併合則是在群組輸入中 m → n。這就是為什麼強制合併可以解決標準壓縮無法解決的分段佈局問題。下表比較了這兩種操作。
尺寸 |
標準壓縮 (預設) |
強制合併 |
|---|---|---|
API 觸發 |
targetSize=0 (或未設定),無 Major/L0 標誌 |
targetSize>0 (MB) |
主要目標 |
增量清理明顯的片段;例行維護 |
收集範圍內的整合,以利搜尋與平衡 |
區段大小來源 |
固定的 dataCoord.segment.maxSize (伺服器設定) |
使用者的 targetSize,然後以 maxSafeSize 進行安全箝位 |
參數有效性 |
不調整使用者大小 |
使用者 targetSize 必須 >= dataCoord.segment.maxSize;否則會被拒絕 |
安全上限 |
僅配置上限 |
maxSafeSize = min(QueryNode mem, DataNode mem) / memory_factor(單機非池:進一步減半) |
合併形狀 |
每個任務 m → 1,輸出 <= configMaxSize |
m → n,輸出接近 targetSize |
中段行為 |
可能會永久卡住(例如,兩個 60% 的區段無法合法地變成一個 120% 的區段) |
重新封包 + 分割可以運作;沒有「卡在 60% 處」的模式 |
收集平坦化能力 |
有限;重複運行仍可能留下許多中段 |
強大;旨在減少區段數並將滿度推高 |
拓樸感知 |
無 |
有;使用 QueryNode/複製/分散佈局 |
讀取路徑平行調整 |
無 |
當有效時,使用 queryNodeCount / (replicas × shard) 調整輸出數量 |
典型用例 |
寫入/刪除後的高消耗日常清理 |
基準準備、搜尋最佳化、負載平行調整 |
預期範圍 |
不預期會重新封裝整個資料集 |
擬用於集合層級的重新封包結果 |
選擇指引:
選擇標準壓縮以進行低風險的增量清理。
當您明確地想要將資料集重整為符合搜尋和載入行為的較少、較大的區段時,請選擇強制合併。
強制合併與聚類壓縮有何不同?
聚類壓縮(is_clustering=True) 基於聚類鍵重組區段內的資料,以改善搜尋剪枝。強制合併 (target_size=N) 在不改變資料分佈的情況下優化區段大小。它們有不同的目的,但可以一起使用 - 先執行聚類壓縮來組織資料,然後再執行強制合併來合併所產生的區段。
我可以在正在查詢的資料集中執行強制合併嗎?
可以。強制合併以非同步方式執行,不會阻塞查詢。但是,它會消耗 DataNode 和磁碟 I/O 資源,因此在壓縮期間,查詢延遲可能會增加。請安排在低流量時段進行強制合併,以獲得最佳結果。
如果我設定的 target_size 小於 maxSize,會發生什麼情況?
請求會被拒絕,並顯示錯誤。目標大小必須大於或等於設定的dataCoord.segment.maxSize 。