弹性伸缩

弹性伸缩（Autoscaling），是云计算中的一种常用方法，通过该方法，服务器池中的计算资源量（通常根据有效的服务器数量来衡量）会根据服务器池中的负载进行动态伸缩。它与负载均衡紧密相关，并以此为基础。

## 优势

弹性伸缩具有如下优点：

- 对于服务运行在自建机房的公司，弹性伸缩通常意味着允许一些服务器在低负载时进入睡眠状态，从而节省电费（以及用于冷却机器的水费和水费）。
- 对于使用在托管在云上的机房的公司而言，自动扩展可能意味着更低的费用，因为大多数云提供商都基于总使用量而不是最大容量进行收费。
- 即使对于不能在任何给定时间减少运行或支付的总计算能力的公司，它们也可以在低流量时降低服务器的负载。
- 弹性伸缩解决方案（例如Amazon Web Services提供的解决方案）还可以用来替换异常状态的实例，从而在一定程度上防止硬件，网络和应用程序故障。
- 在生产工作负载经常变化且不可预测的情况下，弹性伸缩可以提供更长的正常运行时间和更高的可用性。

弹性伸缩与每天，每周或每年固定的服务器使用周期不同，它可以响应实际的使用模式，从而减少了因流量负载而配置的服务器太少或太多的潜在弊端。例如，如果流量通常在午夜时分较低，则静态伸缩方案可能会将某些服务器安排在夜间休眠，但这可能会导致在用户碰巧在夜间需要使用服务时（例如由于病毒性传播的新闻）出现宕机。与之相度的，弹性伸缩可以更好地应对预期外的流量高峰。

## 术语

在下面的列表中，我们使用亚马逊云计算服务提供的术语. 但是我们会标注出术语的别名，并且不会使用特定于Amazon服务名称的术语。

名称(AWS 的名称)｜含义｜别名 (Google Cloud Platform, Microsoft Azure, 或其他平台)

实例｜属于服务器组的一部分的，用于弹性伸缩的单个服务器或计算机

弹性伸缩组｜具有自动伸缩功能的实例的集合以及所有相关的策略和状态信息｜托管实例组 (Google Cloud Platform)

尺寸｜当前属于弹性伸缩组的实例数

所需容量（或所需大小）｜弹性伸缩组在任何给定时间点应具有的实例数。如果尺寸小于所需大小，则弹性伸缩组将尝试启动（设置和追加）新实例。如果尺寸大于所需大小，则弹性伸缩组将尝试删除（分离并终止）实例

最小尺寸｜系统允许的实例数的最小值

最大尺寸｜系统允许伸缩的实例数最大值

测量指标｜与弹性伸缩组关联的度量（例如CPU利用率，内存使用，网络使用），会定期生成时间序列的数据点。可用于设置伸缩策略的指标阈值。指标可以是弹性伸缩组实例指标的汇总，也可以是和伸缩组关联的负载均衡的指标。

伸缩策略｜用于指定弹性伸缩组的所需容量（或其最小和最大值）的更改，以响应超过特定阈值的指标的策略。扩容策略可以具有关联的冷却时间，这可以防止在特定扩容操作之后立即发生其他扩容操作。对所需容量的更改可以是增量的（增加或减少一个特定的值），也可以指定所需容量的新值。增加所需容量的策略称为“向外扩展”或“扩大”策略，而减少所需容量的策略称为“向外扩展”或“缩小”策略。

健康检查｜自动伸缩组确定与其连接的实例是否正常运行的一种方法。运行状况检查可以基于实例是否仍然存在并且可访问，也可以基于实例是否仍在注册并在关联的负载均衡器中使用。

启动配置｜启动新实例时使用的参数和脚本的描述。这包括实例类型，购买选项（例如，在AWS中为现货或按需购买），可能的启动可用区域，机器映像以及在启动时运行的脚本。｜实例模板 (Google Cloud Platform)

手工伸缩｜手动执行的伸缩操作。

按计划扩展｜在特定时间执行伸缩操作的策略。比如，每天执行，每月执行，没年执行。更多请查看 #Scheduled scaling

## 实践

### 亚马逊云服务 (AWS)

<image>

亚马逊云计算服务在 2006 年 8 月启动了 亚马逊弹性计算云 (EC2)，来允许开发人员编程启动和结束实例（机器）。在最初启动时，AWS不提供自动缩放功能，但是通过编程方式创建和终止实例的能力使开发人员可以灵活地编写自己的代码以进行自动伸缩。

