一、背景

很多时候,我们需要将数据从S3的站点(如华为云、阿里云、腾讯云),复制迁移回到本地的MinIO站点。

而云迁移回本地存储则是我们经常被问到的问题。
这个想法是,公有云是一个非常有帮助的地方,充满了弹性的交钥匙服务,因此是企业采用云原生技术的巨大推动力。然而,公有云以更高的成本提高了生产力,特别是对于数据密集型应用程序,这可能会导致出口费用激增。如果你在公共云中拥有超过1PB的数据,那么经济上可能更倾向于回到本地私有云。

企业已将大量 EB 级数据遣返到本地 MinIO,无论是在裸机还是 Kubernetes 上。大多数运行在 Kubernetes 上,利用 MinIO 的容器化架构。他们在本地、边缘运行多个 Kubernetes 集群,在多云中的任何位置都需要云原生对象存储。

这篇博文讨论了将数据从 AWS S3 迁移到本地 MinIO 所需的步骤。

估算成本

扩展的地方是私有云,使用与公有云相同的技术 - 兼容 S3-API 的对象存储、高速网络、Kubernetes、容器和微服务 - 但不会增加每月成本。

我们在之前的博客文章《云的生命周期》中进行了 TCO 分析,该分析表明,与公有云相比,MinIO 为 100PB 的对象存储节省了 61% 的成本(23.10 美元/TB/月,而 58.92 美元/TB/月)。该模型将 AWS 成本(标准 S3 与每月数据传输成本、区域间复制、S3 API 操作、KMS、生命周期成本)与私有云上的 MinIO(硬件、MinIO 许可、存储效率、机架空间、电源、冷却)进行了比较。

该过程中最昂贵的部分可能是AWS的数据出口费用。从 AWS 转移到 Internet 的成本在每 GB 5 美分到 9 美分之间。一些快速的数学运算将帮助您制定预算,例如,粗略估计将 500TB 从 S3 拉入 us-west-01 加利福尼亚州红木城的本地 MinIO 将花费您大约 30 美元。

您可以选择仅将 S3 数据的热层下载到 MinIO,并将冷层发送到 S3 Glacier,而不是下载它。这肯定会降低出口费用的成本,并且根据保留在 AWS 中的数据量,您将节省大量成本。例如,如果我们总共有 500TB 的数据,将 250TB 传输到 S3 Glacier 和 250TB 传输到 MinIO 将使数据传输费用大约减半至 16 美元,而 S3 Glacier 的月费约为 300 美元。分层到廉价的云存储使得在您自己的数据中心运行 MinIO 成为对象存储更具吸引力的选择。

当然,您将更熟悉组织的云成本,并应开发自己的分析。希望我们能给你一个框架来描述成本。

部署MinIO

MinIO 是全球性能最高的对象存储(在 32 个 NVMe 节点上为 349 GB/s GET 和 177 GB/s PUT),能够支持要求最苛刻的数据湖、分析和 AI/ML 工作负载。数据写入 MinIO 具有强一致性,对象不可变。所有对象都受到内联纠删码、bitrot 哈希和加密的保护。

要确定支持本地 MinIO 部署所需的硬件,请参阅我们的参考硬件页面。

要在裸机 Linux 上部署 MinIO,请参阅部署 MinIO:多节点多驱动器 — 适用于 Linux 的 MinIO 对象存储。

如需在 Kubernetes 上部署 MinIO,请参阅 MinIO基于kubernetes的对象存储。

回传数据所需的规划和配置

一些前期规划对于防止数据迁移期间的服务中断大有帮助。为了将配置从 S3 传输到 MinIO,您首先需要了解您的组织如何配置其 S3。

接下来,在 AWS 控制台或客户端中,您必须了解并列出所有与 IAM 相关的信息以及与存储桶元数据相关的信息,以便在 MinIO 中重新创建这些信息。记下您将从 AWS 带到您自己的数据中心的所有 IAM 策略,包括用户、组、服务账户、用户映射、组映射、服务账户映射和服务组映射。然后使用 MinIO 控制台或 mc 在 MinIO 中创建它们。

如果您已为通知和分层配置了 S3 生命周期规则,则还必须确保在 MinIO 中重新创建它们。

是时候进行数据回传了

首先,确保您在 S3 中设置了 IAM 策略,这些策略仅允许访问您要迁移的存储桶。保存凭据,我们稍后会使用它们创建别名。

您可以使用批量复制或 mc mirror 将最新版本的对象从 S3 复制到 MinIO。

这两个选项都可以通过创建别名来简化

一、下载 mc

curl https://dl.min.io/client/mc/release/linux-amd64/mc \
  --create-dirs \
  -o $HOME/minio-binaries/mc

chmod +x $HOME/minio-binaries/mc
export PATH=$PATH:$HOME/minio-binaries/

接下来,为本地部署的 MinIO 集群创建别名,将变量替换为部署期间设置的值。

mc config host add minio1 $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY

接下来,为数据所在的 S3 存储桶创建别名,将变量替换为您在部署期间设置的值。

mc config host add aws-s3 $S3_ENDPOINT $S3_ACCESS_KEY $S3_SECRET_KEY

