毫无疑问,Milvus 曾经成为寰球诸多用户构建生产环境时必不可少的向量数据库。
近期,Milvus 公布了全新降级的 Milvus 2.3 版本,内核引擎减速的同时也退出了诸如反对 GPU 这样实用且弱小的个性。能够说,以 Milvus 2.3 为代表的 Milvus 2.x 版本无论在性能还是性能上都远超 Milvus 1.x 版本。因而,有很多新老用户反馈,想要将存量向量数据从其余数据源迁徙到 Milvus2.x 中,为了解决这一需要,Milvus-migration 我的项目应运而生。
读完本文,用户能够疾速把握 Milvus-migration 的性能特点和应用办法。(小声打个广告:Zilliz 云平台提供了更不便的一键迁徙性能)
01. 性能概述
目前迁徙反对的数据源有:
- Milvus 1.x 到 Milvus 2.x 迁徙
- Elasticsearch 到 Milvus 2.x 数据迁徙
- Faiss 到 Milvus 2.x 数据迁徙(Beta 版本)
- 反对包含命令行和 Restful API 的多种交互方式
- 反对多种文件模式的迁徙(本地文件、S3、OSS、GCP)
- 反对 Elasticsearch 7.x 以上版本、自定义迁徙字段结构表构造
02. 设计思路
总体架构
编程语言
Milvus-migration 应用 go 语言实现.
交互方式
命令行
命令行是最简便间接的应用形式,Milvus-migration 基于 cobra 框架实现了命令行。
Restful Api
Milvus-Migration 还提供 Restful API,便于工具服务化,并提供 Swagger UI。
Go module
Milvus-Migration 还能够作为 go module,集成到其余工具之中。
实现原理
对于迁徙 Milvus 1.x 和 Faiss 数据,次要会对原始数据文件内容进行解析,编辑转换成 Milvus 2.x 对应的数据存储格局,而后通过调用 Milvus sdk 的 bulkInsert 将数据写入,整个数据解析转换过程为流式解决,解决的数据文件大小实践上只受磁盘空间大小限度。数据文件反对寄存在 Local File、S3、OSS、GCP 和 Minio。
对于迁徙 Elasticsearch 数据,不同之处数据获取不是从文件,而是通过 ES 提供的 scroll api 能力 将 ES 数据顺次遍历获取,从而解析转成 Milvus 2.x 存储格式文件,同样是调用 bulkInsert 将数据写入。除了对存储在 ES dense_vector 类型的向量进行迁徙,也反对 ES 其余字段的迁徙,目前反对的其余字段类型有:long、integer、short、boolean、keyword、text、double。
接口定义
/start – 开启一个迁徙 job(相当于 dump 和 load 的联合,目前只反对 ES 迁徙)
/dump – 开启一个迁徙 dump job(将 source 数据 写入到 target 所在的存储介质中)
/load – 开启一个迁徙 load job(将写入 target 存储介质的数据 写入到 Milvus 2.x)
/get_job – 查看 job 运行后果
详情可参考 https://github.com/zilliztech/milvus-migration/blob/main/server/server.go。
03. 性能演示
上面应用我的项目中的例子来解说 Milvus-migration 的应用办法。示例可在我的项目 README.md 中找到。
Elasticsearch -> Milvus 2.x
1. 筹备 ES 数据
要迁徙 ES 数据,前提假如您曾经领有属于本人的 es Server(自建、ElasticCloud、阿里云 ES 等),向量数据存储在 dense_vector,以及其余字段在 index 中,index mapping 模式如:
2. 编译打包
首先下载迁徙我的项目源码:https://github.com/zilliztech/milvus-migration
执行: go get & go build,编译实现会在以后门路下产生可执行文件: milvus-migration。
3. 配置 migration.ymal config
开始迁徙之前,还须要筹备迁徙配置文件:蕴含数据的 source、target 数据等信息,内容示例如下:
dumper:
worker:
workMode: elasticsearch ------ 工作模式:elasticsearch
reader:
bufferSize: 2500 --------- 从 es 每次批量获取的数量
meta:
mode: config -------- 固定写法,其余数据源迁徙会有其余不同值
index: test_index -------- es index
fields: -------- 须要同步的 es 字段有哪些:- name: id -------- es 字段名
pk: true -------- pk=true, 示意这个字段作为 milvus 的主键, 没设置状况下默认会采纳 es document _id 作为主键
type: long
- name: other_field
maxLen: 60 ------- 对应 milvus VarChar 字段类型的 maxLen, 对于 varchar 类型不设置 maxLen 则默认最大值:65535
type: keyword
- name: data
type: dense_vector ------- 向量字段,对应 milvus 的 field_vector 类型, 必须迁徙有 dense_vector 的字段
dims: 512
milvus: ------- 这部分配置非必填,设置生成的 milvus 表的属性,为空则按默认值
collection: "rename_index_test" --- 表名,为空则 esIndex 作为表名
closeDynamicField: false --- 为空默认为 false(开启动静列性能)
consistencyLevel: Eventually --- 一致性,为空按 milvus 的默认级别
shardNum: 1 --- 分片数量, 为空默认为 2
source: ------- es server 连贯配置信息, 反对 serviceToken,fingerprint,cloudId/apiKey,user/pwd,ca.crt 等形式连贯 / 认证
es:
urls:
- http://localhost:9200
username: xxx
password: xxx
target: ------ 迁徙到指标 mivlus 的 bucket 信息
mode: remote
remote:
outputDir: outputPath/migration/test1
cloud: aws
region: us-west-2
bucket: xxx
useIAM: true
checkBucket: false
milvus2x:
endpoint: {yourMilvusAddress}:{port}
username: ******
password: ******
对于配置文件更加具体的介绍,请参考我的项目 README.md。
4. 执行迁徙 job
将配置文件放入任意文件目录下,通过执行命令形式开启迁徙工作:
./milvus-migration start –config=/{YourConfigFilePath}/migration.yaml
察看日志输入,当呈现相似如下日志示意迁徙胜利:
[task/load_base_task.go:94] ["[LoadTasker] Dec Task Processing-------------->"] [Count=0] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]
[task/load_base_task.go:76] ["[LoadTasker] Progress Task --------------->"] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]
[dbclient/cus_field_milvus2x.go:86] ["[Milvus2x] begin to ShowCollectionRows"]
[loader/cus_milvus2x_loader.go:66] ["[Loader] Static:"] [collection=test_mul_field4_rename1] [beforeCount=50000] [afterCount=100000] [increase=50000]
[loader/cus_milvus2x_loader.go:66] ["[Loader] Static Total"] ["Total Collections"=1] [beforeTotalCount=50000] [afterTotalCount=100000] [totalIncrease=50000]
[migration/es_starter.go:25] ["[Starter] migration ES to Milvus finish!!!"] [Cost=80.009174459]
[starter/starter.go:106] ["[Starter] Migration Success!"] [Cost=80.00928425]
[cleaner/remote_cleaner.go:27] ["[Remote Cleaner] Begin to clean files"] [bucket=a-bucket] [rootPath=testfiles/output/zwh/migration]
[cmd/start.go:32] ["[Cleaner] clean file success!"]
除了应用命令形式,我的项目也反对 Restful api 来执行迁徙。首先执行如下命令来启动 Restful api server:
./milvus-migration server run -p 8080
看到以下日志示意服务启动胜利:
将 migration.yaml 配置放在以后我的项目的 configs/migration.yaml, 而后调用 api 来启动迁徙:
curl -XPOST http://localhost:8080/api/v1/start
当迁徙完结后,咱们也能够通过 Attu 来查看迁徙胜利的总行数,也能够在 Attu 进行 load collection 操作;而 collection 主键和 vector 字段建设 autoIndex 索引在迁徙过程会主动创立好。
拜访 swagger 来查看服务提供的 api:http://localhost:8080/docs/index.html
ES 到 Milvus 2.x 迁徙就介绍到这里,上面咱们来看下 milvus1.x -> 2.x 迁徙过程。
Milvus 1.x -> Milvus 2.x
1. Milvus 1.x 数据筹备 – (可跳过,Zilliz Cloud 上的 Milvus 用户迁徙会用到)
为了让用户疾速体验,在我的项目源码的 testfiles 目录下搁置了 1w 条 Milvus 1.x 测试数据在 test1/ 目录下,目录构造:蕴含 tables 和 meta.json 两局部。疾速体验可用该测试数据:
失常状况用户须要导出本人的 Milvus 1.x 的 meta.json 文件,导出形式可通过命令:
./milvus-migration export -m “user:password@tcp(adderss)/milvus?charset=utf8mb4&parseTime=True&loc=Local” -o outputDir
其中 user/password/address 为 Milvus1.x 应用的 mysql;会导出到 outputDir,导出前 Milvus1.x server 须要停机或者进行写入数据。随后将 Milvus 的 tables 文件夹进行 copy 和 meta.json 放到同一个目录上面。(Milvus 的 tables 文件夹个别在 /${user}/milvus/db/tables)
目录构造如下:
filesdir
--- meta.json
--- tables
当筹备好数据后,如果应用的 Milvus 2.x 在 Zilliz Cloud 云,则可间接在 cloud console 页面进行迁徙操作。
2. 编译打包
我的项目源码编译同上,最终生成可执行文件: milvus-migration(在下面的 export 命令中也是应用该文件命令)
3. 配置 migration.ymal config
dumper:
worker:
limit: 2
workMode: milvus1x ------ 工作模式:milvus1x
reader:
bufferSize: 1024 ----- file reader/writer buffer size
writer:
bufferSize: 1024
loader:
worker:
limit: 16 ------- 反对同时并发迁徙的表数量
meta:
mode: local ------ meta.json 文件寄存形式,有:local, remote, mysql, sqlite,
localFile: /outputDir/test/meta.json
-- mode: mysql # milvus 的元数据 mysql 地址
-- mysqlUrl: "user:password@tcp(localhost:3306)/milvus?charset=utf8mb4&parseTime=True&loc=Local"
source: ----- milvus1.x talbes 目录文件存储源,能够在 local, s3,minio,oss,gcp
mode: local
local:
tablesDir: /db/tables/ -- 数据文件 tables 目录
target: ------ 数据通过 bulkInsert 写入的指标存储地位,mode: remote --- 写入的存储的形式能够能够是:remote 和 local(仅验证 dump 性能应用)
remote:
outputDir: "migration/test/xx" -- 写入的门路
ak: xxxx
sk: xxxx
cloud: aws ------ 写入的 cloud, 能够是 aws, gcp, ali,(如果是 minio 也填写 aws)
region: us-west-2
bucket: xxxxx
useIAM: true
checkBucket: false
milvus2x:
endpoint: "{yourMilvus2_xServerAddress}:{port}"
username: xxxx
password: xxxx
对于 migration.yaml 配置文件更加具体的介绍,请查看我的项目 README.md。
4. 执行迁徙 Job
不同于 ES 的迁徙应用一个命令即可实现迁徙,目前 Milvus 1.x 和 Faiss 迁徙须要执行 dump 和 load 两个命令 (前期布局会革新成一个指令即可)。
- dump 命令
./milvus-migration dump –config=/{YourConfigFilePath}/migration.yaml
它将 Milvus 1.x 文件数据转为 numpy 文件通过 bulkInsert 写入 target bucket.
- load 命令
执行 load 命令,将转换好的数据文件导入到 Milvus 2x 外面:
./milvus-migration load –config=/{YourConfigFilePath}/migration.yaml
最终在 Milvus 2.x 中,生成的 collection 中会有两个字段:id 和 data, 可通过 Attu 查看 collection。
Faiss -> Milvus 2.x
#### 1. Faiss 数据筹备
前提条件是用户曾经筹备好了本人的 faiss 数据文件。(为了能疾速体验,在我的项目源码的 testfiles 目录下搁置了 faiss 测试数据不便用户体验: faiss_ivf_flat.index.
2. 编译打包
这部分同上,不再开展介绍。
3. 配置 migration.ymal config
dumper:
worker:
limit: 2
workMode: faiss ------ 工作模式:faiss
reader:
bufferSize: 1024
writer:
bufferSize: 1024
loader:
worker:
limit: 2
source:
mode: local ---- 数据源能够为 local 和 remote
local:
faissFile: ./testfiles/faiss/faiss_ivf_flat.index
target:
create: ----- 指定生成的 collection 属性
collection:
name: test1w
shardsNums: 2
dim: 256
metricType: L2
mode: remote
remote: ------- 上面配置是将数据写入到本地搭建的 minio 中,milvus2x 也是本地
outputDir: testfiles/output/
cloud: aws ---- 同样反对 aws, gcp, ali
endpoint: 0.0.0.0:9000
region: ap-southeast-1
bucket: a-bucket
ak: minioadmin
sk: minioadmin
useIAM: false
useSSL: false
checkBucket: true
milvus2x:
endpoint: localhost:19530
username: xxxxx
password: xxxxx
对于 Faiss 的 migration.yaml 配置文件更加具体的介绍,请查看我的项目 README.md
4. 执行迁徙 Job
- dump 命令
./milvus-migration dump –config=/{YourConfigFilePath}/migration.yaml
它将 Faiss 文件数据转为 numpy 格式文件通过 bulkInsert 写入 target bucket.
- load 命令
执行 load 命令,将转换好的数据文件导入到 Milvus 2x 外面:
./milvus-migration load –config=/{YourConfigFilePath}/migration.yaml
实现后可通过 Attu 查看生成的 collection 信息进行验证。
04. 将来布局
- 反对 Redis 迁徙到 Milvus
- 反对 Mongodb 迁徙到 Milvus
- 反对迁徙过程断点续传
- 简化迁徙命令:合并 dump 和 load 过程
- 反对其余数据源迁徙到 Milvus
参考资料
- Milvus-migration: https://github.com/zilliztech/milvus-migration
- Attu: https://milvus.io/docs/attu.md
- bulkinsert: https://milvus.io/docs/bulk_insert.md
- 官网文档: https://milvus.io/docs
- ES scroll api: https://www.elastic.co/guide/en/elasticsearch/reference/7.17/paginate-search-results.html#scroll-search-results
- 如果在应用 Milvus 或 Zilliz 产品有任何问题,可增加小助手微信“zilliz-tech”退出交换群。
- 欢送关注微信公众号“Zilliz”,理解最新资讯。
本文由 mdnice 多平台公布