使用 AWS Data Pipeline 备份 Amazon EFS 文件系统 - Amazon Elastic File System
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

使用 AWS Data Pipeline 备份 Amazon EFS 文件系统

注意

使用 AWS Data Pipeline 备份 EFS 文件系统是一个传统解决方案。

有两种推荐的解决方案可用于备份 EFS 文件系统。

  • AWS Backup 服务

  • EFS 到 EFS 备份解决方案

Amazon EFS 是一种简单且经济高效的备份 AWS Backup 文件系统的方法。AWS Backup 是一种统一备份服务,旨在简化备份的创建、迁移、恢复和删除,同时提供改进的报告和审核。有关更多信息,请参阅 将 AWS Backup 与 Amazon EFS 结合使用

EFS 到 EFS 备份解决方案适用于所有 AWS 区域中的所有 Amazon EFS 文件系统。它包括一个 AWS CloudFormation 模板以启动、配置和运行部署该解决方案所需的 AWS 服务。该解决方案遵循 AWS 的安全和可用性最佳实践。有关更多信息,请参阅 AWS Answers 中的 EFS 到 EFS 备份解决方案

使用 AWS Data Pipeline 的传统 EFS 备份解决方案

使用 AWS Data Pipeline 备份 EFS 文件系统是一个传统备份解决方案。在该备份解决方案中,您使用 AWS Data Pipeline 服务创建一个数据管道。该管道将数据从您的 Amazon EFS 文件系统(称为生产文件系统)复制到另一个 Amazon EFS 文件系统(称为备份文件系统)中。

该解决方案包含实施以下操作的 AWS Data Pipeline 模板:

  • 基于您定义的计划 (例如,每小时、每天、每周或每月) 的自动化 EFS 备份。

  • 自动轮换备份,在此情况下,会基于您希望保留的备份数将最旧的备份替换为最新的备份。

  • 使用 rsync 进行更快的备份,它仅备份在两次备份之间进行的更改。

  • 使用硬链接高效存储备份。硬链接是一个目录项,该目录项会将一个名称与文件系统中的一个文件相关联。通过设置硬链接,您可以通过任何备份执行完整数据还原,同时仅存储在两次备份之间进行的更改。

在设置备份解决方案后,此演练将向您演示如何访问备份以还原您的数据。此备份解决方案依赖于运行 GitHub 上托管的脚本,因此受 GitHub 可用性的约束。如果您希望消除该依赖性并在 Amazon S3 存储桶中托管脚本,请参阅在 Amazon S3 存储桶中托管 rsync 脚本

重要

该解决方案要求在与您的文件系统相同的 AWS 区域中使用 AWS Data Pipeline。由于在美国东部(俄亥俄州)中不支持 AWS Data Pipeline,因此,无法在此 AWS 区域中使用该解决方案。如果要使用该解决方案备份您的文件系统,我们建议您在其他支持的 AWS 区域之一中使用您的文件系统。

使用 AWS Data Pipeline 的 Amazon EFS 备份的性能

在执行数据备份和还原时,您的文件系统性能会受到Amazon EFS 性能的约束,包括基线和突发吞吐容量。备份解决方案使用的吞吐量将计入您的总文件系统吞吐量。下表提供了适用于此解决方案的 Amazon EFS 文件系统和 Amazon EC2 实例大小的一些建议(假定您的备份时段为 15 分钟)。

EFS 大小 (平均文件大小为 30 MB) 每日更改量 剩余突发小时数 备份代理的最小数量
256GB 不到 25 GB 6.75 1 - m3.medium
512GB 不到 50 GB 7.75 1 - m3.large
1.0 TB 不到 75 GB 11.75 2 - m3.large*
1.5 TB 不到 125 GB 11.75 2 - m3.xlarge*
2.0 TB 不到 175 GB 11.75 3 - m3.large*
3.0 TB 不到 250 GB 11.75 4 - m3.xlarge*

* 这些估计数字基于以下假设:存储在大小为 1 TB 或更大的 EFS 文件系统中的数据经过组织整理,以便可将备份分散在多个备份节点中。多节点示例脚本基于 EFS 文件系统一级目录的内容跨节点分散备份负载。

