摘要: AutoScaling 伸缩组实例管理功能全面升级,新上线生命周期挂钩(LifecycleHook)功能,方便用户更加灵活地管理伸缩组内实例。使用生命周期挂钩能够在伸缩组发生伸缩活动时将伸缩活动挂起,执行自定义操做。后端
使用 LifecycleHook 功能,能够更加灵活地管理控制伸缩组内 ECS 实例的生命周期,灵活地控制伸缩组内实例的建立和移出过程。当伸缩组发生伸缩活动,触发生命周期挂钩时,伸缩活动将被挂起,结束当前被挂起的伸缩活动有两种方式:服务器
本文将系统地介绍生命周期挂钩功能的使用方式和使用场景,并给出生命周期挂钩功能的最佳实践。并发
LifecycleHook 介绍负载均衡
LifecycleHook 使用场景测试
使用 LifecycleHook,能够在伸缩组发生伸缩活动时将正在扩张或即将释放的 ECS 实例挂起,执行用户自定义操做,能够更加灵活地管理 ECS 实例在伸缩组内的生命周期。几个简单的 LifecycleHook 应用场景:3d
针对上述第二种场景,若是能够肯定每一个请求的最长处理时间,能够调用 建立生命周期挂钩 接口建立生命周期挂钩,设置 LifecycleTransition 参数值为 SCALE_IN,设置 HeartbeatTimeout 为请求最长处理时间,不须要设置通知对象,当发生弹性收缩类型伸缩活动时,ECS 实例从 SLB 移除后会挂起一段时间(HeartbeatTimeout),等待请求处理完成。对象
LifecycleHook 工做方式blog
当伸缩组建立了 LifecycleHook,并发生 LifecycleHook 配置的伸缩活动类型(LifecycleTransition)时,那么伸缩活动呗挂起,用户能够在伸缩活动挂起这段时间内执行自定义操做,一直到 LifecycleHook 超时(HeartbeatTimeout),或者经过调用 CompleteLifecycleAction 接口提早终止伸缩活动挂起。接口
对于弹性扩张(SCALE_OUT)伸缩活动:生命周期
ECS 实例先进入 Pending(加入中)状态,当实例启动成功,并添加到 RDS 白名单(若是伸缩组设置了 RDS)之后,触发 LifecycleHook ,ECS 实例进入 Pending:Wait(加入中挂起)状态。若是LifecycleHook 配置了通知对象(MNS),则发送通知内容到 MNS,用户可经过 MNS控制台 的方式来消费 MNS 主题或者队列中的消息,也能够经过 OpenAPI 的方式消费,具体可参考 ESS 事件通知#消息接收 章节。当用户接收到 MNS 消息后能够执行自定义操做,例如在 ECS 实例上安装软件、部署服务等,执行完自定义操做之后,用户能够经过 CompleteLifecycleAction 接口提早结束挂起的伸缩活动,也能够等待 LifecycleHook 挂起超时。LifecycleHook 挂起结束后有两个执行方向,CONTINUE or ABANDON,对于弹性扩张伸缩活动,执行方向解释以下:
结束 LifecycleHook 挂起状态之后,若是伸缩组配置了负载均衡(SLB),那么将 ECS 实例挂载到 SLB 上之后,实例进入 Inservice(服务中)状态,此时弹性扩张伸缩活动结束。
对于弹性收缩(SCALE_IN)伸缩活动:
ECS 实例先进入 Terminating(移出中)状态,,将实例从 SLB 后端服务器移除之后(若是伸缩组配置了负载均衡(SLB)),触发 LifecycleHook ,ECS 实例进入 Terminating:Wait(移出中挂起)状态。若是 LifecycleHook 配置了通知对象(MNS),则发送通知内容到 MNS,用户可经过 MNS控制台 的方式来消费 MNS 主题或者队列中的消息,也能够经过 OpenAPI 的方式消费,具体可参考 ESS 事件通知#消息接收 章节。当用户接收到 MNS 消息后能够执行自定义操做,例如检测 ECS 接收到的请求是否处理完成、中止接收服务等,执行完自定义操做之后,用户能够经过 CompleteLifecycleAction 接口提早结束挂起的伸缩活动,也能够等待 LifecycleHook 挂起超时。LifecycleHook 挂起结束后有两个执行方向,CONTINUE or ABANDON,对于弹性收缩伸缩活动,执行方向解释以下:
结束 LifecycleHook 挂起状态之后,弹性伸缩服务会将 ECS 实例先从 RDS 白名单移除(若是伸缩组配置了 RDS),再将 ECS 实例中止(若是 ECS 实例是伸缩组弹出来的不是手动添加的),而后释放实例(若是 ECS 实例是伸缩组弹出来的不是手动添加的),并将实例从伸缩组中移出。
LifecycleHook 通知方式
若是生命周期挂钩配置了通知对象,那么当伸缩组发生伸缩活动触发 LifecycleHook 时,通知对象将接收到当前的伸缩活动详细信息,若是生命周期挂钩没有配置通知对象,那么当伸缩组发生伸缩活动触发 LifecycleHook 时不会发出任何通知信息。
生命周期挂钩目前支持如下两种通知方式:
关于 MNS 主题和队列的介绍,您能够参考 队列使用帮助、主题使用帮助 来了解主题、队列的建立,消息的接收方式,以及如何为主题设置订阅等。
须要注意的是,MNS 消息服务会收取相应的费用,具体的收费标准可参考 云产品订价#消息服务 进行详细了解。
LifecycleHook 通知内容
当伸缩组发生伸缩活动触发 LifecycleHook 时,若是生命周期挂钩配置了通知对象(目前只支持通知到 MNS),那么通知对象将收到关于这次伸缩活动的详细信息,通知内容以下:
上述内容中:
content 生命周期挂钩触发的伸缩活动详细信息
defaultResult 生命周期挂钩默认执行策略
lifecycleTransition 生命周期挂钩适用的伸缩活动类型,取值范围:
MNS 队列或主题内容的消费方式,推荐参考 MNS 官方给出的 长轮训最佳实践 文档,使用长轮询的方式来消费队列或主题收到的消息内容。
最佳实践
建立 LifecycleHook 通知对象
在建立 LifecycleHook 时,能够配置通知对象,也能够不配置通知对象,若是须要配置通知对象,须要先建立好通知对象,再建立 LifecycleHook。关于通知对象(MNS 主题、队列)的建立方式,能够参考 ESS 事件通知#建立 MNS 队列 章节 和 ESS 事件通知#建立 MNS 主题 章节。
建立 LifecycleHook
LifecycleHook 的建立,能够经过 ESS控制台 完成,也能够经过调用 CreateLifecycleHook 接口完成。经过接口建立 LifecycleHook,可基于 CreateLifecycleHook 文档,参考 ESS 事件通知#建立事件通知(OpenAPI) 章节实现。经过 ESS控制台 建立 LifecycleHook 过程以下:
登陆 ESS控制台,进入生命周期挂钩列表页,点击建立生命周期挂钩按钮,弹出建立界面以下图所示:
按提示名称,通知标识,选择伸缩活动类型、执行策略和通知方式,点击肯定,以下图所示:
上图中,建立了两个 LifecycleHook,一个伸缩活动扩张类型的 LifecycleHook,一个伸缩活动收缩类型的 LifecycleHook。
触发 LifecycleHook
本章以触发弹性收缩活动为例,展现 LifecycleHook 工做过程。触发伸缩活动的方式,可参考 ESS 事件通知#建立事件通知(OpenAPI) 章节完成。
首先触发减小1台实例的伸缩活动,以下图所示:
查看伸缩组 ECS 实例列表页,以下图所示:
从上图看出,此时有一台 ECS 实例处于挂起状态,因为弹性收缩类型的 LifecycleHook 设置了通知对象,能够登陆 MNS控制台 查看通知结果,消息查看方式可参考 ESS 事件通知#MNS 队列消息接收) 章节。
接收到 LifecycleHook 发送的通知内容之后,提取 lifecycleActionToken 、lifecycleHookId 参数,而后经过调用 CompleteLifecycleAction 接口提早结束 LifecycleHook 挂起状态,调用方式以下:
使用上述代码中,需补充我的 AK 信息,以及 LifecycleActionToken 和 LifecycleHookId 参数。
LifecycleHook 挂起状态结束之后,ECS 实例被中止(伸缩组建立的实例),而后释放(伸缩组建立的实例)并移出伸缩组。
须要注意,若是 LifecycleHook 配置的通知对象被删除,那么当前的 LifecycleHook 将再也不生效。若是伸缩活动触发 LifecycleHook 被挂起,想要延长伸缩活动被挂起的时间,能够经过调用 RecordLifecycleActionHeartbeat 延长挂起时间。
写在最后
AutoScaling 生命周期挂钩功能提供了更加灵活地管理伸缩组内 ECS 实例生命周期的能力,经过该功能能够在伸缩组发生弹性扩张和弹性收缩活动时,经过将伸缩活动挂起的方式执行自定义操做。
弹性伸缩服务正在快速地发展,后续会有更多的新功能新特性推出,感谢您的一路陪伴。