新老用户看过来~最实用的 Milvus 迁移手册来啦!

news2024/11/24 6:01:24

毫无疑问,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.设计思路

总体架构

alt

编程语言

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 形式如:

alt

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

看到以下日志表示服务启动成功:

alt

将 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

alt

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 两部分。快速体验可用该测试数据:

alt

正常情况用户需要导出自己的 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.

alt

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

参考资料

  1. Milvus-migration: https://github.com/zilliztech/milvus-migration

  2. Attu: https://milvus.io/docs/attu.md

  3. bulkinsert: https://milvus.io/docs/bulk_insert.md

  4. 官方文档: https://milvus.io/docs

  5. 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 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1022905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何第一时间把DLL插件注入到目标进程

在windows下,把DLL插件注入到一个进程的方法有很多,比较常用的比如用远程线程(CreateRemoteThread)注入,或者用windows的API:SetWindowsHookEx来注入,如下图,可以用RemoteDll这个注入工具进行注入操作&…

【双分支混合CNN-transforme:Pansharpening】

DBCT-Net:A dual branch hybrid CNN-transformer network for remote sensing image fusion (DBCT-Net:一种用于遥感图像融合的双分支混合CNN-transformer网络) 遥感图像融合是指将高空间分辨率的单波段全色图像与光谱信息丰富的多光谱图像进行融合,生成…

HTTPS 的加密流程的总结

什么是HTTPS 和HTTP一样也是应用层协议,但在HTTP协议的基础上引入了一个加密层(SSL/TLS). HTTP协议内容都是按照文本的方式明文传输的这导致在传输过程第三方者能够轻易获取传输的内容,而HTTPS在HTTP协议基础上引入一个加密以防止传输内容泄露或被篡改。 因此HTTPS…

项目经理不容错过的一个认证——《研发效能(DevOps)工程师国家职业技术认证》

一、引言 在当今的商业环境中,软件研发已成为企业保持竞争力的关键因素之一。项目经理在软件研发中扮演着重要角色,而随着企业对于研发效率的追求,考取《研发效能(DevOps)工程师国家职业技术认证》对于项目经理的职业发展具有重要意义。本文…

许战海战略文库|无增长则消亡:大型制造集团增长困境

竞争环境不是匀速变化,而是加速变化。企业的衰退与进化、兴衰更迭在不断发生,这成为一种不可避免的现实。在过去的100年里,全球经济周期的时间长度明显缩短,周期内的波动也更为剧烈。联合国教科文组织的研究表明,18世纪知识更新的周期约为80到…

什么国产工作流引擎好?

要想提升办公协作效率,获得高效发展,可以借助低代码技术平台的力量。它的轻量级、灵活、易维护、好操作等优势特点都是现代化办公环境里的得力助手,也可以帮助大家打破信息孤岛,连接内部数据资源,为企业未来发展提供强…

在编译源码的环境下,搭建起Discuz!社区论坛和WordPress博客的LNMP架构

目录 一.编译安装nginx 二.编译安装MySQL 三.编译安装PHP 四.安装论坛 五.安装wordpress博客 六.yum安装LNMP架构(简要过程参考) 一.编译安装nginx 1)关闭防火墙,将安装nginx所需软件包传到/opt目录下 systemctl stop fire…

Xcode15+iOS17适配以及遇到的问题

今天更新了 Xcode15,遇到了一些问题,做下记录希望大家少走点坑。 1.iOS17 SDK 安装失败 Xcode更新完成后,打开项目一直显示 no fund iOS17 sdk,根据项目不同提示可能有区别,根据提示下载后提示安装失败,…

【vue+elementUI】输入框样式、选择器样式、树形选择器和下拉框样式修改

输入框样式、选择器样式和下拉框样式修改 1、输入框和选择器的样式修改:2、下拉弹框样式A. 选择器的下拉弹框样式修改B. 时间选择器的下拉弹框样式修改C. vue-treeselect树形下拉框样式 1、输入框和选择器的样式修改: 写在style中不能加scoped&#xff0…

