按需付费:使用云计算的正确姿势

原文编者按:正文开始前,首先允许我介绍下作者,因为这篇文章让我对我司的这位北大学霸又有了新的认识,他的手机移动电源都是在公司充好电才带回去,简直太会过日子了。。。不过也只有这种精神才能写出这篇文章。因为,对于采用云计算的企业,省钱也是诉求之一。

下面进入正文:

都说云计算像水和电,你会水龙头一直开,出门不关灯么?

传说中云计算的优点是快捷便宜,说快捷可能分歧不大,在界面上点几下一台 VM 几分钟就出来了,可说到价格分歧就来了。去 IDC 买一台物理机的价格可是要比买同等配置的云主机一年便宜多了,那么使用云计算真的就比物理机贵么?我们用怎样的姿势来使用云计算才能达到成本的最优化。

按需付费

降低成本的核心秘诀就是四个字——『按需付费』。

都说云计算像水电,你会把水龙头放到最大 7 * 24 一直开着,所有的灯不分白天黑夜都这么亮着么?一般人还会把洗衣服的水留下来冲厕所,拔下几个灯泡省电,手机移动电源也都是在公司充好电才带回来。。。

为什么到用计算资源的时候就不管有用没用,使用率多少就一直开着,一直付费呢?

对于一些不需要一直在线的服务,比如定时任务,离线数据处理如果为他们单独分配一台机器,那么假设这一台机器一个月 30 元,服务一天只有 8 个小时是工作的,那么每个月有 20 元你相当于是送给云服务商的。如果你能够精细的控制服务的启动停止时间,只在服务运行的时候开启机器,那么每个月的费用会有大幅下降。

对于在线服务,传统上我们为了预防访问的自然增长以及某些情况的访问突增对机器造成的压力,会把机器的负载控制在很低的水平。可能当前的水平 1 核 1G 就可以应付,我们为了防止系统抖动非得弄个 4 核 8G 的,CPU 使用上了 20% 都心惊胆战,恨不得 CPU 使用率只有个位数。这样你相当于用花费了一个预想的峰值费用,却只真正使用了其中很小的一部分,把剩下的钱又拱手送给运厂商。

如果我们也像抠自家水电那样来思考,我们应该让每台已有的机器负载尽可能的高,等到峰值来的时候,就像开大水管一样再放几台机器出来,等到峰值过去再把水管放小,一毛多余的水电费也不交,而且再也不用年初头疼今年预算到底该怎么做了。

如果一切都能按照按需付费的理念来的话那么每一分钱都会被压榨出最多的价值,然而现实却不是那么美好。

现实残酷

按需付费的理想很美好,但现实很残酷。说是按需付费,前提是云厂商有能力提供按需付费,但是很多的粒度都是 1 小时,即使用了 1 小时 1 秒也要收取 2 小时的钱。能够按秒计费固然很好,但小时级别计费相对于包年包月来说已经好了很多,但是还会有一些严重的问题限制了我们自由地按需使用云计算。

按需使用就意味着频繁的启动、停止、扩容、缩容,目前云厂商提供计算资源通常在分钟级别,而给一个裸机装上你的服务通常又要很长时间,等待的过程就会让人心情烦躁,等扩容成功峰值早就过了。如果提供秒级别的计费,但是服务上线却要小时级别,那么这种按需还是不要的好。

另一方面,动态的扩容缩容对维护人员来说也是个负担,之前买好机器在固定的时间进行部署,现在动不动就会需要上线下线,可能在凌晨深夜,也可能在外出玩耍,要是如此崩溃的按需使用,那么还是让我浪费点钱,包年包月,把水龙头开大点吧。

云计算的武器

为了能够按需使用,我们需要更快的部署速度和更方便的部署方法,给我们的水龙头加上智能控制。

云服务一般会提供虚拟机镜像服务来更快的创建服务,但是:

1.一来虚拟机镜像的创建是个比较重量级的操作,基础环境做镜像还比较合适,而频繁变更的服务去自动化做镜像是一件比较麻烦的事情;

2.二来即使有了镜像如果是分钟级别的启动,也达不到我们按需使用的要求。

而快速的部署和秒级别的启动是 Docker 所擅长的领域。如果我们能把服务利用 Docker 镜像进行封装和分发并运行,那么我们就可以达到秒级别的部署和启动。当然前提是这个云厂商是卖 Docker 容器的,如果你是靠买虚拟机再管理 Docker 的话,那么反而会更累。

Docker 能解决部署速度的问题,但是频繁部署所带来的手动操作问题并没有解决。这种操作尽管可能在界面上点几下就可以,但是自动化才是云计算的正确使用姿势,不然尽管计费达到秒级别,部署也达到秒级别,但是人的响应却要几分钟到数小时,那么前面的速度依然没有意义。

我们希望使用云计算能像使用智能家电那样,所有东西都是自动化的,进门灯亮,出门灯关,空调自动调控室内恒温,完全不需要人动手。这就需要平台能够提供足够的 API 让使用者能够自主的随心所欲的控制所有的计算资源。

Docker 和 API 是我们能够自由按需使用云计算的两大利器。在构建灵雀云的平台的过程中,我们也一直在按照按需使用的目标前进,目前我们的服务都是按秒计费,并且可以通过API实现按需启停。可以通过调用API启动服务时,设置以下两个参数实现:

  • started_at 启动时间
  • stopped_at 停止时间

完整的API介绍文档:http://docs.alauda.cn/api/services.html

相关推荐