🚀 免费试用 Zilliz Cloud,完全托管的 Milvus,体验 10 倍的性能提升!立即试用>

milvus-logo
LFAI
  • Home
  • Blog
  • 如何将数据无缝迁移到 Milvus:综合指南

如何将数据无缝迁移到 Milvus:综合指南

  • Engineering
December 01, 2023
Wenhui Zhang

Milvus是一个强大的开源向量数据库,用于相似性搜索,可存储、处理和检索数十亿甚至数万亿向量数据,且延迟极低。它还具有高度可扩展性、可靠性、云原生性和丰富的功能。最新发布的 Milvus引入了更多令人兴奋的功能和改进,包括支持 GPU以提高 10 倍以上的性能,以及在单台机器上实现更大存储容量的 MMap。

截至 2023 年 9 月,Milvus 在 GitHub 上获得了近 23000 个星,拥有数万名来自不同行业、需求各异的用户。随着ChatGPT等生成式人工智能技术的普及,它正变得越来越受欢迎。它是各种人工智能堆栈的重要组成部分,尤其是检索增强生成框架,可以解决大型语言模型的幻觉问题。

为了满足希望迁移到 Milvus 的新用户和希望升级到最新 Milvus 版本的老用户日益增长的需求,我们开发了Milvus 迁移功能。在这篇博客中,我们将探讨 Milvus 迁移的功能,并指导你将数据从 Milvus 1.x、FAISSElasticsearch 7.0及更高版本快速迁移到 Milvus。

Milvus Migration,一个功能强大的数据迁移工具

Milvus Migration是用 Go 语言编写的数据迁移工具。它能让用户将数据从旧版本的 Milvus(1.x)、FAISS 和 Elasticsearch 7.0 及更高版本无缝迁移到 Milvus 2.x 版本。

下图展示了我们如何构建 Milvus 迁移及其工作原理。

Milvus 迁移如何迁移数据

从 Milvus 1.x 和 FAISS 迁移到 Milvus 2.x

从 Milvus 1.x 和 FAISS 迁移数据涉及解析原始数据文件的内容,将其转换为 Milvus 2.x 的数据存储格式,并使用 Milvus SDK 的bulkInsert 写入数据。整个过程基于数据流,理论上仅受磁盘空间限制,数据文件存储在本地磁盘、S3、OSS、GCP 或 Minio 上。

从 Elasticsearch 到 Milvus 2.x

在 Elasticsearch 数据迁移中,数据检索有所不同。数据不是从文件中获取,而是使用 Elasticsearch 的滚动 API 按顺序获取。然后将数据解析并转换为 Milvus 2.x 存储格式,接着使用bulkInsert 写入数据。除了迁移存储在Elasticsearch中的dense_vector 类型向量外,Milvus迁移还支持迁移其他字段类型,包括长、整数、短、布尔、关键字、文本和双。

Milvus 迁移功能集

Milvus Migration通过其强大的功能集简化了迁移过程:

  • 支持的数据源:

    • Milvus 1.x 到 Milvus 2.x

    • Elasticsearch 7.0 及以后版本到 Milvus 2.x

    • FAISS 到 Milvus 2.x

  • 多种交互模式:

    • 使用 Cobra 框架的命令行界面 (CLI)

    • 带有内置 Swagger UI 的有源 API

    • 作为 Go 模块集成到其他工具中

  • 支持多种文件格式

    • 本地文件

    • 亚马逊 S3

    • 对象存储服务(OSS)

    • 谷歌云平台(GCP)

  • 灵活的 Elasticsearch 集成:

    • 从 Elasticsearch 迁移dense_vector 类型向量

    • 支持迁移其他字段类型,如 long、integer、short、boolean、keyword、text 和 double

接口定义