例如,如果有两个备份节点,则一个节点会备份位于一级目录中的所有偶数文件和目录。奇数节点会对奇数文件和目录执行相同的操作。在另一个示例中,对于 Amazon EFS 文件系统中的六个目录和四个备份节点,第一个节点备份第一个和第五个目录。第二个节点备份第二个和第六个目录,第三个和第四个节点分别备份第三个和第四个目录。

使用 AWS Data Pipeline 的 Amazon EFS 备份的注意事项

在您决定是否实施使用 AWS Data Pipeline 的 Amazon EFS 备份解决方案时,请考虑以下因素:

  • 这种 EFS 备份方法涉及多种 AWS 资源。对于此解决方案,您需要创建以下内容:

    • 一个生产文件系统以及一个包含生产文件系统的完整副本的备份文件系统。该系统还包含在备份轮换期间对数据进行的任何增量更改。

    • 执行还原和计划备份的 Amazon EC2 实例(其生命周期由 AWS Data Pipeline 进行管理)。

    • 用于备份数据的一个定期计划的 AWS Data Pipeline。

    • 用于还原备份的 AWS Data Pipeline。

    实施此解决方案后,将会在您的账户中对这些服务计费。有关更多信息,请参阅 Amazon EFSAmazon EC2AWS Data Pipeline 的定价页面。

  • 该解决方案不是脱机备份解决方案。为确保进行完全一致且完整的备份,请在备份发生时暂停到文件系统的任何文件写入或卸载文件系统。我们建议您在计划的停机时间或下班时间执行所有备份。

使用 AWS Data Pipeline 的 Amazon EFS 备份假设

本演练提供了多个假设,并声明了如下示例值:

  • 在您开始操作之前,本演练假定您已完成入门

  • 完成入门练习后,您有两个安全组、一个 VPC 子网和您要备份的文件系统的文件系统挂载目标。在本演练的其余部分中,您将使用以下示例值:

    • 您在本演练中备份的文件系统的 ID 是 fs-12345678

    • 与挂载目标关联的文件系统的安全组称为 efs-mt-sg (sg-1111111a)

    • 让 Amazon EC2 实例能够连接至生产 EFS 挂载点的安全组称为 efs-ec2-sg (sg-1111111b)

    • VPC 子网的 ID 值为 subnet-abcd1234

    • 您要备份的文件系统的源文件系统挂载目标 IP 地址为 10.0.1.32:/

    • 该示例假定生产文件系统是一个内容管理系统,该系统提供平均大小为 30 MB 的媒体文件。

在以下初始设置图中反映了上述假设和示例。

如何使用 AWS Data Pipeline 备份 Amazon EFS 文件系统

请按照本部分中的步骤使用 AWS Data Pipeline 备份或还原您的 Amazon EFS 文件系统。

步骤 1:创建您的备份 Amazon EFS 文件系统

在本演练中,您将创建单独的安全组、文件系统和挂载点,以将您的备份与您的数据源分离。在该第一步中,您创建以下资源:

  1. 首先,创建两个新安全组。备份挂载目标的示例安全组为 efs-backup-mt-sg (sg-9999999a)。用于访问挂载目标的 EC2 实例的示例安全组为 efs-backup-ec2-sg (sg-9999999b)。请记住,在您要备份的 EFS 卷所在的同一 VPC 中创建这些安全组。在该示例中为与 subnet-abcd1234 子网相关联的 VPC。有关创建安全组的更多信息,请参阅创建安全组

  2. 接下来,创建备份 Amazon EFS 文件系统。在该示例中,文件系统 ID 为 fs-abcdefaa。有关创建文件系统的更多信息,请参阅创建 Amazon EFS 文件系统

  3. 最后,创建 EFS 备份文件系统的挂载点,并假定其值为 10.0.1.75:/。有关创建挂载目标的更多信息,请参阅创建装载目标

完成该第一步后,您的设置应类似于以下示例图。

第 2 步:下载用于备份的 AWS Data Pipeline 模板

