本文共 1895 字,大约阅读时间需要 6 分钟。
今年一直在做的事情就是成本优化,今天分享的是如何打造一个弹性可伸缩服务。
一个网站,通常流量大小不是每时每刻都一样,有高峰,有低谷,如果每时每刻都要保持能够扛住高峰流量的机器数目,那么成本会很高。一个诱人的想法就是根据流量大小自动调节机器的数量,这就需要我们开发弹性伸缩服务。
我们公司使用的是阿里的ECS,而它提供弹性伸缩组机器,按秒计费,可以随时申请随时释放,它是我们能够进行弹性伸缩的最基本条件。由于这个How内容较多,接下来就详细说一下这个How如何实现。
这块着实是做了不少的工作,前前后后经历了大半年的时间,接下来一一详述。
我们的弹性分配策略依赖实时的qps,需要实时的获取流量大小,所以必须能够在某个地方获取当前请求的QPS,自然而然会想到使用消息队列,我们可以使用队列提供的接口,获取某段时间内的qps,并根据速率调整我们的机器服务数,这涉及到服务的改造。由于我们的一些服务都是以RPC调用进行交互(即“推”模式),所以势必要改造这些服务,使其主动从队列中拉取消息并处理。如下图所示。
我们的计算服务使用的高配置机器(16核16G),而阿里云伸缩组的机器配置很低(最高配置4核,内存大小可调),所以一些计算型服务需要拆分,使其能够在低配机器运行。如下图,是我们做的一个拆分示意。
由于需要随时增加和减少机器,这需要服务有快速部署上线和下线的能力,所以可以使用docker。具体使用方法本文不赘述。
由于弹性伸缩服务随时上下线,但是日志不能扔。需要日志收集服务跟随业务服务一同部署,同样可以利用docker,日志随时收走。
完成了如上3个基本工作,接下来就好办多了,我们设计一个弹性分配算法:根据队列中进去的消息速率来决定机器数目。
每个服务都需要有一个配置文件
[strategy]#一个服务能够扛多少qpsspeed_ratio = 2.5#部署一个服务大概需要多少秒start_time = 300#每次部署多少个,至少为1incr_num = 2#固定机器有多少个persistence = 16
算法大致流程:
阿里云ECS启动失败
有的时候机器申请成功,但是启动失败,情况有两种:1、启动时间过长,2、根本启动不起来。解决这两种问题的方法为,尝试启动一段时间,超过一定时间(比如start_time)后果断放弃,重新申请新机器,防止整个服务启动过程过长跟不上qps的上涨速度。转载地址:http://fdcja.baihongyu.com/