当前位置: 首页 > news >正文

Milvus跨集群数据迁移

318f2ffc762c76730724131de0d774be.png

将 Milvus 数据从 A 集群(K8S集群)迁到 B 集群(K8S集群),解决方案很多,这里提供一个使用官方 milvus-backup 工具进行数据迁移的方案。

注意:此方案为非实时同步方案,但借助 MinIO 客户端的数据同步功能,应该也是可以做到实时同步迁移。

9ca1361fc42757c5d3680bc305a8c17e.jpeg

步骤概览

  • 制作 milvus-backup 镜像,方便备份工具在 K8S 集群中使用 service name 访问 milvus 和 minio

  • 创建 milvus-backup 工作负载

  • 进入 milvus-backup 容器,修改 configs/backup.yaml 配置

  • 备份集群数据到本地存储中

  • 将数据拷贝到新集群中进行恢复

01. 

制作 milvus-backup 镜像

注意:如果是在两个单机版的 milvus 之间迁移数据,是不需要 milvus-backup 镜像的,又或者,如果 k8s 集群部署了 milvus, minio 的 nodeport 服务,也是可以不用镜像的。可以到官方 release 中下载一个二进制应用程序即可。

由于当前官方暂未提供 milvus-backup 的镜像,但官方提供了 Dockerfile,因此可以 git clone 一下官方代码仓库后使用 docker build 制作镜像。

#制作 milvus-backup 镜像
git clone git@github.com:zilliztech/milvus-backup.gitcd milvus-backup
docker build -t milvus/milvus-backup:main .

c30401012baf71230c8dbd3c0ce14e3c.jpeg

在 build 之前可以修改一下 Dockerfile,加快 build 速度,请参考:

#Build 加速,并添加 minio 客户端工具
FROM golang:1.18 AS builderENV CGO_ENABLED=0
ENV GOPROXY https://goproxy.cn,direct
WORKDIR /app
COPY . .
RUN go mod tidy
RUN go build -ldflags="-s -w" -o /app/milvus-backup
RUN wget -P /app https://dl.minio.org.cn/client/mc/release/linux-amd64/mc
RUN chmod +x /app/mcFROM alpine:3.17
WORKDIR /app
COPY --from=builder /app/milvus-backup .
COPY --from=builder /app/configs ./configs
COPY --from=builder /app/mc .
EXPOSE 8080
ENTRYPOINT ["/app/milvus-backup", "server"]

镜像制作好之后推送到 Docker Registry 以方便后续在 K8S 上创建工作负载。

9c19ee534626aea292a77e1c85eec823.jpeg

02. 

在 K8S 集群中创建 milvus-backup 工作负载(Deployment)

可以使用 kubectl 创建工作负载,也可以使用 K8S 管理后台(Kuboard / Kubesphere)创建,使用云端 K8S 的也一样,这里不展开。

注意一下,由于需要在两个集群间迁移,因此创建工作负载的时候挂载一个共享存储(/backup),方便迁移 MinIO 备份后的数据。

91488132a3517774f1e84babf9df7c78.jpeg

03. 

修改 configs/backup.yaml 文件

使用 kubectl 或者 K8S 管理后台进入 milvus-backup 容器,这里有一点要注意,milvus-backup 容器里没有 bash,只有 sh,所以请使用正确的 shell(/bin/sh)。

在容器的工作目录(/app)中有 milvus-backup 和 mc 2个二进制包和 configs 文件夹,mc 即 MinIO 客户端程序,configs 目录下 backup.yaml 即 milvus-backup 的默认配置文件。接下修改 backup.yaml 以适配当前集群的 milvus 和 minio,需要修改的项目有:

#backup.yaml
milvus:address: localhost
...
minio:address: localhost # Address of MinIO/S3...bucketName: "a-bucket" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instancerootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance...
backup:...gcPause:...address: http://localhost:9091

接下来,详细说明一下需要修改的配置:

milvus.address:对应 K8S 中 milvus 服务,milvus 默认会创建一个 xxx-milvus 类型为 ClusterIP 的服务,这里可使用服务名填写,比如:milvus-cluster-1-milvus,“milvus-cluster-1”是部署 milvus 时的 release name,有映像的话,官方叫:my-release;

minio.address:对应用 K8S 中 minio 服务,同上;

minio.buketName:  参考集群容器中/milvus/configs/milvus.yaml文件中的 minio 节点,默认也是:my-release;

minio.rootPath:同上,使用 milvus operator 集群部署时,默认为:files;