AWS Data Pipeline 有助于您按指定间隔可靠地处理数据并在不同 AWS 计算和存储服务之间移动数据。通过使用 AWS Data Pipeline 控制台,您可以创建预置的管道定义(称为模板)。您可以使用这些模板快速开始使用 AWS Data Pipeline。针对本演练提供了一个模板,以便更易于设置您的备份管道。

实施该模板后,它会创建一个数据管道,该数据管道会根据您指定的计划启动单个 Amazon EC2 实例,以将生产文件系统中的数据备份到备份文件系统中。该模板有许多占位符值。您应在 AWS Data Pipeline 控制台的 Parameters (参数) 部分中提供对应于这些占位符的值。从 GitHub 的 1-Node-EFSBackupDataPipeline.json 中下载用于备份的 AWS Data Pipeline 模板。

注意

该模板还引用并运行一个脚本,以执行备份命令。您可以下载该脚本,然后再创建管道,以查看其用途。要查看该脚本,请从 GitHub 中下载 efs-backup.sh。此备份解决方案依赖于运行 GitHub 上托管的脚本,并受 GitHub 可用性的约束。如果您希望消除该依赖性并在 Amazon S3 存储桶中托管脚本,请参阅在 Amazon S3 存储桶中托管 rsync 脚本

第 3 步:创建用于备份的数据管道

采用下列步骤创建您的数据管道。

为 Amazon EFS 备份创建数据管道

  1. 通过以下网址打开 AWS Data Pipeline 控制台:https://console.amazonaws.cn/datapipeline/

    重要

    确保在与您的 Amazon EFS 文件系统相同的 AWS 区域中工作。

  2. 选择 Create new pipeline (创建新管道)

  3. 添加名称描述(可选)的值。

  4. 对于,请选择导入定义,然后选择加载本地文件

  5. 在文件资源管理器中,导航到您在第 2 步:下载用于备份的 AWS Data Pipeline 模板中保存的模板,然后选择打开

  6. 参数中,提供您的备份和生产 EFS 文件系统的详细信息。

  7. Schedule (计划) 中配置选项以定义您的 Amazon EFS 备份计划。示例中的备份每天运行一次,并且备份将保留一周时间。当备份保留时间达到七天时,它将被替换为下一个最旧的备份。

    注意

    我们建议您指定在非高峰时间进行备份。

  8. (可选)指定一个 Amazon S3 位置以存储管道日志,配置一个自定义 IAM 角色,或者添加标签以描述您的管道。

  9. 在配置管道后,请选择激活

现已配置并激活您的 Amazon EFS 备份数据管道。有关 AWS Data Pipeline 的详细信息,请参阅 AWS Data Pipeline 开发人员指南。在此阶段,您可以立即执行备份作为测试,也可以等待,直至在计划的时间执行备份。

步骤 4:访问您的 Amazon EFS 备份

现已创建并激活您的 Amazon EFS 备份,并按照您定义的计划运行该备份。该步骤简要说明了如何才能访问您的 EFS 备份。您的备份存储在采用以下格式创建的 EFS 备份文件系统中。

backup-efs-mount-target:/efs-backup-id/[backup interval].[0-backup retention]-->

以示例场景中的值为例,文件系统的备份位于 10.1.0.75:/fs-12345678/daily.[0-6] 中,其中 daily.0 是七个轮换备份中最新的备份,而 daily.6 是最旧的备份。

通过访问您的备份,您能够将数据还原到您的生产文件系统中。您可以选择还原整个文件系统,也可以选择还原各个文件。

步骤 4.1:还原整个 Amazon EFS 备份

还原 Amazon EFS 文件系统的备份副本需要另一个 AWS Data Pipeline,它与您在第 3 步:创建用于备份的数据管道中配置的管道类似。但是,此还原管道与备份管道的方向相反。这些还原通常不安排为自动开始。

与备份一样,可并行执行还原,以满足您的恢复时间目标。请记住,创建数据管道时,需要计划您希望其运行的时间。如果您选择激活后运行,则可以立即启动还原过程。建议您仅在需要执行还原操作,或已经想好具体的时段时,才创建还原管道。

突发容量由备份 EFS 和还原 EFS 使用。有关性能的更多信息,请参阅 Amazon EFS 性能。以下步骤介绍了如何创建和实施您的还原管道。

