近日,Milvus 2.2.0 发布,新版本里支持了许多激动人心的功能,包括:磁盘索引(DiskANN)、从文件中批量导入数据(bulk_insert)、基于角色的访问控制(RBAC)、集合生存时间(TTL)等。不少社区的小伙伴对新版本都已经跃跃欲试。不过与以往版本直接升级镜像的简单操作相比,由于 2.2 和 2.1 的元数据发生了变化,以及接口侧的一些行为发生了改变,所以升级的手续要比以前多一丢丢了。下面就让我们来看看如何优雅地将 Milvus 从 2.1.x 版本升级到 2.2.x 版本。
整个升级过程主要涉及两部分的变更,分别是部署侧和接口侧。部署侧主要是镜像和元数据的变更,接口侧主要是 sdk 的行为变更,从而需要在原来的业务代码上做一些调整。接下来我们会对这两部分分别介绍。本文以 Milvus 2.1.4 升级到 Milvus 2.2.0 为例进行介绍,因为 2.1.0 到 2.1.4 之间的所有版本,数据和接口都是兼容的,所以其他 2.1.x 版本的升级都是类似的。
#01
部署侧升级
Milvus 2.2.0 以前,RootCoord 同时负责管理集合的元信息以及索引的元信息,IndexCoord 只负责索引任务的调度。为了让索引元信息与 RootCoord 解耦,Milvus 2.2 决定把原来由 RootCoord 管理的索引元信息转移到由 IndexCoord 管理。所以,部署侧升级的核心工作就是将 Milvus 2.1.4 的元数据结构修改为 Milvus 2.2.0 的元数据结构,并用新的 Milvus 2.2.0 镜像启动 Milvus 的各个组件。
由于 Milvus 具有单机和分布式两种形态,部署模式支持 docker compose、Helm、k8s operator,为了表述更加清晰,我们使用表格来说明各自的操作步骤和注意事项。
由于 APT/YUM 和 Ansible 不是社区推荐的主流部署模式,所以本次的升级实践暂不讨论这两种部署模式。
单机版
分布式
#02
接口侧升级
API 层面,为了统一社区三大官方 SDK(Python SDK、Java SDK、Go SDK)的行为,以及统一用户对 Milvus 的使用规范,Milvus 2.2.0 对 create_index()、drop_index()、load()、release()、flush() 这几个接口做了限制和补充。归纳起来分为索引和数据加载以及数据落盘(flush)两大类。 索引和数据加载
-
没有建立索引的集合无法加载。
-
集合加载后不能再创建索引。
-
集合释放后才能删除索引。 涉及到的接口包含:create_index()、drop_index()、load()、release()。下面通过一些 2.1.4 和 2.2.0 的应用代码的写法对比,来详细说明上面三条变更带来的变化。
对于“没有建立索引的集合无法加载”这条规则,有一个特殊的要注意的情况,那就是 Flat 暴搜。在 2.2.0 之前,数据插入集合后,用户可以直接调用load()接口,然后就可以使用 Flat 做暴搜。在 2.2.0 之后,为了遵循“没有建立索引的集合无法加载”这条规则,即使你想要使用 Flat 做暴搜,那么你也需要在 load 之前显式创建 Flat 索引。具体的使用代码如下:
hello_milvus = Collection(...)
hello_milvus.insert(...)
index = {
"index_type": "FLAT",
"metric_type": "L2",
"params": {},
}
hello_milvus.create_index("embeddings", index)
hello_milvus.load()
hello_milvus.search(...)
数据落盘(Flush)
Flush() 是在 Milvus 2.2.0 里面新增的一个接口,含义是对数据段 (segment) 进行密封 (sealed) 并将其同步到对象存储中。在之前的版本里面,Milvus 里面没有暴露 Flush() 接口,但是在调用 num_entities() 或 create_index() 的时候,会隐式地调用 Flush API。
Flush() 一般用在数据插入结束之后,创建索引之前,这样可以保证所有的数据都成功落盘并顺利创建索引。需要注意的是,当你进行多次数据插入的时候,最好不要过于频繁地调用 Flush() 接口。因为太过频繁地调用Flush(),会生成很多小的数据段(segment),进而会触发很多 compaction 操作,对系统的 IO 和稳定性产生较大影响。
以上就是接口侧升级的主要内容,最后还需要提醒大家,使用 Milvus 2.2.0 的时候,需要把 SDK 也升级到 2.2.0 版本,避免发生异常的不兼容情况。
#03
结语
当你做完部署侧和接口侧的升级后,恭喜你,你已经顺利完成 2.1.x 到 2.2.x 的升级工作了。版本间数据和接口不兼容还是挺烦人的一件事,社区后面一定会减少这样的不兼容变更,让每一位 Milvuser 获得更加良好的使用体验~
Milvus 2.2.x 比 Milvus 2.1.x 的性能提升了 50+%,具体信息可以参考 Milvus 官网上的 Benchmark:https://milvus.io/docs/benchmark.md。心动不如行动,赶快来体验极速的向量检索服务吧!