利用 milvus-backup 完成从单机到分布式 Milvus 的无缝数据迁移实战

张开发
2026/4/12 0:14:16 15 分钟阅读

分享文章

利用 milvus-backup 完成从单机到分布式 Milvus 的无缝数据迁移实战
1. 为什么需要从单机版迁移到分布式 Milvus当你刚开始使用 Milvus 时单机版确实是个不错的选择。安装简单配置也不复杂对于小规模数据集的向量搜索需求完全够用。但随着业务发展数据量逐渐增大单机版的性能瓶颈就会显现出来。我遇到过不少用户最初为了快速上线选择了单机版后来数据量增长到千万级别时查询延迟明显增加这时候才意识到需要升级到分布式架构。分布式 Milvus 最大的优势在于横向扩展能力。通过增加节点可以线性提升存储容量和查询吞吐量。比如我们有个客户从单机版迁移到 8 节点集群后QPS 从 200 提升到了 5000效果非常明显。另一个重要优势是高可用性单机版一旦宕机服务就完全中断而分布式版本通过多副本机制可以保证服务持续可用。不过迁移过程并不像表面看起来那么简单。直接复制数据文件往往行不通因为单机版和分布式版在数据组织方式上有本质区别。这就是为什么我们需要专门的数据迁移工具 - milvus-backup。它相当于在两种架构之间架起了一座桥梁让迁移过程变得可控且可靠。2. 迁移前的准备工作2.1 环境检查与工具准备在开始迁移前有几项准备工作必须做到位。首先是版本兼容性检查我建议源 Milvus 单机版和目标分布式版都使用相同的大版本比如都是 2.3.x 系列。不同大版本间的数据格式可能有变化容易导致迁移失败。工具方面除了 milvus-backup 二进制文件还需要准备足够的磁盘空间建议是待迁移数据量的 3 倍网络带宽保障特别是跨机房迁移时正确的访问凭证MinIO/S3 的 access key 和 secret key这里有个实用技巧先用小规模测试数据验证整个流程。我通常会创建一个只有几条数据的测试集合完整走一遍备份恢复流程。这样可以提前发现配置问题避免在大数据量迁移时浪费时间。2.2 配置文件详解milvus-backup 的核心是 backup.yaml 配置文件它包含三个关键部分Milvus 连接配置milvus: address: 192.168.32.66 port: 19530 authorizationEnabled: false源存储配置单机版的 MinIOminio: address: 192.168.32.66 port: 9000 accessKeyID: minioadmin secretAccessKey: minioadmin bucketName: a-bucket目标存储配置分布式版的 MinIObackupStorageType: minio backupAddress: 192.168.32.20 backupPort: 9000 backupAccessKeyID: BHWn0og7yzc02HlaMxN8 backupSecretAccessKey: 9DXRxfvlCIrAFi4J7vWvcpMErII8OfWZzXZpOruV backupBucketName: test特别注意crossStorage: true这个参数当源和目标使用不同的存储服务时必须设置为 true。我曾经遇到过因为漏掉这个参数导致数据复制失败的情况。3. 分步执行数据迁移3.1 创建数据备份准备好配置文件后创建备份的命令很简单./milvus-backup create -n my_backup但实际操作中有几个细节需要注意备份命名建议使用有意义的名称比如包含日期和版本信息如 prod_data_20230815并发控制大数据量时适当调整copydata参数值默认 128 可能太高会导致存储服务过载进度监控通过日志文件观察备份进度确保没有错误发生备份完成后强烈建议检查 MinIO 目标桶中是否生成了对应的备份文件。我习惯用 mc 命令行工具快速验证mc ls minio-cluster/test/backup/my_backup3.2 恢复数据到分布式环境恢复阶段需要特别注意目标集群的资源配置。根据我的经验最容易出问题的是内存分配。恢复大型集合时建议提前调大 query node 的内存限制。恢复命令示例./milvus-backup restore -n my_backup --restore_index关键参数说明--restore_index同时恢复索引结构否则需要重建索引-s重命名集合适用于需要在目标集群使用不同名称的情况--config指定不同的配置文件当恢复环境与备份环境配置不同时一个实用技巧是分批次恢复大型集合。我曾经处理过一个包含 5 亿向量的集合直接恢复总是失败。后来改为先恢复元数据再分批导入向量数据最终成功完成迁移。4. 迁移后的验证与优化4.1 数据一致性检查迁移完成后必须进行全面的数据验证。我通常会从三个层面检查集合层面collections utility.list_collections() print(f迁移后的集合列表: {collections})数据量检查collection Collection(collection1) print(f记录总数: {collection.num_entities})抽样查询对比vectors [[random.random() for _ in range(128)] for _ in range(5)] results collection.search(vectors, vector_field, {nprobe: 16}, limit3)4.2 性能调优建议迁移到分布式环境后原有的查询参数可能不再最优。建议重点关注分片数配置通常设置为节点数的 2-3 倍索引参数调整分布式环境下可以尝试更大的 nlist 值负载均衡监控各节点的负载情况必要时调整数据分布我曾经帮一个客户将 nlist 从 1024 调整到 4096 后查询延迟降低了 40%。这充分说明迁移后的调优同样重要。5. 常见问题与解决方案在实际迁移过程中有几个典型问题经常出现问题1备份过程中出现 context deadline exceeded 错误原因通常是由于大数据量备份超时解决调整 backup.yaml 中的maxSegmentGroupSize从默认 2G 减小到 1G问题2恢复时提示 collection already exists原因目标集群已存在同名集合解决使用-s参数指定新的集合名或者先删除目标集群中的冲突集合问题3查询结果与源集群不一致原因可能是索引没有正确恢复解决确保使用了--restore_index参数或者手动重建索引有个特别值得分享的案例某客户迁移后发现查询性能反而变差了。经过排查发现是因为目标集群的机器型号较旧CPU 不支持 AVX512 指令集。后来更换硬件后问题迎刃而解。这说明环境一致性检查同样重要。6. 进阶技巧与最佳实践对于特别大型的迁移项目TB 级以上我有几个经过验证的优化建议分批迁移按集合重要性分批次进行先迁移核心业务数据增量迁移对于持续写入的系统可以先迁移基线数据再通过 CDC 同步增量并行恢复修改restoreCollection参数同时恢复多个集合监控方面除了常规的日志检查还可以通过 Prometheus 监控关键指标备份/恢复进度存储空间使用情况网络吞吐量最后提醒一点务必在迁移前做好完整备份。我曾经遇到过一次极端情况迁移过程中源集群意外宕机幸亏有额外的备份才避免了数据丢失。

更多文章