诀窍使AWS斑点实例“持久”?

我的客户为他的VPS使用AWS。 他遇到的一个问题是,如果现货出价高于出价,他的实例就会被终止。 看起来并不是什么大不了的事情,除了现场实例不是持久的,所以每次发生这种情况我们都必须从图像中恢复。

他想要我做的是写一些将检查每X时间终止实例,并自动重新启动。 更重要的是,他想要某种方式假装“坚持”。 我最好的想法是简单地从每个服务器每Y时间创build一个映像,然后从该映像引导(如果/当该实例终止时)。

任何其他的想法会很高兴听到。 我想我的问题是,我在这里正确的轨道上,你们知道任何可能已经存在的解决scheme吗?

更新:差不多一年之后,我回到这里来find所有这些美妙的回应,并且比我预料的更多地关注这个话题。 下面的答案很多,而信息和帮助,质疑我的推理。 我想说的是,即使在那个时候,我也100%同意这不是一个明智的想法,但是尽pipe我有任何企图,我的客户仍然要求我们把事情转向一个更好的方向。

非常感谢你的帮助。 我最终搞清楚如何做到我想要的,并能够写一些代码,自动重新运行已终止的实例。 这并不容易,但是当我转到一个新客户的时候,它运行良好。

祝你们有同样的问题,你们正在进行(可能是武力,就像我的情况一样),这不是件容易的事情。 现货要求比较便宜,因为这里有些人提到他们的回应,特别是因为没有提供持久性。 否则,我认为“现货要求”市场的价格将大不相同。

同样的,这可能的,我做到了,这是一个很棒的经历。 当没有办法的时候,你必须伪造它! 如果你不这样做,别人会。

更新二:我只想提醒大家,这是我本来的任务。 虽然当时很多人只是驳斥了整个概念,但我最终还是得到了一个或多或less的function性SaaS,使得人们可以轻松地pipe理和监控所有的实例,包括启用/禁用自动持续重启实例,个别实例的时间安排时间(应该或不应该开始),等等

虽然我完全同意,从开发者的angular度来看,这是一个不雅的要求,当时我不想这样做,但我仍然认为这种方式很好,被要求因为我不仅学到了很多东西 ,而且我对自己的能力和代码非常有信心,但是就我所知,我产生了一个非常有用的,非常有价值的软件客户(即使他们要求错误的东西,因为他们不知道更好)。

我试图把他说出来,但是他坚持说,既然他是付钱的人,我就把注意力集中在那里,不仅实现了许多人在这里被愚蠢地认为是愚蠢的,而且使某人有利可图

如果这是愚蠢的,它不会拯救任何人的钱。

看,我现在读这个post,稍微有些畏缩。 那么,我更加天真了。 我知道AWS更好,现在,我现在编码好多了,等等。

但是我仍然为解决这个问题感到自豪,尤其是因为这些人是同龄人,年龄大,经验丰富,毫无疑问,这些程序员无疑是不可或不应该做的。 你是那些让我感到挑战的人,所以谢谢你!

如果可以做到有利可图呢? 你确定不应该?

我们最终find了一个解决scheme,这就是我们不得不做的。 我将逐步列出这一点,以便为那些可能正在寻找类似解决scheme的人员更容易地进行重新创build。

  1. 创build一个新的现场请求实例。 确保取消选中根设备上的“删除终止”,以便在下一步中保留音量。 确保记下架构(我们总是使用x86_64)和您的实例正在使用的内核ID(非常重要!)
  2. 现在,SSH到你的新实例,并创build一个文件或东西,所以你可以看到第一手持久性的影响。 在对文件系统进行一些更改之后,请继续并注销SSH连接并终止实例。
  3. 真棒。 现在,转到您的EC2 Web控制台,并find正在用于刚刚终止的实例的新卷。 右键单击音量并select“创build图像”。 按照向导,确保select与前面提到的相同的体系结构和内核标识。
  4. 现在,使用您的新图像启动现场请求向导。 按照向导,再次确定取消“终止删除”。 此外,这是错过的简单步骤,请确保展开名为“高级选项”的折叠部分,并再次设置正确的内核ID。

如果按照上面的步骤对T进行操作,那么在旧实例终止的同一点上将会有一个新实例。 因此,我们已经实现了某种forms的坚持。

(感谢Ethan Barron提供的一些原创性意见,这是一个有一些更正和澄清的版本。)

[1]。 创build一个新的现场实例。 取消激活根设备上的“终止删除”。 记下体系结构(x86_64)和内核ID。

[2]。 SSH到你的新实例,并创build一些文件,应该保持超越重新启动。 不要终止实例。

