在重新启动米尔维斯集群后,我注意到许多压实任务都面临冲突。在重新启动之前,有大量正在进行的压实任务,这些任务似乎仍然存在于任务队列中。结果,许多片段的元数据状态设置为无效。 wow,在重新启动群集后,任务队列变为空,并且协调员开始创建新的压实计划。这些新生成的压实计划中的大多数都失败了以下错误:
[2025/01/03 01:14:22.100 +00:00] [WARN] [datacoord/compaction_trigger.go:490] ["failed to execute compaction task"]
[collection=455007134314668300] [triggerID=455046071905748780] [planID=455046071905748783]
[inputSegments="[455007134350525077,455007134316823700,455007134381307513,455046071898345279]"]
[error="segment is compacting: compaction plan conflict"]
i我怀疑这些输入片段仍在ETCD中标记为不合理,从而阻止了Milvus执行新的压实任务。如果这些段保持不兼容,这是否意味着它们再也不会被压实了吗?米尔维斯是否具有失败后恢复此类元数据的机制?
研究问题后,我发现与压实相关的核心逻辑主要是在DataCoord中处理的,并且在元数据中记录了压实任务。重新启动后,从元数据中读取任何未完成的压实任务并执行。
milvus/internal/datacoord/compaction.go
Line 90 in e6bf141
meta CompactionMeta
任务从启动时从元数据加载时,相应的段标记为iSPACKINGing。但是,Compaction_Trigger和恢复机制独立运行。 compaction_trigger扫描可以压实的片段,但是当它遇到已标记为ISCompacting的段时,它会记录以下警告:
segment is compacting: compaction plan conflict
可以安全地忽略这种冲突。 Compaction_Trigger将跳过这些拼写段。一旦完成了元数据的先前记录的任务,Compaction_Trigger将恢复正常操作,并且压实将按预期进行。
摘要:警告消息并不表示失败,而是临时状态。 在先前未完成的压实任务完成之前,系统将不会尝试再次压缩段。 这些任务完成后,新的压实计划将正常执行。