backup.gcPause.address:同 milvus.address;

还有 2 个配置需要注意:

minio.backupBucketName

minio.backupRootPath

这 2 个是备份文件存放的目录,后续我们需要使用 MinIO 客户端将文件拷贝到本地存储中。

修改好之后使用 ./milvus-backup check 检查一下。

7d603fe5b77efc65f237fd6a228c3353.jpeg

04. 

备份当前集群数据到本地存储中

使用 milvus-backup 工具备份数据,这里可以直接参考 ./milvus-backup -h,milvus 系列的文档还是非常棒的。

3942bdd26f5323fd1f57706175b71dfa.jpeg

如果数据量不大,备份速度很快,原理官方文档也讲了,这里不再介绍。备份好的之后,就可以使用 MinIO 客户端来查看数据了。

配置 MinIO 客户端

#添加 host
./mc config host add minio_1 http://my-release-minio:9000 minioadmin minioadmin

bb39ab29a9e191b710e65efb69932b59.jpeg

查看备份好的目录

#查看备份目录
./mc ls minio_1/a-bucket/backup

这里会列出上面使用 milvus-backup create 创建的备份

将备份好的文件拷贝到本地存储中

./mc cp -r minio_1/a-bucket/backup/mydb-20240510 /backup

这里的 /backup 目录是挂载的共享存储。

aef4c2545b1573638b0604f3647137e0.jpeg

05. 

恢复数据到新的集群中

进入新的集群(B)执行步骤 2和步骤 3,在步骤 3 中将 backup.yaml 中的配置修改成集群 B 的链接信息。可以把 backup-cluster-a.yaml, backup-cluster-b.yaml 放到共享存储 /backup 中,防止 pod 重启配置丢失。然后将共享目录中备份好的文件拷贝到新集群的 MinIO 中,使用 milvus-backup 恢复即可!

d0b9579b1b269322df344a4e0ba729d8.jpeg

注意,记得恢复的时候带上--restore_index参数,这样恢复的时候会带索引一起恢复出来。恢复好之后使用 Attu 加载一下 collection,就可以正常使用了。

d7f594784a9de3bf582a03d2afec352e.jpeg

推荐阅读

c7cde79095490178ab7e43cb44667d5f.png

ef8ceeb030bb32e947c074ca81ac1df0.png

d83cecfc82770b8ba35fa15b109a55ad.png

相关文章:

  • MySQL 保姆级教程(八):创建计算字段
  • 【Ubuntu通用压力测试】Ubuntu16.04 CPU压力测试
  • 传统后端SQL数据层替代解决方案: 内置数据源+JdbcTemplate+H2数据库 详解
  • YOLOv10改进 | Conv篇 |YOLOv10引入SPD-Conv卷积
  • 【前端技巧】css篇
  • React.ReactElement 与 React.ReactNode
  • Effective C++ 改善程序与设计的55个具体做法笔记与心得 3
  • SonarQube集成Jenkins平台搭建
  • 【Python】一文向您详细解析内置装饰器 @lru_cache
  • 【Android面试八股文】Kotlin内置标准函数let的原理是什么?
  • 初识C++ · 继承(1)
  • 乐鑫ESP32相关资料整理
  • 喜马拉雅项目调整
  • 让NSdata对象转变成UIImage对象再裁剪图片的方法
  • Linux--视频推流及问题
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【391天】每日项目总结系列128(2018.03.03)
  • android图片蒙层
  • CentOS从零开始部署Nodejs项目
  • Debian下无root权限使用Python访问Oracle
  • golang 发送GET和POST示例
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • k8s如何管理Pod
  • Making An Indicator With Pure CSS
  • mysql中InnoDB引擎中页的概念
  • Node + FFmpeg 实现Canvas动画导出视频
  • React中的“虫洞”——Context
  • vue 个人积累(使用工具,组件)
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 大主子表关联的性能优化方法
  • 记一次用 NodeJs 实现模拟登录的思路
  • 技术胖1-4季视频复习— (看视频笔记)
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 我建了一个叫Hello World的项目
  • 一个项目push到多个远程Git仓库
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 怎么将电脑中的声音录制成WAV格式
  • 智能网联汽车信息安全
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 【干货分享】dos命令大全
  • mysql面试题分组并合并列
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #define、const、typedef的差别
  • #pragma pack(1)
  • $.proxy和$.extend
  • (33)STM32——485实验笔记
  • (C语言)共用体union的用法举例
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (排序详解之 堆排序)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)使用VMware vSphere标准交换机设置网络连接