Milvus 迁移升级攻略

Milvus 自 2019 年 10月 15 号开源以来,从刚开始的 0.5.0 版本已经更新迭代到了现在的 0.10.2 版本,其间大大小小一共经历了十几个版本。面对这么多版本,很多朋友可能都会有这些疑惑:

  • 哪些版本之间可以进行平滑升级?

  • 能够平滑升级的版本之间具体又该如何升级?

此外,一些朋友进行功能测试的时候是在有网环境里,但是最终上线的时候由于场景的特殊性以及数据的保密性,他们只能在无网环境中部署。于是不禁会问:

  • 如何将 Milvus 从有网环境迁移到无网环境?

针对以上这些问题,本文将一一为大家解答。

 

| Milvus 数据目录介绍

无论是版本的升级还是有网环境到无网环境的迁移,都是围绕着 Milvus 的四个文件夹(conf、db、wal、logs)进行的。所以在开始之前对这四个文件夹做一下介绍是十分必要的。

  • conf

conf 目录用来存放 Milvus 的配置文件。

在 Milvus v0.8.0 及之前版本中,conf 目录里包含两个配置文件:server_config.yaml 和 log_config.conf。server_config.yaml 设置的是 Milvus server 的配置参数,log_config.conf 设置的是 Milvus 日志的配置参数。

在 Milvus v0.8.0 之后的版本中,conf 目录里只包含一个配置文件:server_config.yaml。关于日志的参数设置放到了 server_config.yaml 中的 logs 区域。

  • db

db 目录用来存放 Milvus 的数据文件和索引文件。如果使用 SQLite 来存储元数据,那么 db 目录下还会存放 Milvus 的元数据。db 目录是进行 Milvus 版本升级和数据迁移时需要重点关注的文件夹。一个 db 目录的结构可参考下图示例:

meta.sqlite:SQLite 数据库用来存储 Milvus 元数据的文件。

meta.sqlite-shm:SQLite 数据库的共享内存文件。

meta.sqlite-wal:SQLite 数据库的 WAL (Write-Ahead Logging) 文件。


⚠️注意 :如需将 Milvus 部署在生产环境,必须使用 MySQL 替代 SQLite 管理元数据。具体替代方法参考使用 MySQL 管理元数据:

https://milvus.io/cn/docs/v0.10.2/data_manage.md


tables:存储 Milvus 所有集合和分区的文件夹。

test_table:存储名为 “test_table” 的集合内的所有数据段文件。

test_partition:存储名为 “test_partition” 的分区内的所有数据段文件。


⚠️注意:

  • Milvus 中集合(collection)和分区(partition)在逻辑上是父子级,但是在文件结构上是平级的。

  • 集合与分区的关系可以在 meta 文件中找到。


1591254355070376000:存储集合中一个数据段(segment)文件的所有数据的目录。

1591254355070376000.rv:存储当前数据段(segment)的原始向量。

1591254355070376000.uid:存储当前数据段(segment)的所有向量 ID。

1591254661450955000:存储当前数据段(segment)的索引文件。

bloom_filter:布隆过滤器,用来判断一个向量 ID 是否存在于该数据段(segment)中。

deleted_docs:用来记录删除的向量 ID。

  • wal

wal 目录用来存储 Milvus 的预写式日志(Write-Ahead Logging)文件,一般不影响版本升级和数据迁移。

  • logs

logs 目录用来存储 Milvus 的日志文件,一般不影响版本升级和数据迁移。

 

| Milvus 版本升级指南

 

Milvus 版本升级一般可归纳为三个步骤:数据兼容性判断、升级服务端、升级客户端。

  • 数据兼容性判断

Milvus 版本升级之前,我们第一步需要判断两个版本的数据是否兼容。如果数据不兼容,这两个版本是无法直接升级的,只能重新导入数据进行升级。一般来讲,如果两个版本的 Milvus 的元数据没有修改,那么这两个版本的数据就是兼容的。