力扣:103. 二叉树的锯齿形层序遍历(Python3)

题目: 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 来源:力扣(LeetCode&#…

远程监控电脑软件有哪些?远程桌面监控软件哪个好用

随着科技的发展,远程桌面监控软件已经成为企业和个人用户的重要工具。它们可以帮助用户在任何地方、任何时间监控和管理远程计算机。本文将详细介绍远程桌面监控软件是什么,有哪些常见的远程桌面监控软件。 首先,我们来了解一下什么是远程桌面…

win系统环境搭建(一)——Windows安装一些小工具

windows环境搭建专栏🔗点击跳转 win系统环境搭建(一)——Windows安装一些小工具 本系列windows环境搭建开始讲解如何给win系统搭建环境,本人所用系统是腾讯云服务器的Windows Server 2022,你可以理解成就是你用的wind…

gpu cuda 数组求和优化

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 问题描述 给定1个数组&#xff0c;利用gpu求和并返回结果。 cpu 算法 #include <math.h> #include<vector> #include<time.h> #include <stdio…

了解:iperf网络性能测试工具

当进行网络性能测试时&#xff0c;可以使用iperf这个开源工具。iperf是一款网络测试工具&#xff0c;它能够测试TCP或UDP带宽质量&#xff0c;以及单向和双向吞吐量。使用iperf进行网络性能测试首先需要在被测试的两台计算机上安装iperf。 如何安装iperf&#xff1f; 在Debia…

HTTP请求行详解

目录 一、认识URL 二、认识方法 2.1 GET方法 2.2 POST方法 2.3 其他方法 请求行也就是HTTP请求的第一行&#xff0c;接下来将对第一行内容进行详细解释 一、认识URL 平时我们俗称的 "网址" 其实就是说的 URL (Uniform Resource Locator 统一资源定位符)。互联网上的…

利用哈希表封装unordered_map和unordered_set

目录 一、迭代器1.1 普通迭代器1.1.1 operator 1.2 const迭代器1.3 代码实现 二、封装unordered_set三、封装unordered_map 一、迭代器 1.1 普通迭代器 1.1.1 operator 对于哈希桶结构&#xff0c;它的迭代器应该如何设计呢&#xff1f;我们仅封装一个Node的指针就行了吗&am…

扬帆配资:首个国家层面电力现货市场 建设规则出炉

9月18日&#xff0c;国家发改委、国家动力局发布了已于近日印发的《电力现货商场底子规则&#xff08;试行&#xff09;》&#xff08;下称《规则》&#xff09;&#xff0c;作为国家层面的首个电力现货商场制作规则文件&#xff0c;推进构建全国一致电力商场系统。 扬帆配资&…

VB过程的递归调用,辗转相除法求最大公约数

VB过程的递归调用&#xff0c;辗转相除法求最大公约数 过程的递归调用&#xff0c;辗转相除法求最大公约数 Private Function gys(ByVal m%, ByVal n%) As IntegerDim r%r m Mod n m大或者n大都无所谓&#xff0c;这个不影响计算&#xff0c;由于辗转相除法的算法&#xff0c…

高阶数据结构——图

图 图的基本概念 图的基本概念 图是由顶点集合和边的集合组成的一种数据结构&#xff0c;记作 G ( V , E ) G(V, E)G(V,E) 。 有向图和无向图&#xff1a; 在有向图中&#xff0c;顶点对 < x , y >是有序的&#xff0c;顶点对 < x , y > 称为顶点 x 到顶点 y 的…

Weblogic反序列化漏洞(CVE-2018-2628/CVE-2023-21839复现)

内容目录 Weblogic反序列化漏洞(CVE-2018-2628/CVE-2023-21839)weblogic中间件CVE-2018-2628漏洞描述影响版本漏洞复现修复方案 CVE-2023-21839漏洞描述影响版本漏洞复现修复方案 Weblogic反序列化漏洞(CVE-2018-2628/CVE-2023-21839) weblogic中间件 WebLogic是美国Oracle公司…