- 原文链接: https://chowyi.com//aws-auto-scaling-study/
- 版权声明: 文章采用 CC BY-NC-SA 4.0 协议进行授权,转载请注明出处!
最近工作不太顺,总踩坑,当然这是客观原因。主观因素呢,就归结于自己经验不足。
这又刚被 AWS Auto Scaling 给坑了,于是学习总结了一番,记录下来,主要是关于 Auto Scaling 的详细介绍和容易犯错踩坑的地方。方便以后自己查询,也希望能帮到看到这篇文章的人。
什么是 Auto Scaling Group
Amazon EC2 Auto Scaling 帮助您确保您具有适量的 Amazon EC2 实例可用于处理您的应用程序负载。您可创建 EC2 实例的集合,称为 Auto Scaling 组 。您可以指定每个 Auto Scaling 组中最少的实例数量,Auto Scaling 会确保您的组中的实例永远不会低于这个数量。您可以指定每个 Auto Scaling 组中最大的实例数量,Auto Scaling 会确保您的组中的实例永远不会高于这个数量。如果您在创建组的时候或在创建组之后的任何时候指定了所需容量,Auto Scaling 会确保您的组一直具有此数量的实例。如果您指定了扩展策略,则 Auto Scaling 可以在您的应用程序的需求增加或降低时启动或终止实例。
例如,以下 Auto Scaling 组的最小容量为 1 个实例,所需容量为 2 个实例,最大容量为和 4 个实例。您制定的扩展策略是按照您指定的条件,在最大最小实例数范围内调整实例的数量。
创建 Auto Scaling Group
创建 Auto Scaling Group 有三种方式:
- 使用 EC2实例 创建
- 使用 启动配置 创建
- 使用 Launch Templates(启动模板) 创建
使用 EC2实例 创建
使用 EC2实例 创建 Auto Scaling Group需要满足以下条件:
- 实例位于您要创建 Auto Scaling 组的可用区中。
- 实例不是其他 Auto Scaling 组的成员。
- 实例处于 running 状态。
- 用于启动实例的 AMI 必须仍然存在。
创建步骤
在 EC2 列表找到用于创建 Auto Scaling Group 的实例,操作 -> 实例设置 -> 附加到 Auto Scaling 组。
在弹出的对话框中选择附加到“新的 Auto Scaling 组”,设置一个组名称。
创建成功,在 Auto Scaling Group 列表中查看创建好的组,检查配置(后面详细介绍)。
在 Auto Scaling Group 属性的实例页签可以看到前面选择的 EC2 实例。最好为此实例设置缩减保护。
注意事项
- 如果该 EC2 实例已经关联在一个 ELB 上,则由此创建的 Auto Scaling Group 也会关联到相同的 ELB。
- 如果该 EC2 实例已经关联在一个以上(不包含一个) ELB上,则由此创建的 Auto Scaling Group 不会关联任何的 ELB。
使用 启动配置 创建
创建新的启动配置(或选择已有的启动配置)
选择 AMI映像
选择配置合适的实例类型
设置启动配置的名称
添加存储
配置安全组
创建 Auto Scaling 组
设置组名、组大小、网络及可用区
设置扩展策略
配置通知
配置标签
使用 Launch Templates(启动模板) 创建
暂未使用,待研究。
Auto Scaling Group 配置详解
点击创建好的 Auto Scaling Group 可以在下方的属性面板中查看它的详细配置,一个有 9 个页签,下面详细说明。
详细信息
启动配置
可以选择使用启动配置还是启动模板来在自动扩容时启动新的实例。两者作用相似,都可以设置自动扩容新实例所需的 AMI、实例类型、存储、安全组等。
此配置还可以随时更改。Classic 负载均衡器 和 目标组
前者用于设置 ASG 与 Classic ELB(s) 关联,后者用于设置 ASG 与 Application Load Balancer(s) 或 Network Load Balancer(s) 的目标组(Target Group(s))关联。
将 ASG 与 ELB 关联后,ASG 组内的实例都将自动的挂载到 ELB 上,新增或分离的实例也将同步在 ELB 上挂载或摘掉。
每个 ASG 最多可以关联 10 个 ELB,可关联目标组的数量未测试。所需容量、最大、最小
最大、最小指定了 ASG 在自动扩容或缩减时不能超过的上下范围。所需容量必须在最大、最小值之间,代表当前对实例数量的需求,ASG 会通过自动扩容或缩减将正常的实例数量维持在所需容量。运行状况检查类型
运行状况检查类型有两个可选性:EC2、ELB。EC2: 对 EC2 实例进行状态检查,可以在实例的属性面板查看。关机和重启都会导致状态检查不通过。
ELB: 使用 ELB 提供的健康检查。
运行状况检查宽限期
通常,刚刚投入使用的 Auto Scaling 实例需要预热才能通过 Auto Scaling 运行状况检查。Auto Scaling 等运行状况检查宽限期结束才检查实例的运行状况。为了给实例提供足够的预热时间,请确保运行状况检查宽限期包含应用程序的预期启动时间。终止策略
终止策略有 5 个可选项:Default、OldestInstance、OldestLaunchConfiguration、NewestInstance、ClosestToNextInstanceHour。Default(默认终止策略): 默认终止策略可帮助确保您的网络架构均匀分布到多个可用区。
如果多个可用区中都有实例,选择有最多实例并且至少一个实例不受缩小保护的可用区。如果有多个可用区有此数目的实例,则选择使用最旧启动配置的实例所在的可用区。
确定所选可用区中哪些不受保护的实例使用最旧启动配置。如果有一个此类实例,则终止该实例。
如果有多个实例使用最旧启动配置,则确定哪些不受保护的实例最接近下个计费小时。(这将帮助您最大程度地使用您的 EC2 实例并管理 Amazon EC2 使用成本。)如果有一个此类实例,则终止该实例。
如果有多个不受保护的实例最接近下个计费小时,则随机选择其中一个实例。
OldestInstance
终止组中最旧的实例。当您将 Auto Scaling 组中的实例升级为新的 EC2 实例类型,可以逐渐将较旧类型的实例替换为较新类型的实例时,此选项十分有用。OldestLaunchConfiguration
终止组中最新的实例。如果要测试新的启动配置但不想在生产中保留它时,此策略非常有用。NewestInstance
终止采用最旧启动配置的实例。如果要更新某个组并且逐步淘汰先前配置中的实例时,此策略非常有用。ClosestToNextInstanceHour
终止最接近下个计费小时的实例。此策略将帮助您最大程度地使用您的实例并管理 Amazon EC2 使用成本。
默认冷却时间
Amazon EC2 Auto Scaling 用户指南:适用于 Amazon EC2 Auto Scaling 的扩展冷却时间
在实例投入使用之前,这些实例使用配置脚本安装和配置软件。因此,实例从启动到投入使用大约需要两到三分钟的时间。实际时间取决于诸多因素,如实例大小和是否有启动脚本要完成等。
现在出现了流量高峰,从而导致 CloudWatch 警报触发。该警报触发时,Auto Scaling 组会启动一个实例来帮助处理增加的需求。但是存在一个问题:该实例需要几分钟的时间才能启动。在此期间,CloudWatch 警报可能会继续触发,从而导致 Auto Scaling 组在警报每次出现时都另外启动一个实例。
但是,有了冷却时间,Auto Scaling 组在启动一个实例后,将暂停所有简单扩展策略或手动扩展引起的扩展活动,直至经过了指定时间量。(默认值为 300 秒。)这样,新启动的实例有时间开始处理应用程序流量。冷却时间过后,所有暂停的扩展操作都会恢复。如果 CloudWatch 警报再次触发,则 Auto Scaling 组将启动另一个实例,而冷却时间也会再次生效。不过,如果新增的实例足以将 CPU 使用率降为正常水平,则该组会保持其当前大小。
暂停的进程
Amazon EC2 Auto Scaling 用户指南:暂停和恢复扩展流程
您可以暂停然后恢复您的 Auto Scaling 组的一个或多个扩展流程。如果需要调查配置问题或与 Web 应用程序相关的其他问题,然后在不触发扩展流程的前提下对应用程序进行更改,则此设置很有用。
Amazon EC2 Auto Scaling 支持以下扩展流程:
- Launch
- Terminate
- HealthCheck
- ReplaceUnhealthy
- AZRebalance
- AlarmNotification
- ScheduledActions
- AddToLoadBalancer
实例保护
如果已设定好保护免于缩减,新启动的实例在默认情况下将被保护免于缩减。在缩减时 Auto Scaling 将不会选择被保护的实例成为要终止的实例。更改此一选项将不会影响现有实例。
活动历史记录
此页签可以看到该 Auto Scaling Group 扩容、缩减、添加、分离等活动记录。
扩展策略
扩展策略用于根据需求变化动态的进行扩展或缩减。扩展策略有三种:
- 目标跟踪扩展策略
- 简单的扩展策略
- 带步骤的扩展策略
Amazon EC2 Auto Scaling 用户指南:适用于 Amazon EC2 Auto Scaling 的目标跟踪扩展策略
实例
实例页签可以看到关联在此 ASG 中的 EC2 实例。可以在这里设置缩减保护,分离实例等操作。
标签
标签页签既可以为此 ASG 组添加标签,也可以为此 ASG 组自动扩容创建出的实例打标签。将标签后面的标记新实例选项设置为是,则此标签将附加在自动扩展出的实例上。
计划的操作
待学习。
生命周期挂钩
待学习。
实例保护(缩减保护)
缩减保护可以避免在 ASG 组在所需容量减少时终止(terminated)实例。
在 ASG 组属性面板实例标签中可以为组中的实例单独添加或取消缩减保护,也可以设置 ASG 的实例保护属性为“保护免于缩减”,这样 ASG 组启动实例时会自动为实例添加实例保护。
[注意] 实例保护并不能针对以下情况保护 Auto Scaling 实例
- 实例保护不能阻止手动在控制台去终止实例。(这不废话嘛……终止保护可以阻止手动终止实例,不过跟此话题无关。)
再注意: 终止保护可以阻止手动终止实例,但不能阻止 ASG 缩减去终止实例! - 实例未通过运行状况检查的情况下的运行状况检查更换。(这点很重要!就是说,即使设置了实例保护,去关机或重启,都会导致状况检查不通过而被terminated)
- Spot 实例中断。
设为备用
这是个非常有用的功能!合理使用设为备用功能在需要对 ASG 组中的实例维护进行关机、重启等操作时可以省去很多麻烦。
在上一节实例保护的介绍中说了,即使设置了实例保护,当实例关机时,仍然会被 ASG 自动 terminated(危险!)。此时就可以使用设为备用这个操作。
将实例设为备用,会首先将该实例从 ASG 关联的 ELB 中取消注册,然后根据设置减小 ASG 的所需容量(不启动新实例)或启动新的实例(所需容量保持不变)。Amazon EC2 Auto Scaling 不对处于备用状态的实例执行运行状况检查。当实例处于备用状态时,其运行状况将反映您将实例置于备用状态之前,实例具有的状态,直到将实例恢复为可用。
因为此时 Auto Scaling 不会对备用实例运行状况检查,所以可以进行关机维护等操作而不必担心被自动 terminated。
维护完成后,将实例重新设为可用,ASG 的所需容量会自动增加,实例也会重新注册到 ASG 关联的 ELB 上。
注意:
- 在将实例从备用状态设为可用前,请务必确定该实例已经正常运行可以通过状况检查,否则在设为可用后会被立刻 terminated (即使你设置了实例保护和终止保护,都没用)!
- 如果 ASG 设置了多个可用区,设为备用后导致各可用区中实例数量不一致,Auto Scaling 将会重新平衡可用区,即 terminated 实例较多的可用区中的一台,在实例较少的可用区中新启动一台。要避免自动平衡可用区,可以在 ASG 中设置暂停进程 AZRebalance。
常用操作总结
1. 重启、关机 ASG 中的实例
为避免 ASG 将实例自动 terminated,需按以下步骤执行:
- 在 ASG 属性面板实例页签将要维护的实例设为备用。(此操作会将实例从 ASG 关联的 ELB 中取消注册,如要求不影响业务,请确保仍有其他正常运行的实例)
- 进行重启、关机等维护操作。
- 在设为可用前,确保实例已启动,运行正常。
- 将实例设为启用。(一定要确保检查步骤3,否则会导致设为启用后被立即 terminated)
2. 删除 Auto Scaling Group
在删除 Auto Scaling 组时,其所需值、最小值和最大值均会被设置为 0。因此 ASG 中的实例将会被 terminated。
如仅需删除 Auto Scaling Group 而保持原有实例不变,需按一下步骤执行:
- 在 ASG 属性面板实例页签将实例逐一分离。(分离操作会导致实例从 ASG 关联的 ELB 中取消注册,如要求不影响业务,需逐一分离,挂载 ELB)
- 确保 ASG 中已没有实例,分离出去的实例已经重新注册到原有的 ELB 上。
- 删除 ASG(若不需要备份,也请一并删除启动配置)。
3. 附加实例到 ASG 中
要附加到 ASG 中的实例需满足以下条件:
- 实例处于 running 状态。
- 用于启动实例的 AMI 必须仍然存在。
- 实例不是其他 Auto Scaling 组的成员。
- 实例与 Auto Scaling 组位于同一可用区。
- 如果 Auto Scaling 组具有附加的传统负载均衡器,则实例和该负载均衡器必须都位于 EC2- 或同一 VPC 中。如果 Auto Scaling 组具有附加的目标组,则实例和负载均衡器必须都位于同一 VPC 中。
为避免可能出现的危险操作,在附加实例到 ASG 组中,需按一下步骤执行:
- 检查 ASG 中的配置,是否关联了 ELB,要添加的实例是否确实要注册到这些 ELB
- 检查 ASG 中的配置,ASG 的状况检查类型是 EC2 还是 ELB,要添加的实例是否能通过状况检查。
- 检查 ASG 中的配置,新附加的实例是否添加了实例保护,根据场景判断是否需要添加实例保护。
4. 从 ASG 中分离实例
如果不希望使用 ASG 管理实例了,可以在 ASG 的属性面板实例页签将实例从 ASG 中分离。分离时,若勾选“将一个新实例添加到 Auto Scaling 组以均衡负载”,ASG 将保持所需容量不变,分离指定实例,然后新启动一台实例来代替分离出去的实例。若取消勾选此项,则 ASG 的所需容量将会自动减一(若减一后小于最小值,将不能分离)。
注意:
- 分离出的实例将会自动从 ASG 关联的 ELB 上取消注册!
- 如果 ASG 设置了多个可用区,分离后导致各可用区中实例数量不一致,Auto Scaling 将会重新平衡可用区,即 terminated 实例较多的可用区中的一台,在实例较少的可用区中新启动一台。要避免自动平衡可用区,可以在 ASG 中设置暂停进程AZRebalance。
5. 两种组织 ASG 实例的方式对比
假设系统日常需要 2 台实例支撑业务运行,高峰是需要 4 台实例。有如下两种方式设置 Auto Scaling Group。
方式 1:
2 台实例不使用 ASG 管理,用于支撑日常业务。设置 ASG 最小 0,最大 2,所需 2,用于支撑高峰时业务。
优点:
- 配置简单,适用于对 ASG 不熟悉的同学使用。对原有系统架构添加 Auto Scaling 功能时不影响原系统架构。
- 2 台 ASG 组外的实例不受 ASG 配置的影响,可以避免因 ASG 配置错误造成意外的实例 terminated 或在 ELB 上取消注册。
缺点:
- 无法使用目标跟踪的扩展策略。扩展策略只能监控 ASG 组中的实例。
- 不能统一的修改 ASG 组内外实例的 ELB。
方式 2:
实例全部附加到 ASG 管理,日常用的 2 台实例一定要设置实例保护。设置 ASG 最小 2, 最大 4,所需 2,配置动态扩展策略。
优点:
- 统一管理,对 ASG 添加 ELB 等设置可以批量的应用在各实例上。
- 可以应用各种动态扩展策略。
缺点:
- 需要熟知 ASG 的各项设置与功能特性。否则容易造成实例意外 terminated 或在 ELB 上取消注册,导致影响线上业务。(这个其实不能算是缺点。)
心得体会
- 线上操作一定要非常小心!想清前因后果,不做不确定的操作,不要想当然。
- 熟读文档很重要!AWS 的文档写的很棒很细致,不过本地化还不够,有些翻译有些别扭不好理解。也因此有了这篇文章。
- AWS EC2 Auto Scaling 真的功能很多,很强大!
- 凡事都有两面。功能强大意味着使用复杂!不熟悉的话真的有很多坑!血泪的教训!
- 又攒经验了!
- 原文链接: https://chowyi.com//aws-auto-scaling-study/
- 版权声明: 文章采用 CC BY-NC-SA 4.0 协议进行授权,转载请注明出处!