使用备份 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 EFS 文件系统。

  • Amazon Backup 服务

  • EFS 到 EFS 备份解决方案

Amazon Backup是一种简单且经济实惠的备份 Amazon EFS 文件系统的方法。 Amazon Backup是一项统一的备份服务,旨在简化备份的创建、迁移、恢复和删除,同时提供改进的报告和审计。有关更多信息,请参阅备份您的Amazon EFS 文件系统

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

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

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

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

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

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

  • 使用 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

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

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 EFS 备份的注意事项 Amazon Data Pipeline

在决定是否使用以下方法实施 Amazon EFS 备份解决方案时,请考虑以下几点Amazon Data Pipeline:

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

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

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

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

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

    实施此解决方案后,将会在您的账户中对这些服务计费。有关更多信息,请参阅 Amazon EFS、Amaz on EC2 和的定价页面Amazon 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 EFS 文件系统Amazon Data Pipeline。

步骤 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。有关创建文件系统的更多信息,请参阅创建亚马逊 EFS 文件系统

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

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


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

步骤 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:访问您的亚马逊 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:还原整个亚马逊 EFS 备份

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

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

突发容量由备份 EFS 和还原 EFS 使用。有关性能的更多信息,请参阅 亚马逊 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:从亚马逊 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:还原整个亚马逊 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 脚本的存储桶,请继续并跳到下一步。否则,请参阅《亚马逊简单存储服务用户指南》中的创建存储桶。

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

  4. rsync 脚本上传到您的 S3 存储桶 — 有关如何将对象上传到 S3 存储桶的说明,请参阅《亚马逊简单存储服务用户指南》中的向存储桶添加对象

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

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

    注意

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

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