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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

本主题提供有关使用的信息 Amazon Data Pipeline,它是 EFS 文件系统的传统备份和还原解决方案。

注意

Amazon Backup 是 EFS 文件系统的推荐备份和恢复解决方案。有关更多信息,请参阅备份您的 Amazon EFS 文件系统

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

Amazon Data Pipeline 由实现以下内容的模板组成:

  • 根据您定义的时间表(例如,每小时、每天、每周或每月)进行自动备份。

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

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

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

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

重要

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

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

在执行数据备份和还原时,您的文件系统性能会受到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 文件系统中的六个目录和四个备份节点,第一个节点备份第一个和第五个目录。第二个节点备份第二个和第六个目录,第三个和第四个节点分别备份第三个和第四个目录。

使用 Amazon Data Pipeline进行 Amazon EFS 备份时的考虑因素

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

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

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

    • 执行恢复和定时备份的 Amazon EC2 实例 Amazon Data Pipeline,其生命周期由管理。

    • 定期安排 Amazon Data Pipeline 用于备份数据。

    • Amazon Data Pipeline 用于恢复备份。

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

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

使用 Amazon EFS 进行备份的假设 Amazon Data Pipeline

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

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

  • 完成入门练习后,您有两个安全组、一个 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 的媒体文件。

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


          该图显示了使用设置 Amazon EFS 备份的第一步 Amazon Data Pipeline。

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

请按照本部分中的步骤操作,使用 Amazon 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:/。有关创建挂载目标的更多信息,请参阅创建并管理挂载目标和安全组

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


            此图表显示使用 Amazon Data Pipeline设置 Amazon EFS 备份的第二步。

步骤 2:下载用于备份的 Amazon Data Pipeline 模板

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

实施该模板后,它会创建一个数据管道,该数据管道会根据您指定的计划启动单个 Amazon EC2 实例,以将生产文件系统中的数据备份到备份文件系统中。该模板有许多占位符值。您可以在 Amazon Data Pipeline 控制台的 “参数” 部分中为这些占位符提供匹配的值。从 1-node BackupDataPipeline-efs.json 下载备份 Amazon Data Pipeline 模板。 GitHub

注意

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

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

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

创建用于 Amazon EFS 备份的数据管道
  1. 打开 Amazon Data Pipeline 控制台,网址为 https://console.aws.amazon.com/datapipeline/

    重要

    请确保您使用的文件系统与 Amazon EFS 文件系统 Amazon Web Services 区域 相同。

  2. 选择创建新管道

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

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

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

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

    
                此屏幕截图显示备份文件系统和生产文件系统的参数。
  7. 计划中配置选项,以定义您的 Amazon EFS 备份计划。示例中的备份每天运行一次,并且备份将保留一周时间。当备份保留时间达到七天时,它将被替换为下一个最旧的备份。

    
                此屏幕截图显示 Amazon EFS 备份的计划选项。
    注意

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

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

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

现已配置并激活您的 Amazon EFS 备份数据管道。有关的更多信息 Amazon Data Pipeline,请参阅《Amazon 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 文件系统的备份副本需要另一个副本 Amazon Data Pipeline,与您在中配置的备份副本类似步骤 3:创建用于备份的数据管道。但是,此还原管道与备份管道的方向相反。这些还原通常不安排为自动开始。

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

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

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

    注意

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

  2. 打开 Amazon Data Pipeline 控制台,网址为 https://console.aws.amazon.com/datapipeline/

    重要

    确保您的工作环境与 Amazon EFS 文件系统和 Amazon EC2 Amazon Web Services 区域 相同。

  3. 选择创建新管道

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

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

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

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

    此屏幕截图显示备份文件系统和生产文件系统的参数。
  8. 由于您通常仅在需要时执行还原,因此,您可以计划在激活管道时运行一次还原。或者,计划在所选的将来时间执行一次性还原,例如,非高峰时段。

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

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

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

步骤 4.2:从您的 Amazon EFS 备份还原单个文件

您可以通过启动 Amazon EC2 实例以临时挂载生产和备份 EFS 文件系统,从您的 Amazon EFS 文件系统备份中还原文件。EC2 实例必须是两个 EFS 客户端安全组的成员(在本例中为 e fs-ec2- sg 和)。efs-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
警告

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

其他备份资源

本演练中介绍的备份解决方案使用的模板是。 Amazon Data Pipeline在步骤 2:下载用于备份的 Amazon Data Pipeline 模板步骤 4.1:还原整个 Amazon EFS 备份中使用的模板均使用单个 Amazon EC2 实例来执行其工作。但是,对于您可以运行以备份或还原 Amazon EFS 文件系统中的数据的并行实例的数量,并没有真正的限制。在本主题中,您可以找到为多个 EC2 实例配置的其他 Amazon 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. 注册 Amazon 并创建管理员用户 — 如果您已经有管理用户 Amazon Web Services 账户,请继续并跳到下一步。否则,请参阅设置

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

  3. 下载 rsync 脚本和模板 — 从中下载 efsBackup 文件夹中的所有 rs ync 脚本和模板。 GitHub记下您在计算机上下载这些文件的位置。

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

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

    
                此屏幕截图显示允许上传的 rsync 脚本以允许每个人打开/下载它们的权限。
  6. 更新您的模板 – 将 shellCmd 参数中的 wget 语句修改为指向您放置启动脚本的 Amazon S3 存储桶。保存更新后的模板,然后在您按照步骤 3:创建用于备份的数据管道中介绍的步骤执行操作时使用该模板。

    注意

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

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