记录一下那天晚上的排查过程。检索接口偶发报 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,响应时间稳定。
这里还有个坑。加载状态查询本身也要时间,别在高频请求路径里反复调用,放到启动流程里做一次预热更合适。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。