从 2008 年 4 月开始，AWS 的第三方弹性伸缩软件开始出现。这其中包括 Scalr 和 RightScale。RightScale 被 Animoto 使用，从而能应对 Facebook 的流量伸缩。

2009年5月18日，作为Amazon Elastic Compute Cloud的一部分，Amazon 推出了自己的弹性伸缩功能以及 Elastic Load Balancing。现在，自动缩放是Amazon EC2产品不可或缺的组成部分。Amazon Web Services 上的自动缩放是通过Web浏览器或命令行工具完成的。2016年5月，AWS ECS服务中也提供了自动伸缩功能。

视频点播提供商Netflix记录了他们在Amazon Web Services中使用自动缩放功能来满足其高度可变的消费者需求的情况。他们发现积极地扩大规模，延迟和谨慎地缩小规模最能实现其正常运行时间和响应能力的目标。

在描述 TechCrunch 的文章中, Zev Laderman, Newvem（一个用来优化 AWS 云基础设施的服务）的联合创始人， CEO 推荐说在项目起步阶段使用弹性伸缩是他们的花费保持在较低的水平。

各种适用于AWS的最佳实践指南都建议即使在负载不变的情况下也要使用其自动缩放功能。这是因为自动缩放具有另外两个优点：自动替换由于任何原因（例如硬件故障，网络故障或应用程序错误）而变得不正常的任何实例。并且自动替换因价格或容量原因而中断的竞价型实例，这使得将竞价型实例用于生产目的更加可行。Netflix的内部最佳实践要求每个实例都在一个弹性伸缩组中，并且其一致性猴子（Netflix 内部的测试工具）会终止不在自动伸缩组中的所有实例，以实施此最佳做法。

### 微软的 Windows Azure

2013年6月27日，微软 公布其 Windows Azure 云计算平台支持弹性伸缩功能。文档可参考 微软开发者网络.

### 甲骨文云

Oracle Cloud Platform 允许服务器实例通过定义自动扩展规则自动收缩或扩展集群。这些顾泽主要利用 CPU 和内存的利用率来决定何时增加和删除节点。

### 谷歌云平台

2014年11月17日，Google Compute Engine 发布了贪生伸缩的 beta 版本试用功能。As of March 2015, the autoscaling tool is still in Beta.

### Facebook

在2014年8月的博客文章中，一位Facebook工程师透露，该公司已开始使用自动缩放功能以降低能源成本。博客文章报道了在低流量时间（午夜左右）能耗下降了27％，在典型的24小时周期内能耗下降了10-15％。

### Kubernetes 水平 Pod 伸缩器

Kubernetes Horizontal Pod Autoscaler 自动的调整 pods 在 replication controller , deployment 或 replicaset 中的数量。调整主要基于对 CPU 的监控(其 beta 版也可以监控其他一些指标 application-provided metrics )

## 可选的弹性伸缩决策方案

默认情况下，自动缩放使用``被动决策方法来处理流量缩放：缩放仅响应于度量标准的实时更改而发生，在某些情况下，特别是当更改发生得很快时，这种被动缩放方法是不够的。下面介绍了另外两种自动缩放决策方法。

### 按计划扩展方案

这是一种自动缩放的方法，其中在一天的特定时间更改自动缩放组的最小大小，最大大小或所需容量。例如，如果已知流量负载在 一天中的特定时间，但是更改太突然了，以至于基于响应式方法的自动缩放无法足够快速地响应.AWS自动缩放组支持计划的缩放。

### 预测性弹性伸缩

这种自动缩放方法使用predictive Analytics，其想法是将最近的使用趋势与历史使用数据以及其他类型的数据结合起来，以预测将来的使用情况，并根据这些预测进行自动缩放。

Netflix发现，对于部分基础架构和特定的工作负载，其预测分析引擎Scryer比Amazon的反应式自动缩放方法提供了更好的结果。它特别适合以下场景：

- 在不久的将来识别需求的巨大峰值，并提前一点准备好产能
- 处理大规模中断，例如整个可用区和区域的故障
- 处理可变的流量模式，根据一天中不同时间的典型需求水平和变化率，在横向扩展或纵向扩展速率上提供更大的灵活性

在2018年11月20日，AWS宣布将在其自动扩展产品中提供预测扩展功能。