问题出现得很突然,日志倒是留得挺全。qdrant-client 1.12 用 scroll 导出 8 万条 payload,按 offset 从 0 开始每页 1000 翻,第三页开始出现重复 id,去重后少了 1200 条。

刚开始盯着「用 limit 加 offset 的组合,语义理解错」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。scroll 的 offset 是上一页最后一个点的 id,不是条数。少数情况下是导出期间有新的 upsert,导致顺序变化。

另外,多分片返回顺序不保证全局有序。

第一件事是把接口返回的 next_page_offset 打出来

python -c "import json;print(json.load(open('page1.json'))['result']['next_page_offset'])"

循环用 next_page_offset 翻到底

python scroll_all.py --collection docs --limit 1000 --out dump.jsonl

再往下统计导出后 id 的唯一数量

python -c "import json;ids=[json.loads(l)['id'] for l in open('dump.jsonl')];print(len(ids),len(set(ids)))"

等前面都确认过,再导出期间暂停写入,保证快照一致

python -c "print({'pause_writes':True,'duration_min':10})"

隔了一天再看,现象没变,说明不是偶发。

怎么算真的好了,看的是同一批现象。导出条数与集合总数一致,id 全唯一,重跑两次结果相同。

提醒一点。分页一律用服务端给的游标,自己算 offset 在写入并发下必然出问题。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189