如果两个版本的 Milvus 数据兼容,升级时可以直接将老版本 Milvus 的 db 目录拷贝出来,在启动新版本 Milvus 时,直接映射老版本的 db 目录。

从开源时的 0.5.0 版本到现在最新的 0.10.2 版本,根据数据兼容性可以将这些版本分成三个阶段,每个阶段的版本数据相互兼容,不同阶段的版本数据不能兼容:

第一阶段

v0.5.0 ~ v0.5.3

第二阶段

v0.6.0

第三阶段

v0.7.0 ~ v0.10.2

在做版本升级时,除了 db 目录可以复用之外,Milvus 目录下的其他文件夹基本上都无法复用,尤其是配置文件。请务必使用对应版本的配置文件,否则无法成功启动 Milvus。

  • 升级服务端

服务端升级,主要是指对 Milvus Docker 进行升级,通过拉取官方提供的对应版本的 Milvus Docker 镜像,利用docker run命令启动 Milvus 服务端。

  • 升级客户端

Milvus 目前提供了 Python、Java、C++ 和 Go 语言的 SDK。服务端升级之后,客户端也要升级至对应的版本。客户端与服务端的版本对应关系可以查看 Milvus 发版说明:https://milvus.io/cn/docs/v0.10.2/release_notes.md。

 

| Milvus 从有网环境迁移到内网环境

对于在有网环境测试但需要在内网环境部署的场景,可以通过内网安装 Milvus 服务端、内网安装 Milvus 客户端、拷贝 Milvus 目录三个步骤来实现有网环境到内网环境的迁移。

  • 内网安装 Milvus 服务端

官方推荐使用 Docker 的方式部署 Milvus 服务端,所以本文主要介绍如何内网安装 Docker 版本的 Milvus。内网安装的关键步骤是获取 Milvus Docker 的镜像,有了 Docker 镜像,就可以通过docker run轻松启动 Milvus 服务端了。

因为 Docker 提供了docker save和docker load命令来帮助我们打包和加载 Docker 镜像,所以可以通过在有网机器上拉取 Milvus Docker 镜像,用docker save将其压缩成一个 TAR 包,利用移动存储介质将镜像 TAR 包拷贝到内网机器上,最后利用docker load来加载镜像。整个过程可以用下面的流程图来描述:      

                

相应的 Docker 指令如下:

 $ docker save milvusdb/milvus > milvus_image.tar $ docker load < milvus_image.tar
  • 内网安装 Milvus 客户端

Milvus 提供了多种语言的客户端,以下主要介绍如何在内网环境中安装 Milvus Python 客户端 pymilvus。

第一步:从有网机器上下载 pymilvus 包(多个 WHL 文件)到指定文件夹。

pip3 download -d <your path> pymilvus

第二步:将下载好的 pymilvus 包拷贝到内网的机器,进行安装。

pip3 install <your path>/*.whl
通过上述两个步骤就可以在内网环境中安装好 Milvus 的 Python 客户端了。



  • 拷贝 Milvus 目录

从有网环境迁移到内网环境的最后一步就是将有网机器上的 Milvus 文件夹拷贝到内网机器上。拷贝完成之后为了保证顺利启动 Milvus Docker,还需要手动删除 Milvus 目录下的 wal 文件夹。

将上述所有准备工作做好之后,就可以在内网机器上通过docker run映射拷贝过来的 db 目录、logs 目录以及 conf 目录来启动 Milvus 了。

以上是一些 Milvus 迁移和升级策略的粗浅介绍。欢迎更多有志推广非结构化数据搜索的朋友一起加入 Milvus 开源社区,共同见证 Milvus 的成长!

 

| 欢迎加入 Milvus 社区

github.com/milvus-io/milvus | 源码

milvus.io | 官网

milvusio.slack.com | Slack 社区

zhihu.com/org/zilliz-11/columns | 知乎

zilliz.blog.csdn.net | CSDN 博客

space.bilibili.com/478166626 | Bilibili