Milvus 迁移提供以下关键接口:

  • /start:启动迁移任务(相当于转储和加载的组合,目前仅支持 ES 迁移)。

  • /dump:启动转储任务(将源数据写入目标存储介质)。

  • /load:启动加载任务(将数据从目标存储介质写入 Milvus 2.x)。

  • /get_job:允许用户查看任务执行结果。(更多详情,请参阅项目的 server.go

接下来,让我们用一些示例数据来探讨如何在本节中使用 Milvus 迁移。你可以GitHub 上找到这些示例。

从 Elasticsearch 迁移到 Milvus 2.x

  1. 准备 Elasticsearch 数据

迁移 Elasticsearch数据,你应该已经设置好自己的 Elasticsearch 服务器。你应该将向量数据存储在dense_vector 字段中,并用其他字段为它们建立索引。索引映射如下所示。

  1. 编译和构建

首先,从 GitHub 下载 Milvus 迁移的源代码。然后,运行以下命令进行编译。

go get
go build

这一步将生成一个名为milvus-migration 的可执行文件。

  1. 配置migration.yaml

在开始迁移之前,你必须准备一个名为migration.yaml 的配置文件,其中包括数据源、目标和其他相关设置的信息。下面是一个配置示例:

# Configuration for Elasticsearch to Milvus 2.x migration


dumper:
  worker:
    workMode: Elasticsearch
    reader:
      bufferSize: 2500
meta:
  mode: config
  index: test_index
  fields:
    - name: id
      pk: true
      type: long
    - name: other_field
      maxLen: 60
      type: keyword
    - name: data
      type: dense_vector
      dims: 512
  milvus:
      collection: "rename_index_test"
      closeDynamicField: false
      consistencyLevel: Eventually
      shardNum: 1


source:
  es:
    urls:
      - http://localhost:9200
    username: xxx
    password: xxx


target:
  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: ******

有关配置文件的详细说明,请参阅 GitHub 上的此页面

  1. 执行迁移任务

现在,你已经配置好了migration.yaml 文件,可以通过运行以下命令来启动迁移任务:

./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!"]

除了命令行方式外,Milvus迁移还支持使用Restful API进行迁移。

要使用Restful API,请使用以下命令启动API服务器:

./milvus-migration server run -p 8080

服务运行后,就可以通过调用 API 来启动迁移。

curl -XPOST http://localhost:8080/api/v1/start

迁移完成后,你可以使用一体化向量数据库管理工具Attu 查看迁移成功的行总数,并执行其他与 Collection 相关的操作符。

The Attu interface Attu 界面

从 Milvus 1.x 迁移到 Milvus 2.x

  1. 准备 Milvus 1.x 数据

为了帮助你快速体验迁移过程,我们在 Milvus 迁移的源代码中放入了 10,000 条 Milvus 1.x测试数据记录。不过,在实际情况下,你必须在开始迁移过程之前,从你的Milvus 1.x实例中导出自己的meta.json 文件。

  • 你可以使用以下命令导出数据。
./milvus-migration export -m "user:password@tcp(adderss)/milvus?charset=utf8mb4&parseTime=True&loc=Local" -o outputDir

请确保

  • 用实际的 MySQL 凭据替换占位符。

  • 在执行导出之前,停止 Milvus 1.x 服务器或停止数据写入。

  • 将 Milvustables 文件夹和meta.json 文件复制到同一目录。

注意:如果您在Zilliz Cloud(Milvus 的完全托管服务)上使用 Milvus 2.x,您可以使用云控制台开始迁移。

  1. 编译和构建

首先,从 GitHub 下载 Milvus 迁移的源代码。然后,运行以下命令进行编译。

go get
go build

这一步将生成一个名为milvus-migration 的可执行文件。

  1. 配置migration.yaml

准备一个migration.yaml 配置文件,指定源、目标和其他相关设置的详细信息。下面是一个配置示例:

# Configuration for Milvus 1.x to Milvus 2.x migration


dumper:
  worker:
    limit: 2
    workMode: milvus1x
    reader:
      bufferSize: 1024
    writer:
      bufferSize: 1024
loader:
  worker:
    limit: 16
meta:
  mode: local
  localFile: /outputDir/test/meta.json


source:
  mode: local
  local:
    tablesDir: /db/tables/


target:
  mode: remote
  remote:
    outputDir: "migration/test/xx"
    ak: xxxx
    sk: xxxx
    cloud: aws
    endpoint: 0.0.0.0:9000
    region: ap-southeast-1
    bucket: a-bucket
    useIAM: false
    useSSL: false
    checkBucket: true
  milvus2x:
    endpoint: localhost:19530
    username: xxxxx
    password: xxxxx

有关配置文件的详细说明,请参阅 GitHub 上的此页面

  1. 执行迁移任务

你必须分别执行dumpload 命令才能完成迁移。这些命令会转换数据并将其导入 Milvus 2.x。

注:我们将简化这一步骤,使用户很快就能只用一条命令完成迁移。敬请期待。

转储命令

./milvus-migration dump --config=/{YourConfigFilePath}/migration.yaml

加载命令

./milvus-migration load --config=/{YourConfigFilePath}/migration.yaml

迁移后,Milvus 2.x 中生成的 Collections 将包含两个字段:iddata 。您可以使用一体化向量数据库管理工具Attu 查看更多详情。

从 FAISS 迁移到 Milvus 2.x

  1. 准备 FAISS 数据

要迁移 Elasticsearch 数据,您应该准备好自己的 FAISS 数据。为了帮助你快速体验迁移过程,我们在 Milvus 迁移的源代码中放入了一些FAISS 测试数据

  1. 编译和构建

首先,从 GitHub 下载 Milvus 迁移的源代码。然后,运行以下命令进行编译。

go get
go build

这一步将生成一个名为milvus-migration 的可执行文件。

  1. 配置migration.yaml

为 FAISS 迁移准备一个migration.yaml 配置文件,指定源、目标和其他相关设置的详细信息。下面是一个配置示例:

# Configuration for FAISS to Milvus 2.x migration


dumper:
  worker:
    limit: 2
    workMode: FAISS
    reader:
      bufferSize: 1024
    writer:
      bufferSize: 1024
loader:
  worker:
    limit: 2
source:
  mode: local
  local:
    FAISSFile: ./testfiles/FAISS/FAISS_ivf_flat.index


target:
  create:
    collection:
      name: test1w
      shardsNums: 2
      dim: 256
      metricType: L2
  mode: remote
  remote:
    outputDir: testfiles/output/
    cloud: aws
    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

有关配置文件的详细说明,请参阅 GitHub 上的此页面

  1. 执行迁移任务

与 Milvus 1.x 向 Milvus 2.x 迁移一样,FAISS 迁移也需要同时执行dumpload 命令。这些命令会转换数据并将其导入 Milvus 2.x。

注:我们将简化这一步骤,使用户只需使用一条命令即可完成迁移。敬请期待。

转储命令

./milvus-migration dump --config=/{YourConfigFilePath}/migration.yaml

加载命令:

./milvus-migration load --config=/{YourConfigFilePath}/migration.yaml

您可以使用一体化向量数据库管理工具Attu 查看更多详情。

敬请期待未来的迁移计划

未来,我们将支持从更多数据源迁移,并添加更多迁移功能,包括

  • 支持从 Redis 迁移到 Milvus。

  • 支持从 MongoDB 迁移到 Milvus。

  • 支持可恢复迁移。

  • 将转储和加载过程合二为一,简化迁移命令。

  • 支持从其他主流数据源迁移到 Milvus。

结论

Milvus 2.3 作为 Milvus 的最新版本,带来了令人振奋的新功能和性能改进,迎合了数据管理日益增长的需求。将数据迁移到 Milvus 2.x 可以释放这些优势,Milvus 迁移项目使迁移过程变得精简、轻松。试一试吧,你不会失望的。

注:本博客中的信息基于Milvus和Milvus迁移项目截至2023年9月的状态。请查阅Milvus官方文档,了解最新信息和说明。

Like the article? Spread the word

扩展阅读