这个坑值得记一笔。增量同步文档时插入报主键已存在,导致整批失败,改成删除再插入又会出现短暂的空窗期。
刚开始盯着「批量写入里同一批就有重复 id」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。用了 insert 而不是 upsert,重复主键直接报错;主键由内容哈希生成,内容没变时必然重复;自动生成主键的字段被手工赋值。
动手时先改用量级更合适的 upsert 接口
client.upsert('docs', data)
随后写前对批内 id 去重
python -c "print(len(rows), len({r['id'] for r in rows}))"
接着确认主键字段定义与生成规则
python -c "print([f.name for f in client.describe_collection('docs')['fields']])"
末了分批写入并统计成功条数
python ingest.py --batch 500 --mode upsert
怎么算真的好了,看的是同一批现象。重复同步不再报错,文档数量与源数据一致,检索结果里没有重复片段。
upsert 是按主键覆盖,主键如果包含时间戳就会一直新增而不是更新,同步前先想清楚主键该由哪些字段组成。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。