诀窍让AWS spot实例"持久"?

Eth*_*ron 44 amazon-web-services

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

他希望我做的是写一些会在每X个时间内检查已终止实例的内容,并自动重启它们.更重要的是,他想要某种方式来假装"坚持".我最好的想法是每隔Y时间从每个服务器创建一个图像,然后从该图像启动(如果/当该实例终止时).

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

更新:差不多一年后,我回到这里寻找所有这些精彩的回应,并且比我预期的更多地关注这个话题.以下很多答案虽然内容丰富且有帮助,但却质疑我的推理.我想说,即使在那个时候,我100%同意这不是一个明智的想法,但我的客户要求,尽管我有任何尝试,但要把事情转向更好的方向.

非常感谢你的帮助.我最终确定了如何完全按照自己的意愿行事,并且能够编写一些自动重新启动已终止实例的代码.这从来都不容易,但是当我转移到新客户端时它运作良好.

祝你们中任何一个有同样问题的人好运,你们正在进行(可能通过武力,就像我的情况一样)并不容易.现场请求更便宜,因为这里的一些人提到了他们的回复,特别是因为没有提供持久性.否则,我认为"现货要求"市场的定价会大不相同.

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

更新II:我只想提醒大家,这是我基本上的任务.虽然当时许多人只是驳回了整个概念,但我最终得到了一个或多或少功能的SaaS,允许人们轻松管理和监控所有现场实例,包括启用/禁用自动持续重启的能力.实例,单个实例的调度时间(它们应该或不应该启动它们)等.

虽然我绝对同意,从开发者的角度来看,它是一个不雅的需求,在当时,我并没有想这样做,我还是会说,这是在一个方法挺有意思,被要求到努力工作,因为我不仅学到了很多东西,而且不仅对我的能力和代码有了很大的信心,而且我制作了一个非常有用的东西,据我所知,我的软件非常有价值.客户(即使他们要求错误的东西,因为他们不知道更好).

我试图说服他,但他坚持说,既然他是那个付钱的人,我把注意力集中在那里,不仅完成了许多人在这里被贬低的愚蠢行为,而且使得它对某人有利可图.

如果它愚蠢,就不会保存任何人的钱.

看,我现在读这篇文章并且稍微畏缩一下.那时我更天真.我知道AWS 好多了,现在,我现在代码好多了,等等.当然.

但我仍然为解决这个问题而感到骄傲,特别是因为正是这些同事,年龄更大,经验更丰富,无疑是伟大的程序员,他们告诉我它不能或不应该完成.你是那些对我提出挑战的人,谢谢!

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

Eth*_*ron 26

我们最终找到了解决方案,这就是我们必须做的事情.我将逐步列出这一点,以便为那些可能正在寻找类似解决方案的人重新创建这个...

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

如果您按照上述步骤操作T,您将在旧实例终止时的同一点上有一个新实例.因此,我们已经实现了某种形式的持久性.

  • 我最终走了另一条路.我有一个持久的ebs,我在我的init中提前自动挂载,我需要生存的任何东西都去那里.然后,我只需要在进行系统更新时创建根的快照. (2认同)
  • 你好.AWS已停止为点实例分配内核ID.我在启动实例后检查了相同的内容,它是" - ". (2认同)

Nig*_*com 11

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

[1].创建一个新的专色实例.取消激活根设备的"终止时删除".记下体系结构(x86_64)和内核ID.

[2].SSH进入新实例并创建一些文件,这些文件应该在重新启动后持续存在.不要终止实例.

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

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

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

[6].根据步骤1中的体系结构,步骤1中的内核ID和步骤5中创建的AMI请求新的现场实例.

这应该工作.


小智 9

如果你使用的是ubuntu,我找到了解决这个问题的方便方法.它使用了一个名为'overlayroot'的功能,该功能包含在ubuntu发行版中.我们的想法是将根文件系统保持为只读,并将所有更改写入EBS支持的覆盖文件系统.由于root是只读的,因此可以在终止时删除它,并且所有更改都将保留在overlay文件系统中.

  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
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 启动自定义实例.请务必设置现货价格.
  2. 实例启动后,将覆盖卷附加到/ dev/sdf上的实例.
  3. 重新启动您的实例."Instances-> Actions-> Instance State-> Reboot".登录后,你应该看到这样的东西

    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)


Mic*_*bot 7

更新:时间已经改变

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

请参阅"EC2开发人员指南"中的" 中断行为 ".某些类的实例也可以在安装了适当的代理的情况下休眠.

请注意,此新功能不保证实例将继续运行,而只是保证它们将以其先前的EBS卷,专用IP,弹性IP和实例ID重新启动.

以前的答案如下:


竞价型实例不能持久,但是现货请求可以.

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

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

这使得机器在价格在范围内的任何时候运行,但就其余部分而言,考虑你的现场实例在做什么,你认为磁盘的持久性是要走的路.想想"云".想想"短暂的".竞价型实例旨在成为启动,获取工作,工作,提交工作的短暂机器,如果它们消失,工作仍然在那里等待下一个实例再次获取它,完成它并提交它.您可以"使用"它们与EBS一起使用并保留卷,但如果这样做,则无法重新启动这些实例(正如您所注意到的那样).

如果您的AMI使用实例存储,并存储需要在外部持久化的所有内容(例如,在S3中),那么您不需要破解AWS架构,并且可以坐下来看看您的机器在价格时启动是的,做他们的工作,并在价格超出范围时再次关闭.而且,没有任何腐烂,因为每个靴子都是一个闪亮的清洁系统.

或者,您的实例可以挂载由始终打开的计算机导出的NFS共享.

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