AWS AutoScaling的一个ScaleDown策略问题以及解决方法
此文已由作者袁欢授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
1. AWS AutoScaling简介
AutoScaling是AWS的一个重要服务,用来弹性的自动创建(ScaleUp)或者删除(ScaleDown)EC2虚拟机,并且Scale的策略完全是用户自定义的、或者是基于虚拟机健康状态检查结果、或者是按照计划来实施Scale策略。
例如,考虑如下的业务场景,系统部署在EC2虚拟机上,所有任务分发均是通过AWS SQS来完成的,即请求按照特定格式发送到SQS指定队列中,而EC2虚拟机上运行的系统从这个队列读取消息来运行任务。
借助于AutoScaling,我们可以简单的设置下面的伸缩策略:
1)确保至少有2台EC2虚拟机正常提供服务;
2)ScaleUp:当SQS队列中的消息个数超过20个的时候,就自动创建一台或者多台虚拟机,ScaleUp策略执行之后CoolDown一段时间再次检查ScaleUp策略。当然创建该虚拟机的镜像需要提前预制好,确保虚拟机创建之后OS运行的时候,我们的业务系统能够自动运行起来。
3)ScaleDown:当SQS队列中的消息个数小于20个的时候,自动删除一台虚拟机。
说明:上面的例子只是简单的演示了AutoScaling的使用方式,可以借助于CloudWatch来实现更强大更精细的AutoScaling配置。
更多介绍详见AWS AutoScaling官方文档:http://aws.amazon.com/autoscaling/
2. AWS AutoScaling的ScaleDown策略存在的问题
对于一般的同步请求业务系统而言,AutoScaling的功能是比较强大的,借助于它,我们可以方便的实现业务的弹性自动伸缩。
但是,在使用过程中,发现AWS的AutoScaling(下文简称AmazonAS)存在一个问题,就是对于长时间运行的业务而言,比如一个视频转码请求需要几个小时才能处理完的,任务运行的时间几乎和视频时长一样长。在这种情况下,AmazonAS的ScaleDown策略就会出现一个问题:如果在一个虚拟机正在运行任务的时候,AmazonAS根据CloudWatch数据触发了ScaleDown策略,那么很有可能会删除掉该虚拟机,从而引起业务数据丢失或混乱。由此可见,AmzonAS并不适合于我们的业务特性,因此有必要仿照AmazonAS来实现一套定制化的AutoScaling来满足我们的业务需求。
3. 解决方法
3.1 ScaleUp策略
基本类似AmazonAS的ScaleUp策略来实现,或者说是它的简化版本。 通过监控SQS中指定队列的消息个数来自动新建一定数量的虚拟机,来运行队列中的任务消息,新建虚拟机的同时发送邮件到指定邮箱。
3.2 ScaleDown策略
由上文介绍的AmazonAS存在的问题或不足,我们就不能简单的根据SQS中消息个数来删除虚拟机了。我们的策略是让虚拟机内部自动根据任务运行情况来自我删除。
实现方式如下: 在虚拟机内部预制好检查任务运行状态(我们是通过检测日志来实现的)的脚本,如果发现系统空转一段时间之后就执行关机命令,进而触发AWS EC2虚拟机的Shutdown Behavior进行自我删除。备注:这就要求创建虚拟机的时候设置Shutdown Behavior为Terminate,即删除。
3.3 流程步骤
简要的流程图如下所示:
1) 首先,AutoScaling启动一个线程,进入循环;
2)在当前循环周期内,根据SQS中消息个数进行ScaleUp策略检查,如果满足策略条件,则调用EC2创建虚拟机的API创建一台或者多台虚拟机,并将Shutdown Behavior设置为Terminate,虚拟机参数会在AutoScaling中进行预先配置。如果创建了虚拟机则会根据预制的邮件列表发送邮件通知,并且CooleDown一段时间。
3)在当前循环周期内,ScaleUp完成之后就进行ScaleDown策略检查,真正运行ScaleDown策略的机制是在EC2虚拟机里面通过cron任务来执行的,在AutoScaling中仅仅是判断哪些虚拟机在当前循环周期内被删除了,如果检测到有虚拟机被删除掉,则发邮件通知。
4)ScaleUp和ScaleDown在当前周期全部执行完毕之后,等待一段时间,然后重新进入下一次循环周期。
3.4 代码实现
使用Java开发了该系统,并且运行在tomcat容器中,所有代码和脚本全部公开在github上,地址为:https://github.com/yuanhuan2005/autoscaling.git。
3.4.1 代码结构
代码位于autoscaling/src/main/java/com/tcl/autoscaling下面:
awsec2 awsses #SES接口,用于发邮件 awssqs #SQS接口,用于操作SQS中的消息 common #公共方法 listener #监听器 mail #发邮件接口 transcode #执行业务Scale的核心代码 |
3.4.2 配置文件
配置文件位于autoscaling/src/main/resources/autoscaling.propertites中:
awsAccessKeyId=YOUR_ACCESS_KEY #AWS的access key id |
3.4.3 shell脚本
在EC2虚拟机中需要安装如下的脚本,默认安装路径是/home/ec2-user/bin/,如有变化可对应修改。
脚本解释如下:
check_dispatcher_status.sh #检查运行状态。如果空转,则将idle_number的数字加1,当idle_number达到配置的上限时执行关机命令进行自我删除;如果没有空转即正在运行任务,则将idle_number清零,等待进入下次检查周期。 idle_number #记录空转次数的文件 dispatcher #注册为系统服务,以便可以用service命令进行管理,文件路径:/etc/init.d/dispatcher restart_tomcat.sh #重启tomcat的脚本 start_tomcat.sh #启动tomcat的脚本 status_tomcat.sh #检查tomcat运行状态的脚本 stop_tomcat.sh #停止tomcat的脚本 |
这些脚本的调用关系见下图所示:
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 H5活动产品设计指南基础版
AWS AutoScaling的一个ScaleDown策略问题以及解决方法的更多相关文章
- Ajax跨域、Json跨域、Socket跨域和Canvas跨域等同源策略限制的解决方法
同源是指同样的协议.域名.port,三者都同样才属于同域.不符合上述定义的请求,则称为跨域. 相信每一个开发者都曾遇到过跨域请求的情况,尽管情况不一样,但问题的本质都能够归为浏览器出于安全考虑下的同源 ...
- 过多if - else 的问题, 以及策略模式 + 反射解决方法
策略模式解决if - else 的代码 业务场景: 外包企业的审批人需要审批打卡的场景: 审批人分为多种不同的级别,多种级别中具有方式相同但是内容不同的操作:审批. 原来场景: 有前端传来审批人参数, ...
- Windows下一个MySQL有些错误的解决方法
1.无论是什么提示.我们有一个直接看错误日志.由于它描述了最具体描述错误日志. 于MySQL安装文件夹中找到 my.ini简介 看日志保存路径 2. 我的错误是[ERROR] Fatal error: ...
- php数组怎么根据其中的一个值进行排序?解决方法
有一个数组如下 我想对其进行一个排序,按照其“sort”的值的大小进行排序,3->4->7. 解决方法如下: 1.首先介绍php的两个方法 方法一:array_column() 返回输入数 ...
- IIS发布网站出现“未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。”的解决方法
未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈 ...
- CSS中的各个选择节点,都有样式最后一个无样式的快捷解决方法
2.1.3 多标签 多标签选择器一般和html上下文有关,它有以下集中分类 选择一个祖先的所有子孙节点,例如 div p{…} 选择一个父元素的所有直属节点,例如 div > p{…} 选择某一 ...
- lightGallery 一个视屏不播放 解决方法
这次使用了lightGallery,感觉还不错.样式比较美观,并且支持响应式. 使用过程中,我遇到了下面的问题: 当我 .picsgallery里面只有一个 .gItem的时候.点击弹出幻灯片,再点击 ...
- Win10提示“无法打开此计算机上的组策略对象”如何解决
为了更好地管理电脑,很多朋友都会去编辑Windows10的组策略.不过,有部分用户反馈自己在打开组策略的时候,遇到了“无法打开此计算机上的组策略对象”提示,无法打开组策略,这是怎么回事呢?下面,小编就 ...
- HTML5移动Web开发(六)——定义一个内容策略
通过分析工具搜集到的数据,你可以定义一个内容策略,这对已经有了一个桌面网站的人是非常有用的. 1.确认你已经把分析工具的Javascript代码嵌入到网站中.(http://www.cnblogs.c ...
随机推荐
- import caffe时出错:can not find module skimage.io
import caffe时出错:can not find module skimage.io //以下内容在ubuntu16.4上实际验证过.注意大小写的.----20170605 在命令行输入Py ...
- 多媒体开发之---h.264 SPS PPS解析源代码,C实现一以及nal分析器
http://blog.csdn.net/mantis_1984/article/details/9465909 http://blog.csdn.net/arau_sh/article/detail ...
- 【BZOJ2339】[HNOI2011]卡农 组合数+容斥
[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确 ...
- 【BZOJ1064】[Noi2008]假面舞会 DFS树
[BZOJ1064][Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...
- 安卓Android手机直播推送同步录像功能设计与实现源码
本文转自:http://blog.csdn.net/jyt0551/article/details/58714595 EasyPusher是一款非常棒的推送客户端.稳定.高效.低延迟,音视频同步等都特 ...
- 我读过的最好的epoll讲解
首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是套接字,还是管道,我们都可以把他们看作流. 之后我们来讨论I ...
- Android Button Maker(在线生成android shape xml文件的工具),真方便!
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/scry5566/article/details/25379275 直接上地址:http ...
- jni native macOS
参考自:http://mrjoelkemp.com/2012/01/getting-started-with-jni-and-c-on-osx-lion/ 1 ,创建HelloWorld,如: 说明: ...
- Vue实战指南之依赖注入(provide / inject)
案例 UI美眉说咱家的选项菜单太丑了,小哥哥能不能美化一下呀,洒家自然是说小意思啦~自定义一个select组件,so easy~ 简单粗暴型: <el-select v-model=" ...
- 信息发布员和频道管理员如何查看dedecms自定义表单内容
自定义表单的管理权限,超级管理员有,而频道管理员没有.在频道管理员的权限设置选项里,找不到自定义表单这一项.怎么办呢. 刚开始想修改权限设置选项,但觉得太麻烦.是否有偷懒取巧的办法? 在频道管理员的后 ...