46

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

他想让我做的是写一些东西,每隔 X 时间检查一次终止的实例,并自动重新启动它们。更重要的是,他想要某种方式来假装“坚持”。我最好的想法是每隔 Y 时间从每个服务器创建一个映像,然后从该映像启动(如果/当该实例终止时)。

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

更新:差不多一年后,我回到这里,发现所有这些精彩的回应以及对这个话题的更多关注,超出了我的预期。以下许多答案虽然内容丰富且很有帮助,但对我的推理提出了质疑。我想说的是,即使在那个时候,我也 100% 同意这不是一个明智的想法,而是我的客户所要求的,尽管我做了任何尝试,以使事情朝着更好的方向发展。

非常感谢大家的帮助。我最终确实弄清楚了如何做我想要的,并且能够编写一些自动重新启动终止实例的代码。这从来都不是一件容易的事,但当我转向一个新客户时,它运作良好。

祝你们任何有同样问题的人好运,你们正在(可能是通过武力,就像我的情况一样)做一些不容易的事情。Spot 请求更便宜,正如这里的一些人在他们的回复中提到的那样,特别是因为不提供持久性。否则,我想“现货请求”市场的定价会大不相同。

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

更新二:我只想提醒大家,这是我的主要任务。虽然当时很多人都忽略了整个概念,但我最终得到了一个功能或多或少的 SaaS,它允许一个人轻松管理和监控所有的现场实例,包括启用/禁用自动持久重新启动的能力例如,为各个实例安排时间(应该或不应该启动它们)等。

虽然我完全同意,从开发人员的角度来看,这是一个不雅的要求,而且当时我不想这样做,但我仍然会说它在某种程度上很好,被要求努力工作,因为我不仅学到了很多东西,不仅对自己的能力和代码充满信心,而且还为我开发了一个非常有用且据我所知非常有价值的软件客户(即使他们要求错误的东西,因为他们不知道更好)。

我试图说服他不要这样做,但他坚持说,因为他是那个付钱的人,所以我把注意力集中在那里,不仅完成了这里许多人认为愚蠢的事情,而且还让它对某人有利可图

要是这么傻谁也省不了钱。

看,我现在读了这篇文章,有点畏缩。那我就天真多了。我更了解 AWS ,现在,我现在编码更好,等等。自然。

但我仍然为解决这个问题而感到自豪,特别是因为是这些年纪较大、经验更丰富、无疑是伟大的程序员告诉我不能或不应该这样做的人。是你们给我带来了挑战,所以谢谢你们!

如果可以盈利怎么办?你确定不应该吗?

4

7 回答 7

26

我们最终找到了解决方案,这就是我们必须做的。我将逐步列出这一点,以使那些可能正在寻找类似解决方案的人更容易重新创建它......

  1. 创建一个新的 Spot 请求实例。确保取消选中根设备的“终止时删除”,以便卷在下一步中保留。请务必记下您的实例使用的架构(我们始终使用 x86_64)和内核 ID(非常重要!)
  2. 现在,通过 SSH 连接到您的新实例并创建一个文件或其他内容,这样您就可以直接看到持久化的效果。对文件系统进行一些更改后,继续注销 SSH 连接并终止实例。
  3. 惊人的。现在,转到您的 EC2 Web 控制台并找到用于我们刚刚终止的实例的新卷。右键单击该卷并选择“创建映像”。按照向导进行操作,确保选择我们之前提到的相同架构和内核 ID。
  4. 现在,使用您的新图像启动现场请求向导。按照向导进行操作,再次确保取消选中“终止时删除”。此外,这是一个容易错过的步骤,请确保展开标题为“高级选项”的折叠部分并再次设置正确的内核 ID。

如果您按照上述步骤操作到 T,您将在旧实例终止时所在的同一点拥有一个新实例。因此,我们实现了某种形式的坚持。

于 2013-11-09T00:35:14.863 回答
11

(感谢 Ethan Barron 的一些原创想法。这是一个带有一些更正和澄清的版本。)

[1]。创建一个新的 Spot 实例。停用根设备的“终止时删除”。记下架构 (x86_64) 和内核 ID。

[2]。SSH 进入您的新实例并创建一些文件,这些文件应该在重新启动后仍然存在。不要终止实例。

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

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

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

