从 MinIO 到 RustFS 的迁移教程

90 阅读4分钟

在不断演进的对象存储领域,RustFS 已成为 MinIO 的一个强有力的替代方案。尽管 MinIO 曾确立了自托管 S3 兼容存储的标准,但其转向 AGPLv3 许可证的做法给许多企业的合规性带来了挑战。RustFS 采用高性能且内存安全的 Rust 语言构建,并基于宽松的 Apache 2.0 许可证发布,完美解决了这一痛点。

本指南将详细介绍如何将数据从现有的 MinIO 集群迁移到新的 RustFS 部署中,并尽可能减少业务停机时间。

为什么要迁移?

在开始迁移之前,了解背后的技术驱动力至关重要:

  1. 许可证合规性: RustFS 采用 Apache 2.0 许可证,允许在商业和专有环境中进行更广泛的集成,而无需担心 MinIO AGPLv3 协议带来的 Copyleft(传染性)风险。
  2. 性能稳定性: RustFS 由 Rust 编写,消除了 Go 语言系统(如 MinIO)固有的垃圾回收(GC)停顿问题。这意味着 RustFS 拥有更低的长尾延迟(tail latency),特别是在高负载下能提供更稳定的吞吐量。
  3. S3 兼容性: RustFS 严格保持与 Amazon S3 的 API 兼容性,确保现有的工具链(如 Terraform、SDK、备份脚本等)无需修改即可直接使用。

迁移利器:MinIO Client (mc)

有趣的是,完成这项迁移任务最稳健的工具,恰恰是 MinIO Client (mc) 。相比通用的 S3 CLI 工具,它具有显著优势:

  • 断点续传: 自动处理网络中断问题。
  • 数据完整性: 包含传输对象的校验和验证。
  • 保留元数据: 能够完整保留原始对象的标签(Tags)、内容类型(Content-Types)和自定义元数据。

前置条件

  • 源端: 一个运行中的 MinIO 实例。
  • 目标端: 一个运行中的 RustFS 实例。
  • 工具: 在一台能同时访问源端和目标端网络的宿主机上安装 mc。
  • 凭证: 源端和目标端的 Root/Admin Access Keys。

关于访问凭证的特别说明

对于本次迁移,我们强烈建议为 MinIO 源端和 RustFS 目标端都配置 Root 用户 (Admin) Access Keys。虽然通常我们遵循“最小权限原则”,但迁移过程涉及 mc mirror 命令,它会尝试复制整个存储桶的结构。如果某个存储桶在源端存在但在目标端不存在,mc 需要 s3:CreateBucket 权限来自动创建它。使用 Root 凭证可以确保客户端拥有复制命名空间结构的完整权限,避免因权限不足而中断传输。

分步迁移流程

1. 配置远程别名 (Aliases)

在 mc 配置中为两个存储集群定义别名。

# 配置源端 (MinIO)
mc alias set minio-old https://minio.example.com ADMIN_ACCESS_KEY ADMIN_SECRET_KEY

# 配置目标端 (RustFS)
mc alias set rustfs-new https://rustfs.example.com ADMIN_ACCESS_KEY ADMIN_SECRET_KEY

验证: 运行 mc ls rustfs-new 以确连接正常且权限正确。

2. 执行预演 (Dry Run)

在正式传输数据之前,建议先模拟操作以验证路径解析和权限。使用 --dry-run 标志可以列出将要执行的操作,而不会实际移动任何数据。

mc mirror --dry-run minio-old/production-data rustfs-new/production-data

3. 执行镜像复制

数据传输主要有两种策略:

方案 A:静态迁移(适用于冷备/归档数据)

适用于备份数据或当前未发生写入操作的数据。

mc mirror minio-old/production-data rustfs-new/production-data

方案 B:实时同步(适用于零停机迁移)

对于生产环境的工作负载,请使用 --watch 标志。mc 将首先同步现有的存量数据,然后持续监听源端,将新生成的对象准实时(near real-time)地复制到目标端。

mc mirror --watch --overwrite minio-old/production-data rustfs-new/production-data
  • --watch: 持续复制新增对象。
  • --overwrite: 如果源端对象发生变化,覆盖目标端对象。
  • --remove: (可选)如果源端删除了对象,同步删除目标端对象。请谨慎使用

4. 最终切换 (Cutover)

当数据同步完成后:

  1. 暂停应用写入 (Quiesce): 暂停应用程序的写入操作,以确保状态一致性。
  2. 等待同步完成: 等待 mc mirror 处理完队列中剩余的待传输对象。
  3. 更新配置: 修改应用程序设置中的 S3 Endpoint URL,将其指向 RustFS 实例(rustfs.example.com)。
  4. 重启并验证: 重启应用程序并验证数据是否可正常访问。

5. 验证

切换完成后,使用 diff 命令验证数据完整性。该命令会比对源端和目标端的元数据以发现任何差异。

mc diff minio-old/production-data rustfs-new/production-data

如果该命令没有返回任何输出,则说明两个数据集完全一致。

结语

迁移到 RustFS 为企业提供了一条通往更高性能、许可更宽松的对象存储基础设施的路径。通过利用 mc 等标准工具,并在迁移过程中确保适当的管理权限,企业可以信心十足地执行这一转换,将对业务运营的影响降至最低。