我一直在玩EC2现场实例,最终的目标是将托pipe网站的标准实例迁移到现场实例(是的,我很清楚,这实际上不是现场实例,但在这种情况下,我相当准备交易价格的可用性)。
然而,我有点惊讶的发现,当价格门槛越过时,现货实例就被终止了,而不是停止,事实上,根本不可能停止现货实例,而只是终止它。
那么:是否有一些(推荐的)方式来获取由实例实例请求产生的实例,以便在创build时将自己与特定的EBS卷相关联,从而使整个机器状态可以简单地在一系列实例实例中前滚? 或者,我从根本上误解了什么是实例?
首先,请允许我澄清几点。 正如您所指出的,现场实例并不是要全天候运行 – 它们旨在以较低的成本在短时间内提供额外的计算能力。 本质上,它们是用于可以分解成小块的任务,因此被终止的实例不会对整体任务产生重大影响。
也就是说,我以前使用现场请求模式运行一个实例 – 它的正常运行时间大概是3个月 – 而且我通常会高出平均市场价格的15倍左右。 虽然这曾经是一个合理的成本效益的方法,但我发现,随着越来越多的人采用相同的技术,价格波动增加到不再有利于保留实例的程度。
平均现货价格趋于围绕中等利用率保留实例的小时成本徘徊。 根据当前的现货价格与大量使用情况进行math计算,得到以下结果:
+-------------+-----------------------------+------------------------------+----------+ | | 1 year | 3 year | Spot | +-------------+-----------------------------+------------------------------+----------+ | Small | $0.016/h + $195 = $0.0383/h | $0.013/h +$300 = $0.0244/h | $0.027/h | | Medium | $0.032/h + $390 = $0.0765/h | $0.026/h+$600 = $0.0488/h | $0.038/h | | Large | $0.064/h + $780 = $0.153/h | $0.052/h + $1200 = $0.0977/h | $0.108/h | | Extra Large | $0.128/h + $1560 = $0.306/h | $0.104/h + $2400 = $0.195/h | $0.216/h | +-------------+-----------------------------+------------------------------+----------+
很明显,在很多情况下,3年的重用率保留实例低于当前的现货价格(受波动影响)。 根据我的经验,实际平均现货价格往往比基准市场价格高出至less50%,因为明显的高峰并不less见。
现在,试着回答你的问题:
你是正确的,现货实例是不能被阻止的 – 在某些方面,它同意现货实例背后的全部前提。 传统上,一个实例将从快照创buildEBS卷,但可以编写连接EBS卷的过程。 我曾经使用这个脚本来设置RAID0中的2个EBS卷(我确信我从我发现的脚本中修改了它,但是现在找不到原来的):
#! /bin/sh # # /etc/init.d/mountec2vol # # chkconfig: 234 20 50 # description: Assigns an EC2 EBS Volume to a device and mounts the device # # To add this as a service run: # /sbin/chkconfig --add mountec2vol # # VARS # VOL1="vol-xxxxxxxa" VOL2="vol-xxxxxxxb" DEV1="/dev/sdh1" DEV2="/dev/sdh2" MOUNT_POINT="/raid" export PS1="[\T] [\W]# " export JAVA_HOME=/usr/java/jre1.6.0_16 export EC2_HOME=/etc/ec2/apitools export PATH=$PATH:$EC2_HOME/bin export EC2_PRIVATE_KEY=/root/.ec2/pk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem export EC2_CERT=/root/.ec2/cert-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem MAX_TRIES=10 # start/stop functions for OS start() { touch /var/lock/subsys/mountec2vol INSTANCE=`curl http://169.254.169.254/latest/meta-data/instance-id 2> /dev/null` CTR=0 /bin/echo "Mounting Elastic Block Store Volumes." ec2-attach-volume $VOL1 -i $INSTANCE -d $DEV1 while [ ! -e "$DEV1" ]; do /bin/sleep 1 CTR=`expr $CTR + 1` if [ $CTR -eq $MAX_TRIES ] then /bin/echo "WARNING: Cannot attach volume $VOL1 to $DEV1 -- Giving up after $MAX_TRIES attempts" exit 1 fi done ec2-attach-volume $VOL2 -i $INSTANCE -d $DEV2 while [ ! -e "$DEV2" ]; do /bin/sleep 1 CTR=`expr $CTR + 1` if [ $CTR -eq $MAX_TRIES ] then /bin/echo "WARNING: Cannot attach volume $VOL2 to $DEV2 -- Giving up after $MAX_TRIES attempts" exit 1 fi done depmod -a modprobe raid0 mdadm --assemble --verbose /dev/md0 /dev/sdh1 /dev/sdh2 if [ ! -d $MOUNT_POINT ]; then mkdir $MOUNT_POINT fi /bin/mount /dev/md0 $MOUNT_POINT } stop() { /bin/echo "Unmounting Elastic Block Store Volumes." rm -f /var/lock/subsys/mountec2vol /bin/umount $MOUNT_POINT mdadm -S /dev/md0 ec2-detach-volume $VOL1 ec2-detach-volume $VOL2 } case "$1" in start) start ;; stop) stop ;; restart) stop sleep 5 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0
这是CentOS的,但我想这很容易适应大多数其他的Linux。 更改Java版本,并删除RAID属性(并更改安装点),你会很好去。 这将被设置为初始化脚本,以便在实例启动时运行。 完成此操作的另一种方法是将EBS卷ID作为实例用户数据传递,这将允许更多的灵活性。
应该指出的是,这当然不适用于根EBS卷 – 这种设置假定一个大部分固定的根卷,数据保存在一个单独的挂载点上。 您始终可以使用--block-device-mapping
参数从ec2-request-spot-instances
设置EBS根卷。
你在找什么可以通过使用他们的API来完成,我不认为有可能使用Amazon提供的自动化来做到这一点。 你必须自己写。 完全可以编写一个脚本来创build一个新的实例,并将一个特定的EBS卷关联到它。
你将无法完成的是迁移完整的机器状态,但是仍然会发生停机,以启动新的现场实例。
看看https://github.com/atramos/ec2-spotter
从自述文件:
EC2-Spotter是一个实用工具,它将两全其美的结合在一起 – 竞价型实例定价与随需应变和预留实例的简单性(持久性EBS文件系统)。 这听起来像是作弊,但显然不是亚马逊服务条款所禁止的。