[6]。根据第 1 步中的架构、第 1 步中的内核 ID 和第 5 步中创建的 AMI 请求新的 Spot 实例。

这应该有效。

于 2014-03-08T04:48:35.093 回答
10

更新:时代变了

EC2 Spot 实例请求现在可以配置为stop代替terminate竞价 Spot 实例或任何其他导致 Spot 实例中断的容量相关事件。

请参阅EC2 开发人员指南中的中断行为。安装了适当的代理后,某些类的实例也可以休眠。

请注意,此新功能并不能保证实例将继续运行,而只是保证它们将在其之前的 EBS 卷、私有 IP、弹性 IP 和实例 ID 都完好无损的情况下重新启动。

之前的回答如下:


Spot实例不能持久化,但 Spot请求可以。

持久性 Spot 请求:当您将 Spot 出价请求指定为“持久性”时,您确保它在其实例被您或 Amazon EC2 终止后自动重新提交,直到您取消出价请求。这使您能够在 Spot 价格低于您的最高价格时自动启动 Spot 实例。

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

这可以让机器在价格范围内随时运行,但至于其余部分,请考虑您的现场实例正在做什么,这会让您认为磁盘的持久性是要走的路。想想“云”。想想“短暂的”。Spot 实例旨在成为启动、获取工作、执行工作、提交工作的临时机器,如果它们消失,工作仍在等待下一个实例再次获取它、完成它并提交它。您“可以”将它们与 EBS 一起使用并保留卷,但如果这样做,这些实例将无法重新启动(如您所见)。

如果您的 AMI 使用实例存储,并存储需要在外部持久保存的所有内容(例如在 S3 中),那么您无需破解 AWS 架构,您可以坐下来看着您的机器在价格上涨时启动是的,做他们的工作,当价格超出范围时再次关闭。而且,一点也不烂,因为每次启动都是一个闪亮的干净系统。

或者,您的实例可以挂载由始终开启的机器导出的 NFS 共享。

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

于 2013-10-25T00:40:17.583 回答
9

如果您使用的是 ubuntu,我找到了一个方便的解决方案。它使用包含在 ubuntu 发行版中的称为“overlayroot”的功能。这个想法是保持根文件系统只读并将所有更改写入 EBS 支持的覆盖文件系统。因为根是只读的,它可以在终止时被删除,并且所有更改都将保留在覆盖文件系统中。

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

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

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

现在创建一个 EBS 卷并将其附加到实例。“Volumes->Actions->Attach Volume”,然后初始化卷。

mkfs.ext4 /dev/xvdf

第一个实例仅用于创建自定义 AMI 和初始化卷,因此可以终止它。在创建自定义映像之前不要附加 EBS 卷,以免它包含在映像中。

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

  1. 启动自定义实例。请务必设置现货价格。
  2. 实例启动后,将覆盖卷附加到 /dev/sdf 上的实例。
  3. 重启您的实例。“实例->操作->实例状态->重启”。登录后,您应该会看到类似这样的内容

    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)

于 2015-12-10T05:16:36.730 回答
3

现场实例的性质是它们是瞬态的,因此您不能使实例“持久”。但是,您可以使用 EBS使数据持久化。

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

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

- 编辑 -

不确定这是否可行 - 因为它会产生额外费用,但您始终可以在生成图像后立即从生成的图像启动实例并终止现有实例。它会产生持久性的错觉,特别是如果您不依赖 EBS 卷来保留数据。

于 2013-10-24T20:49:44.237 回答
2

AWS 最近推出了一个新的 Spot 实例仪表板,让您的实例保持在持久状态变得更加容易。这还包括自动定价和区域支持,因此您不必担心以理想的价格出价。启动实例后,创建实例的 AMI,仅此而已。下次您请求 Spot 实例时,只需从 Saved Instance 列表中选择该实例。内核和 EBS 恢复原样。

于 2016-06-15T07:59:23.997 回答
0

EC2 Spot 支持 EBS 设备的自动恢复https://aws.amazon.com/about-aws/whats-new/2020/01/amazon-ec2-spot-instances-stopped-started-similar-to-on-demand-实例/

于 2020-01-14T17:44:07.520 回答