创建用于 EFS 数据还原的数据管道

  1. 下载用于从您的备份 EFS 文件系统中还原数据的数据管道模板。该模板可基于指定大小启动单个 Amazon EC2 实例。仅当您指定它启动时,它才会启动。从 GitHub 的 1-Node-EFSRestoreDataPipeline.json 中下载用于备份的 AWS Data Pipeline 模板。

    注意

    该模板还引用并运行一个脚本,以执行还原命令。您可以下载该脚本,然后再创建管道,以查看其用途。要查看该脚本,请从 GitHub 中下载 efs-restore.sh

  2. 通过以下网址打开 AWS Data Pipeline 控制台:https://console.amazonaws.cn/datapipeline/

    重要

    确保在与您的 Amazon EFS 文件系统和 Amazon EC2 相同的 AWS 区域中工作。

  3. 选择 Create new pipeline (创建新管道)

  4. 添加名称描述(可选)的值。

  5. 对于,请选择导入定义,然后选择加载本地文件

  6. 在文件资源管理器中,导航到您在步骤 1:创建您的备份 Amazon EFS 文件系统中保存的模板,然后选择打开

  7. 参数中,提供您的备份和生产 EFS 文件系统的详细信息。

  8. 由于您通常仅在需要时执行还原,因此,您可以计划在激活管道时运行一次还原。或者,计划在所选的将来时间执行一次性还原,例如,非高峰时段。

  9. (可选)指定一个 Amazon S3 位置以存储管道日志,配置一个自定义 IAM 角色,或者添加标签以描述您的管道。

  10. 在配置管道后,请选择激活

现已配置并激活您的 Amazon EFS 还原数据管道。现在,在需要将备份还原到生产 EFS 文件系统时,您只需从 AWS Data Pipeline 控制台中激活该管道。有关更多信息,请参阅 AWS Data Pipeline 开发人员指南

步骤 4.2:通过 Amazon EFS 备份还原各个文件

您可以通过启动 Amazon EC2 实例以临时挂载生产和备份 EFS 文件系统,来从您的 Amazon EFS 文件系统备份中还原文件。EC2 实例必须是两个 EFS 客户端安全组(在该示例中为 efs-ec2-sgefs-backup-clients-sg)的成员。两个 EFS 挂载目标均可由此还原实例挂载。例如,恢复 EC2 实例可以创建以下挂载点。此处,-o ro 选项用于将备份 EFS 挂载为只读文件系统,以防止在尝试通过备份进行还原时意外修改备份。

mount -t nfs source-efs-mount-target:/ /mnt/data
mount -t nfs -o ro backup-efs-mount-target:/fs-12345678/daily.0 /mnt/backup>

挂载目标后,您可以使用 /mnt/backup 命令将文件从 /mnt/data 复制到终端的 cp -p 中的适当位置。例如,可以使用以下命令以递归方式复制整个主目录(及其文件系统权限)。

sudo cp -rp /mnt/backup/users/my_home /mnt/data/users/my_home

您可以运行以下命令以还原单个文件。

sudo cp -p /mnt/backup/user/my_home/.profile /mnt/data/users/my_home/.profile
警告

在手动还原各个数据文件时,请格外小心以免意外修改备份本身。否则,您可能会损坏该备份。

其他备份资源

此演练中提供的备份解决方案使用 AWS Data Pipeline 模板。第 2 步:下载用于备份的 AWS Data Pipeline 模板步骤 4.1:还原整个 Amazon EFS 备份中使用的模板均使用单个 Amazon EC2 实例来执行其工作。但是,对于您可以运行以备份或还原 Amazon EFS 文件系统中的数据的并行实例的数量,并没有真正的限制。在该主题中,您可以找到指向为多个 EC2 实例配置的其他 AWS Data Pipeline 模板的链接,您可以下载这些模板并将其用于您的备份解决方案。您还可以找到如何修改模板以包含其他实例的说明。

使用其他模板

您可以从 GitHub 中下载以下更多模板:

添加更多备份实例

您可以将更多节点添加到本演练中使用的备份模板中。要添加节点,请修改 2-Node-EFSBackupDataPipeline.json 模板的以下部分。

重要

