记录一下那天晚上的排查过程。检索接口偶发报 collection not loaded,重启服务后第一次查询必现,稍后又恢复正常。

刚开始盯着「空闲超时后自动释放,没有保活机制」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。集合在重启后被释放,需要重新加载。还有一种是load 是异步操作,返回成功不代表可查。

还有一种情况,多副本部署时部分节点状态不同步。

上来先查询前先显式加载集合

client.load_collection('docs')

随后加载后轮询状态直到可查

while not client.get_load_state('docs').state == 'Loaded': time.sleep(1)

接着确认集合的加载状态

python -c "print(client.get_load_state('docs'))"

服务启动时统一预热一次

python warmup.py --collections docs,faq

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

改完先别撤,确认这几项。服务启动后首次查询就能返回结果,日志里不再出现 collection not loaded,响应时间稳定。

这里还有个坑。加载状态查询本身也要时间,别在高频请求路径里反复调用,放到启动流程里做一次预热更合适。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189