使用 MinIO Client (mc) 将自建 MinIO 数据备份至阿里云 OSS

在公司内部架构中,我们通常会将重要文件部署在自建的 MinIO 对象存储服务中。然而,为了防止本地数据丢失或灾难性故障,将数据异地备份到公有云存储(如阿里云 OSS)是一个至关重要的环节。

本文将介绍如何使用 MinIO 官方命令行工具 mc (MinIO Client),实现从 Kubernetes 集群内自建 MinIO 到阿里云 OSS 的全量及增量自动备份。

1. 前置准备:获取阿里云 OSS 访问权限

在使用 mc 之前,我们需要在阿里云侧创建一个专用的 RAM 用户并授予相应的权限策略。

创建用户

登录阿里云控制台,进入 访问控制 (RAM) ,创建一个新的用户,命名为 ossuser。

注意:创建时需勾选"OpenAPI 调用访问"以获取 AccessKey ID 和 AccessKey Secret。

创建完用户后记录下生成的 AccessKey 和 Secret Key,接下来的步骤将用到这个凭据。

配置权限策略

为了赋予该用户操作 OSS 的基本读写能力,我们需要绑定一个自定义权限策略。以下是推荐的策略模板(请根据实际情况修改 Resource 中的 bucketName):

json 复制代码
{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "oss:ListObjects",
      "Resource": "acs:oss:*:*:bucketName"
    },
    {
      "Effect": "Allow",
      "Action": "oss:GetBucketInfo",
      "Resource": "acs:oss:*:*:bucketName"
    },
    {
      "Effect": "Allow",
      "Action": "oss:*",
      "Resource": "acs:oss:*:*:bucketName/*"
    }
  ]
}

完成上述步骤后,将该权限赋予上一步创建的用户。用户ossuser 就有了读写OSS桶bucketName的权限了。

2. 环境配置:设置 mc 别称 (Aliases)

mc 工具通过别名(Aliases)来管理不同的对象存储服务。我们需要分别配置连接阿里云 OSS 和本地 MinIO 的别名。

假设我们在拥有 MinIO 服务的节点上执行以下命令:

配置阿里云 OSS 别名

这里我将阿里云端定义为 oss-storage(示例命名,也可按需修改):

bash 复制代码
# 语法: mc alias set <ALIAS_NAME> <URL> <ACCESS_KEY> <SECRET_KEY>
mc alias set oss-storage \
  https://oss-cn-shenzhen.aliyuncs.com \
  <你的阿里云AccessKey> \
  <你的阿里云SecretKey>
配置本地 MinIO 别名

连接部署在 K8s 集群内的 MinIO Service:

bash 复制代码
# 配置 mc 连接 k8s 中的 Minio
mc alias set local-minio \
  http://<minio-service-ip>:9000 \
  <Minio_AccessKey> \
  <Minio_SecretKey>

此时,我们可以通过 mc admin info 命令检查连通性:

bash 复制代码
mc admin info local-minio

别名oss-storage不能使用上面命令,可以使用下面命令测试,

bash 复制代码
mc ls  oss-storage/bucketName/

3. 开始备份:使用 mirror 命令

配置好两个 Storage Alias 后,就可以进行数据同步了。我们主要使用 mc mirror 命令来实现数据的镜像传输。

场景一:首次全量备份

第一次备份时,建议加上 --overwrite 和 --preserve 参数。

  • --overwrite:覆盖目标端已有的同名文件。
  • --preserve:保留文件的元数据(如时间戳等)。

命令如下:

bash 复制代码
# mc mirror --overwrite --preserve <源端> <目标端>
mc mirror --overwrite --preserve \
  local-minio/bucketName/ \
  oss-storage/bucketName/

(注:如果是跨账号或不同域名的对象存储,建议源端桶和目标端桶名称保持一致以便于管理)

场景二:后续增量备份

在全量备份完成后,后续的备份只需关注差异数据。

命令如下:

bash 复制代码
# 仅同步变化的文件,速度极快
mc mirror --overwrite \
  local-minio/bucketName/ \
  oss-storage/bucketName/

4. 自动化建议 (可选)

为了实现无人值守的备份,可以将上述增量备份命令添加到一个 Shell 脚本中,并通过 Linux 的 crontab 定时任务来触发。例如,每天早上凌晨 3 点执行一次全量备份,其余时间执行增量备份。


希望这篇教程能帮助各位开发者构建更健壮的数据灾备体系!如有任何疑问,欢迎评论区交流。

相关推荐
Decay__12 小时前
VMware 安装 SQL Server 双节点 AlwaysOn 可用性组教程 —— WSFC、AG 与侦听器完整部署(系列核心篇)
运维·数据库·sql·mysql·架构
测试界的小码农12 小时前
【Linux 命令实战(06):Linux 文件权限管理,掌握 chmod、chown、chgrp】
linux·运维·服务器
陈希12313 小时前
负载均衡与高可用:LVS、HAProxy、Keepalived 实战
运维·负载均衡·lvs
xbzb17 小时前
镜像推上云:华为云 SWR 与阿里云 ACR 的建组织、加速器、上传与公开
阿里云·华为云·云计算·镜像·acr·swr
SQL7717 小时前
IT运维发展史,一部宏伟史诗
运维·运维发展史
分布式存储与RustFS18 小时前
Terraform 状态文件老在本地丢、并发还撞锁:把 state 锁进 RustFS
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
csdn_aspnet19 小时前
macOS 10 、Docker 玩轉 MySQL
运维·mysql·macos·docker·容器·mac
爱和冰阔落20 小时前
【Linux网络】TCP 半包粘包怎么解决?从长度报头、JSON 拆包到网络计算器完整实战
linux·运维·网络·tcp/ip
无奈笑天下1 天前
银河麒麟上nproc命令教程详解
linux·运维·服务器
威嵌神州1 天前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存