当应用上线以后,我们就万事大吉了吗?非也非也,可能日常情况下,你的应用利用现有的资源能很容易的处理用户的请求,但是如果是节日,热点事件,双十一或者促销活动导致的流量暴涨呢,我们应该怎么去处理,相信大家肯定会说加资源啊,伸缩应用集群啊。是,这是一个好方法,但是说起来容易,做起来难,怎么能很快速的扩资源呢?当流量逐渐回归平稳的时候,怎么能一点一点的收缩资源,减少资源浪费呢。本文将基于阿里云的资源编排服务(ROS)来尝试给出一点建议。
背景
本文通过下面的高可用应用部署的例子来说明,如何通过通过ROS做到资源的弹性伸缩,轻松应对流量波峰。下图是一个高可用应用部署的最简单架构:
所有弹性计算资源 ECS,RDS创建在同一个VPC网络下, 外部用户通过SLB访问应用。同时RDS是主备存储放在不同的可用区,并且创建了数据库为其添加用户。SLB监听了80和443端口。所以基本上,只需要用户把自己的应用部署到这个环境里,就可轻松上线了。通过下面的【一键部署】就可以搭建出一个高可用架构。
应用上线了,可以松口气了,别急。公司要做促销,要迎接双十一,流量暴涨,当前的计算能力不能处理怎么办?别急,下面就说如何通过 ROS, 在已有的应用部署环境下,并且不影响用户使用的情况下,神不知鬼不觉的应用的弹性伸缩呢?
初步扩容
流量暴涨扩容只需要下面两步:
- 给原有APP部署机做镜像
应用部署在系统盘里,需要给上面的架构中的一台ECS做镜像,这样就可以通过包含有APP的镜像,克隆出一个全新ECS。做镜像的步骤参考这里;
- 点击下面的一键扩容:
点击完一键扩容后,你会在浏览器看到下图输入参数:
参数SourceInstanceId指定以哪个ECS为基准克隆扩容的ECS,NewImageId 指定第一步所创建的镜像,这样当扩容以后新的ECS上就已经包含有部署好的应用,MaxAmount 指定将要扩容的 ECS 数量,本例中是扩容了5台 ECS,LoadBalancerIdToAttach 指定扩容的ECS将要挂载到已存在哪个SLB上。参数输入完成后,点击创建,稍等几分钟新的扩容的 ECS 就自动上线了。其实这里还有优化的空间,应用是否可以做到自动启动呢,答案是可以的。通过ROS的UserData,指定应用的启动脚本,就可以非常方便地实现ECS上线的时候,应用同时上线。关于UserData的例子可以看这里。
动态调节计算节点
如果扩容后,仍然不能处理继续增长的流量呢,这个也很简单,可以继续点击一键扩容,增加计算量。但是最好的方法是使用如下所示的方法来调节自己应用的部署规模。这样不仅很方便的实现扩容,也可以很方便的做到缩容。这里动态调节的本质是,利用ROS的Update功能,通过修改资源栈模板的参数,来更新资源栈中的资源配置以及数量。简单说,通过调节上面的资源栈的 MaxAmount 参数就可以达到动态调节 ECS 计算资源目的。
当需要增加资源时, 修改MaxAmount为10,那么就是在原有扩容的基础上,再增加5台相同配置的ECS;当流量开始降低,修改MaxAmount为3,就是在原有扩容的基础上,删除2台机器。
- 在ROS控制台,找到一键扩容所创建的stack,然后点击下面更多会出现更新堆栈按钮,如下图所示:
- 点击【更新堆栈】,会出现如点击一键扩容时参数输入框,如下图所示,假如需要缩容,那面调整MaxAmount参数为3,点击更新就会把多余的 ECS 释放掉。
这样不论流量规模如何变化,我们都可以以不变应万变,轻轻松松实现 ECS 计算的任意调节。当流量彻底回归正常水平,只需删除一键扩容时所创建的资源栈即可。
总结
本文主要讲述了如何通过ROS实现应用的弹性伸缩。上面的步骤都是在ROS的控制台手动操实现的。当弹性伸缩的变动不频繁,运维人员还能hold住,但是当要实现快速响应,实时调整应用的处理能力,那么最好的方法是利用ROS的API去实现上面步骤。关于ROS API的使用,可以参考这里。关于API的详细介绍请参考这里。所有在控制台的操作,都提供了相应的API。
从此以后后任何弹性伸缩的应用场景,再也不用怕了。