如果您要使用更多节点,则不能在存储于顶级目录的文件名和目录中使用空格。如果使用,则不会备份或还原这些文件和目录。将按预期方式备份和还原至少位于顶级目录下一级的所有文件和子目录。

  • 为要创建的每个其他节点创建一个额外的 EC2Resource(在该示例中,为第 4 个 EC2 实例)。

    { "id": "EC2Resource4", "terminateAfter": "70 Minutes", "instanceType": "#{myInstanceType}", "name": "EC2Resource4", "type": "Ec2Resource", "securityGroupIds" : [ "#{mySrcSecGroupID}","#{myBackupSecGroupID}" ], "subnetId": "#{mySubnetID}", "associatePublicIpAddress": "true" },
  • 针对每个其他节点创建额外的数据管道活动 (在这种情况下为活动 BackupPart4),确保配置以下部分:

    • 更新 runsOn 引用以指向以前创建的 EC2Resource (在以下示例中为 EC2Resource4)。

    • 增加最后两个 scriptArgument 值以等于每个节点负责的备份部分以及总节点数。对于以下示例中的 "2""3",第 4 个节点的备份部分为 "3",因为该示例中的模块逻辑需要从 0 开始计数。

    { "id": "BackupPart4", "name": "BackupPart4", "runsOn": { "ref": "EC2Resource4" }, "command": "wget https://raw.githubusercontent.com/awslabs/data-pipeline-samples/master/samples/EFSBackup/efs-backup-rsync.sh\nchmod a+x efs-backup-rsync.sh\n./efs-backup-rsync.sh $1 $2 $3 $4 $5 $6 $7", "scriptArgument": ["#{myEfsSource}","#{myEfsBackup}", "#{myInterval}", "#{myRetainedBackups}","#{myEfsID}", "3", "4"], "type": "ShellCommandActivity", "dependsOn": { "ref": "InitBackup" }, "stage": "true" },
  • 将全部现有 scriptArgument 值中的最后一个值增加为节点数 (在该示例中为 "4")。

    { "id": "BackupPart1", ... "scriptArgument": ["#{myEfsSource}","#{myEfsBackup}", "#{myInterval}", "#{myRetainedBackups}","#{myEfsID}", "1", "4"], ... }, { "id": "BackupPart2", ... "scriptArgument": ["#{myEfsSource}","#{myEfsBackup}", "#{myInterval}", "#{myRetainedBackups}","#{myEfsID}", "2", "4"], ... }, { "id": "BackupPart3", ... "scriptArgument": ["#{myEfsSource}","#{myEfsBackup}", "#{myInterval}", "#{myRetainedBackups}","#{myEfsID}", "0", "4"], ... },
  • 更新 FinalizeBackup 活动并将新的备份活动添加到 dependsOn 列表中 (在此情况下为 BackupPart4)。

    { "id": "FinalizeBackup", "name": "FinalizeBackup", "runsOn": { "ref": "EC2Resource1" }, "command": "wget https://raw.githubusercontent.com/awslabs/data-pipeline-samples/master/samples/EFSBackup/efs-backup-end.sh\nchmod a+x efs-backup-end.sh\n./efs-backup-end.sh $1 $2", "scriptArgument": ["#{myInterval}", "#{myEfsID}"], "type": "ShellCommandActivity", "dependsOn": [ { "ref": "BackupPart1" }, { "ref": "BackupPart2" }, { "ref": "BackupPart3" }, { "ref": "BackupPart4" } ], "stage": "true"

添加更多还原实例

您可以向本演练中使用的还原模板添加节点。要添加节点,请修改 2-Node-EFSRestorePipeline.json 模板的以下部分。

  • 为要创建的每个其他节点创建一个额外的 EC2Resource(此处为名为 EC2Resource3 的第 3 个 EC2 实例)。

    { "id": "EC2Resource3", "terminateAfter": "70 Minutes", "instanceType": "#{myInstanceType}", "name": "EC2Resource3", "type": "Ec2Resource", "securityGroupIds" : [ "#{mySrcSecGroupID}","#{myBackupSecGroupID}" ], "subnetId": "#{mySubnetID}", "associatePublicIpAddress": "true" },
  • 针对每个额外节点创建额外的数据管道活动(在这种情况下为活动 RestorePart3)。确保配置以下部分:

    • 更新 runsOn 引用以指向以前创建的 EC2Resource(在该示例中为 EC2Resource3)。

    • 增加最后两个 scriptArgument 值以等于每个节点负责的备份部分以及总节点数。对于以下示例中的 "2""3",第 4 个节点的备份部分为 "3",因为该示例中的模块逻辑需要从 0 开始计数。

    { "id": "RestorePart3", "name": "RestorePart3", "runsOn": { "ref": "EC2Resource3" }, "command": "wget https://raw.githubusercontent.com/awslabs/data-pipeline-samples/master/samples/EFSBackup/efs-restore-rsync.sh\nchmod a+x efs-restore-rsync.sh\n./efs-backup-rsync.sh $1 $2 $3 $4 $5 $6 $7", "scriptArgument": ["#{myEfsSource}","#{myEfsBackup}", "#{myInterval}", "#{myBackup}","#{myEfsID}", "2", "3"], "type": "ShellCommandActivity", "dependsOn": { "ref": "InitBackup" }, "stage": "true" },
  • 将全部现有 scriptArgument 值中的最后一个值增加为节点数 (在该示例中为 "3")。

    { "id": "RestorePart1", ... "scriptArgument": ["#{myEfsSource}","#{myEfsBackup}", "#{myInterval}", "#{myBackup}","#{myEfsID}", "1", "3"], ... }, { "id": "RestorePart2", ... "scriptArgument": ["#{myEfsSource}","#{myEfsBackup}", "#{myInterval}", "#{myBackup}","#{myEfsID}", "0", "3"], ... },

在 Amazon S3 存储桶中托管 rsync 脚本

此备份解决方案依赖于运行 Internet 上 GitHub 存储库中托管的 rsync 脚本。因此,此备份解决方案受 GitHub 存储库可用性的约束。该要求意味着,如果 GitHub 存储库删除这些脚本,或者 GitHub 网站脱机,按照上述方法实施的备份解决方案将无法正常工作。

如果您希望消除此 GitHub 依赖性,则可选择在您拥有的 Amazon S3 存储桶中托管这些脚本。您可以在下文中找到自行托管脚本所需的步骤。

在您自己的 Amazon S3 存储桶中托管 rsync 脚本

  1. 注册 AWS – 如果您已经拥有 AWS 账户,请直接跳到下一步。否则,请参阅注册 AWS

  2. 创建 AWS Identity and Access Management 用户 – 如果您已经拥有 IAM 用户,请直接跳到下一步。否则,请参阅创建 IAM 用户

  3. 创建 Amazon S3 存储桶 – 如果您已经有一个要在其中托管 rsync 脚本的存储桶,请直接跳到下一步。否则,请参阅 Amazon Simple Storage Service 入门指南 中的创建存储桶

  4. 下载 rsync 脚本和模板 – 在 GitHub 的 EFSBackup 文件夹中下载所有 rsync 脚本和模板。记下您在计算机上下载这些文件的位置。

  5. 将 rsync 脚本上传至您的 S3 存储桶 – 有关如何将对象上传至 S3 存储桶的说明,请参阅 Amazon Simple Storage Service 入门指南 中的将对象添加至存储桶

  6. 更改上传的 rsync 脚本的权限以允许每个人打开/下载这些脚本。有关如何更改 S3 存储桶中对象的权限的说明,请参阅 Amazon Simple Storage Service 控制台用户指南 中的编辑对象权限

  7. 更新您的模板 – 将 shellCmd 语句中的 wget 参数修改为指向您放置启动脚本的 Amazon S3 存储桶。保存更新后的模板,然后在您按照第 3 步:创建用于备份的数据管道中介绍的步骤执行操作时使用该模板。

    注意

    我们建议您限制 Amazon S3 存储桶的访问权限,以包含为该备份解决方案激活 AWS Data Pipeline 的 IAM 账户。有关更多信息,请参阅Amazon Simple Storage Service 控制台用户指南中的编辑存储桶权限

现在您将托管此备份解决方案的 rsync 脚本,且您的备份不再依赖于 GitHub 可用性。