弹性伸缩的目标是为了实现服务容量线性扩展,即服务容量随服务提供者部署实例的个数线性扩展。弹性伸缩的前提是敏捷基础设施和资源池共享,敏捷基础设施确保应用需要伸缩时能够快速创建出所需的虚拟计算资源,资源池共享确保一个应用释放的资源能被其他应用所使用。
弹性伸缩方案包括弹性扩容、弹性缩容、弹性自愈3个方面的内容:
- 弹性扩容:前端业务流量激增时,弹性伸缩能够为应用系统快速补充底层服务器资源,避免访问延时和资源超负荷运行。
- 弹性缩容:前端业务流量下降时,弹性伸缩为应用系统自动完成底层资源释放,避免资源浪费。
- 弹性自愈:当检测到某台虚拟机实例处于不健康状态时,弹性伸缩自动释放不健康节点并创建新的服务节点,自动挂载新建的服务节点到负载均衡实例中。
依据触发条件及执行方式,弹性伸缩分为自动弹性伸缩和手动弹性伸缩。自动弹性伸缩是指系统根据预设的伸缩策略(一般根据集群的平均CPU、RT和负载等性能指标),由系统按照规则(触发条件)自动执行扩容或者缩容。自动伸缩时,要求负载均衡产品提供API动态挂载及摘除节点的能力。手动弹性伸缩则是在可预期的大促活动前后或者某些业务下线之后,或者人工观测集群在一段时间内的平均负载情况,或者收到资源告警信息等情况,由运维人员主观分析判断后,以人工方式为集群进行扩缩容。
常见的应用进行分类,可以分为如下4种不同类型:
- 在线任务类型:比较常见的是网站、API服务、微服务等常见的互联网业务型应用。这种应用的特点是对常规资源消耗较多,比如CPU、内存、网络I/O、磁盘I/O等,对于业务中断容忍性差。
- 离线任务类型:例如大数据离线计算、边缘计算等,这种应用的特点是对可靠性的要求较低,也没有明确的时效性要求,更多的关注点是降低成本。
- 定时任务类型:定时运行一些批量计算任务是这种应用比较常见的形态,成本节约与调度能力是重点关注的部分。
- 特殊任务类型:例如闲时计算的场景、物联网(Internet of Things,IoT)类业务、网格计算、超算等,这类场景对于资源利用率有比较高的要求。
为实现弹性伸缩(尤其自动弹性伸缩),应用系统在架构设计时需满足一定条件:
- 应用必须无状态并且可横向扩展。
- 弹性伸缩一般为横向同等规格资源扩缩容,不支持纵向的资源规格升降配。
- 负载均衡产品提供接口动态挂载能力。
- 访问某些资源服务(如数据库、缓存)需要配置白名单,新扩容的机器必须能够自动加入白名单中。
- 如果有跨网络安全区域的访问,最好通过统一的服务网关(或NAT网关),以避免新增的机器由于防火墙安全策略的原因无法访问外部服务。
- 弹性伸缩时要求应用实现优雅上下线的能力,以确保弹性伸缩过程对业务的平滑无感知。