[3]。 在实例仍在运行的情况下创build实例的快照(这可能会在极less数情况下导致文件系统不一致,从而限制写入引导卷)。 记下该快照的名称。

[4]。 现在退出SSH连接并终止实例。

[5]。 从步骤3中创build的快照创build一个AMI(AWS不支持从卷创buildAMIS;它必须是一个快照,如果使用的是剩余卷,那么还有一个额外步骤:创build该快照)。

[6]。 根据步骤1的体系结构,步骤1的内核ID以及步骤5中创build的AMI请求一个新的实例实例。

这应该工作。

竞价型实例不能持久化,但可以点竞标

持续竞价请求:当您将竞价请求指定为“持久性”时,确保在实例终止后,由您或Amazon EC2自动重新提交,直到您取消出价请求。 这使您可以在现货价格低于最高价格时自动启动竞价型实例。

http://aws.amazon.com/ec2/spot-instances/#4

这可以让机器随时在价格范围内运行,但是对于其余部分,请考虑您的现场实例在做什么,您是否认为磁盘的持久性是要走的路。 想想“云”。 认为是“短暂的”。 竞价型实例旨在成为启动,取出工作,执行工作,提交工作的临时机器,如果它们消失了,工作仍在等待下一个实例再次获取,完成并提交。 你可以在EBS中使用它们并保持音量,但是如果你这样做的话,这些实例不能重新启动(你已经注意到了)。

如果您的AMI使用实例存储,并存储需要在外部持久存储的所有内容(例如,在S3中),那么您不需要在AWS体系结构中进行攻击,并且可以坐下来观看计算机的价格是正确的,做好自己的工作,并在价格超出范围时再次closures。 而且,没有腐烂,因为每一个引导是一个光洁的系统。

或者,您的实例可以挂载永远在线的机器导出的NFS共享。

或者这个: https : //serverfault.com/questions/448043/auto-attach-ebs-volume-to-a-new-spot-instance

如果您使用的是Ubuntu,我发现了一个方便的解决scheme。 它使用了ubuntu发行版中包含的名为“overlayroot”的function。 这个想法是保持根文件系统只读,并将所有的变化写入EBS支持的覆盖文件系统。 由于根是只读的,因此可以在终止时删除,所有更改都将保留在覆盖文件系统中。

  1. 首先创build一个启用overlayroot的自定义AMI。 使用AWS控制台启动您最喜爱的AMI。 login并将以下行添加到/etc/overlayroot.local.conf

    overlayroot=device:dev=/dev/xvdf,timeout=180,recurse=0

使用AWS从您的实例“Instances-> Actions-> Image-> Create Image”创build一个自定义的AMI

现在创buildEBS卷并将其附加到实例。 “卷 – >操作 – >附加卷”,然后初始化音量。

 mkfs.ext4 /dev/xvdf 

这第一个实例只用于创build自定义AMI并初始化音量,因此可以终止。 在创build自定义图像之前,请勿附加EBS卷,以使其不包含在图像中。

每次启动现场实例时,都应遵循以下步骤。

  1. 启动自定义实例。 一定要设定你的现货价格。
  2. 实例启动后,将覆盖卷连接到/ dev / sdf上的实例。
  3. 重新启动您的实例。 “实例 – >操作 – >实例状态 – >重新启动”。 login后,你应该看到这样的事情

    ubuntu@ip-10-178-74-83:~$ mount overlayroot on / type overlayfs (rw,discard) ... /dev/xvda1 on /media/root-ro type ext4 (ro,relatime,data=ordered) /dev/xvdf on /media/root-rw type ext4 (rw,relatime,data=ordered)

现货实例的性质是短暂的,所以不能让实例“持久”。 但是,您可以使用EBS使数据持久。

你的想法对于图像来说是一个好主意,我不确定是否有其他的方法可以做到这一点。

您可以随时查看现场实例的文档或跳转到论坛,以查看是否有任何AWS工程师有任何想法。

– 编辑 –

不知道这是否会起作用 – 因为这会产生额外的成本,但是您可以随时立即从您生成的映像中立即启动实例,并立即生成实例并终止现有实例。 这会给人持续的幻觉,特别是如果你不依靠EBS卷来保存数据。

AWS最近推出了一个新的Spot实例仪表板,使您的实例保持持久状态变得非常简单。 这也包括自动定价和地区支持,所以人们不必担心出价理想的价格。 一旦实例启动,创build实例的AMI,就是这样。 下一次请求专题实例时,只需从“已保存的实例”列表中select该实例即可。 内核和EBS恢复原样。