近期,Milvus 上线了 2.2.12 版本,此次更新不仅一次性增加了支持 Restful API、召回原始向量、json_contains 函数这三大特性,还优化了 standalone 模式下的 CPU 使用、查询链路等性能,用一句话总结就是:低门槛、高可用、强性能。
01.
New Features
- Restful API
为了进一步降低使用 Milvus 的门槛、提升用户体验,在 2.2.12 版本中 Milvus 支持了 Restful API,用户无需安装客户端,通过 Restful API 即可完成对接。用户在部署 Milvus 时无需占用额外端口,SDK 和 Restful 同时使用 19530 端口。
相比于使用 SDK,Restful 在易用性上更有优势,但高级的运维接口仍需使用 SDK。同时,如果你是延迟敏感型业务,我们也建议使用 SDK。
具体的 Restful API 详见:https://milvus.io/api-reference/restful/v2.2.x/About.md
- 召回原始向量
在 Milvus 2.2.12 版本以前,出于对性能及优化内存的角度考虑,用户进行 search 时不支持返回原始向量。很多召回原始向量的场景不得不将查询拆成两步来执行:用户需要先进行 ANN search 向量id,再根据 id query 原始向量。这不仅增加了用户的学习和开发成本,对 Milvus 来讲也无法达到节约资源的效果。
有了 Milvus 2.2.12,用户可以直接在 ANN search 时返回原始向量,无需额外的操作步骤,省时又省力。
- 支持 json_contains
如大家所知,在 Milvus 2.2.8 支持 JSON 类型之后,我们立刻收到了大量的用户反馈,其中呼声最高的就是支持 JSON 数组的各种运算,包括包含、不包含、交集、并集、差集等等。不同的算子实现难度各有不同,在 2.2.12 版本中,我们优先支持了 json_contains 函数来支持包含算子,其他的算子会在后续版本中陆续支持。
02.
Enhancements
除了新增的三大特性,我们还对部分性能进行了优化:
- #25238
优化 standalone 模式下的 CPU 使用。在 standalone 模式下,不少用户反馈系统空载情况下也会有很高的 CPU 占用,经过长期的排查,我们发现了几个问题:
rocksdb 的参数使用不当会触发很多无意义的 compaction 以及磁盘 IO;
迭代器使用不当频繁访问同一前缀的数据。
为此,我们重新梳理了 rocksdb 的参数使用,同时开启了 level 2 以上的 zstd 压缩减少磁盘使用量。
- #25402
支持 varchar 类型的主键使用主键索引。由于之前的系统限制,主键是 varchar 类型时无法命中索引,导致性能不佳,经过修复后此场景能够提升 10 倍以上效率。
- #25192
优化查询链路,跳过无必要的 reduce 步骤。通过 tracing 等手段排查,发现在 reduce 阶段有可能会耗费大量时间甚至超过向量搜索时间,尤其是在大 NQ 的场景中。此次优化效果显著,在部分场景中能有 4 倍以上的性能提升。
- #25772
解决单机多 CPU 场景下 CPU 利用率低的问题。我们新增了 queryNode.minCPUParallelTaskNumRatio=4 参数,通过调整此参数,可以调整单机的并行度。
值得注意的是:需要结合具体的业务场景经过测试、微调才能得到一个比较好的并发参数,如果不确认最好保持默认值。通过参数控制是 2.2 系列的临时方案,在 2.3 系列中会增加更智能的并发控制逻辑。
03.
Bugfix
#25470 #25510 修复 Milvus 占用过多 MinIO 的问题。产生很多 MinIO 文件是因为 Milvus 的 compaction 机制过于频繁以及垃圾清理机制比较保守,这会在 MinIO 中累积大量的过期文件,在新版本中我们调整了这些策略,节约用户的存储资源。
#25757 #24858 #25369 #25513 修复删除数据后还能被查询到的问题。产生此问题的原因较为复杂,有兴趣的同学可以参考 PR 的内容。
#25181 #25194 #25107 #25305 修复了很多对象存储相关的问题。在 2.2.8 之后,我们引入了 aws-sdk-cpp 读取对象存储,遇到了不少问题。此次更新修复了很多由此带来的 bug,包括增加了错误码、修复线程创建失败问题、在 MacOS 环境无法读取文件的问题。
#25809 #25758 修复 bulk-insert 的问题。越来越多的用户在生产环境中部署 Milvus,在冷启动阶段批量导入功能至关重要,此次更新修了大量 bulk-insert 的 bug,提升了批量导入的稳定性。