使用 RELEASE.2023-05-04T21-44-30Z 版中引入的 S3 到 MinIO 批量复制既高效又快速,因为它是最新版本的对象及其元数据的简单单向副本。唯一需要注意的是,对象版本 ID 和修改时间不能保留在目标上。这是从兼容 S3 的源(包括 AWS S3)获取数据并导入 MinIO 的好方法。您还可以配置 S3-MinIO 批量复制,以对存储在 S3 中的对象进行重复的时间点复制。

与(如下所述)相比 mc mirror ,批量复制有几个优点

  • 将客户端到群集网络作为潜在的吞吐量瓶颈删除

  • 如果失败,作业会自动重试

  • 批处理作业提供对复制的精细控制

{
            "Effect": "Allow",
            "Action": [
                "admin:CancelBatchJob",
                "admin:DescribeBatchJob",
                "admin:ListBatchJobs",
                "admin:StartBatchJob"
            ]
        }

第一步是创建和自定义 YAML 描述文件

mc batch generate minio1/ replicate > replication.yaml


然后进行编辑 replication.yaml ,使用凭证、终端节点、源存储桶、筛选条件/标志和目标存储桶配置复制作业。源都在 S3 上,目标都在 MinIO 上。

replicate:
apiVersion: v1
# source of the objects to be replicated
source:
type: TYPE # valid values are "s3"
bucket: BUCKET
prefix: PREFIX
# NOTE: if source is remote then target must be "local"
# endpoint: ENDPOINT
# credentials:
#   accessKey: ACCESS-KEY
#   secretKey: SECRET-KEY
#   sessionToken: SESSION-TOKEN # Available when rotating credentials are used
# target where the objects must be replicated
target:
type: TYPE # valid values are "s3"
bucket: BUCKET
prefix: PREFIX
# NOTE: if target is remote then source must be "local"
# endpoint: ENDPOINT
# credentials:
#   accessKey: ACCESS-KEY
#   secretKey: SECRET-KEY
#   sessionToken: SESSION-TOKEN # Available when rotating credentials are used
# optional flags based filtering criteria
# for all source objects
flags:
filter:
newerThan: "7d" # match objects newer than this value (e.g. 7d10h31s)
olderThan: "7d" # match objects older than this value (e.g. 7d10h31s)
createdAfter: "date" # match objects created after "date"
createdBefore: "date" # match objects created before "date"
## NOTE: tags are not supported when "source" is remote.
# tags:
#   - key: "name"
#     value: "pick*" # match objects with tag 'name', with all values starting with 'pick'
## NOTE: metadata filter not supported when "source" is non MinIO.
# metadata:
#   - key: "content-type"
#     value: "image/*" # match objects with 'content-type', with all values starting with 'image/'
notify:
endpoint: "https://notify.endpoint" # notification endpoint to receive job status events
token: "Bearer xxxxx" # optional authentication token for the notification endpoint
retry:
attempts: 10 # number of retries for the job before giving up
delay: "500ms" # least amount of delay between each retry

您必须为要镜像的每个 S3 存储桶创建配置文件。好消息是,您可以一次运行多个批量复制作业,并在每个作业完成时收到通知。

启动批量复制

您可以检查批处理作业的状态

mc batch start minio1/ ./replication.yaml
Successfully start 'replicate' job `E24HH4nNMcgY5taynaPfxu` on '2023-06-26 17:19:06.296974771 -0700 PDT'


mc batch status minio1/ E24HH4nNMcgY5taynaPfxu
●∙∙
Objects:        28766
Versions:       28766
Throughput:     3.0 MiB/s
Transferred:    406 MiB
Elapsed:        2m14.227222868s
CurrObjName:    share/doc/xml-core/examples/foo.xmlcatalogs

或者,您也可以使用 MinIO 客户端并运行 mc mirror ,这是一款功能强大且灵活的数据同步工具。您可以使用它从 S3 或 S3 API 兼容存储中复制对象,并将其镜像到 MinIO。您将要执行的操作是从 S3 镜像到 MinIO,这是该命令最常见的用例之一。

使用 mc mirror 将数据从 S3 复制到 MinIO,对每个存储桶重复。您可以通过编程方式同时执行所有镜像命令。

mc mirror aws-s3/mybucket minio1/mybucket


无论您使用过 批量复制还是 ,都可以比较存储桶内容 mc mirror ,以验证源和目标是否包含相同的对象。如果存储桶包含相同的对象,则以下命令将不返回任何内容。

mc diff aws-s3/mybucket minio1/mybucket

剩下的唯一任务是将对 S3 终端节点的引用替换为应用程序配置中的 MinIO 终端节点。由于 MinIO 市场领先的 S3 兼容性,您的应用程序永远不会意识到它们没有在 S3 上运行。

如果您想离开 AWS,但又不想购买自己的硬件,请查阅 Equinix Metal 上的从 S3 迁移到 MinIO。

这篇博文向您展示了如何规划数据并将其从 AWS S3 遣返到本地 MinIO。企业这样做的原因有很多,例如控制云支出、改善对基础设施的控制、提高本地性能等等。原因并不重要,重要的是您将要控制对象存储部署。

如果您对从 AWS S3 迁移到本地 MinIO 有任何疑问,或者即使您只是想检查您的遣返地点,请务必与我们联系。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