实习时接到一个听起来很简单的任务:把一台服务器迁到新的AWS区域,保持和原来一样,尽量少花钱。

打开网易新闻 查看精彩图片

最后那句"少花钱"让我记了很久。如果你翻过任何关于AWS省钱的资料,Spot实例几乎无处不在。AWS说它比常规的按需实例最多便宜90%。九成!我一度以为自己找到了那个轻松的省钱答案。

然后在站会上,一位队友问了一个问题,十秒钟就把这个想法按死了:

"这台服务器的数据存在哪儿?"

下面是我从这件事里学到的东西,以及我现在给任何东西选Spot之前都会先问的那个问题。

Spot实例到底是什么

AWS的数据中心里塞满了服务器,任何时刻都不是全部在用。Spot实例就是让你把这些闲置容量租下来,价格低很多。

代价藏在交易条款里。AWS随时可以在需要这批容量时把它收回去。你会收到两分钟的预警,然后实例就没了。

默认情况下,被中断的Spot实例会被终止,除非你另外做过设置,否则它自带的磁盘也会一起消失。

两分钟够存一点工作进度,不够把一台服务器的全部记忆存下来。

我们那台服务器扔不得

站会上那个问题就是冲这儿来的。

我要迁的这台服务器,把自己的上下文存在本地磁盘上。它知道的一切都活在这一台机器里,没有独立的数据库或存储替它留副本。

所以如果AWS把它收回去,我们丢的不只是一台运行中的服务器,而是它积累起来的全部东西,得从零开始。

那个便宜选项,最后可能变成最贵的那个。

宠物与牲口

DevOps里有一句老话,这件事之后我才真正理解。

牲口是你不会产生感情的服务器。它们长得都一样,死了一台就换一台,没人会注意到。比如负载均衡后面的Web服务器,真正的数据存在别处的数据库里。

宠物是你在乎的服务器。它们有自己的名字、自己的数据,死了一台,你这一天就不好过了。

Spot实例对牲口很合适,对宠物有风险。

我们那台服务器,妥妥是只宠物。

我现在会先问的问题

给任何东西选Spot之前,我会先问自己:

"如果这台服务器现在消失了,我们会失去什么?"

如果答案是"没什么,再起一台就行",Spot大概率很合适。比如这些场景:

  • 可以重启的批处理任务
  • CI运行器
  • 测试环境
  • 自动伸缩组里、数据存在别处的服务器

如果答案是"会失去很多",那就先用按需实例,至少等到数据搬到更安全的地方再说。

钱还是省下来了,只是换了种省法

目标依然是压成本,所以便宜并没有被排除,只是得是"对的那种便宜"。

计划是让这台服务器按开/关的时间表运行,只在需要的时候开着。用按需实例,实例停止期间不付计算费用,只为磁盘付一小笔钱。而停止实例会保留磁盘,过夜也不会丢东西。

Spot也没有被永久排除。迁移完成之后我们会再看一次。如果数据搬离了这台服务器,它就不再是宠物,Spot也就成了一个选项。

我一开始以为最便宜的选项就是最聪明的选项。站会上的一个问题让我明白:如果便宜可能弄丢你的数据,那它就不便宜。

说实话,这段实习里我学到的最好的东西,有些并不来自文档,而来自队友随口问出的、我自己没想到要问的简单问题。