tim*_*day 5 amazon-ec2 amazon-ebs
我一直在玩 EC2 Spot 实例,最终目的是将托管网站的标准实例迁移到 Spot 实例(是的,我很清楚这确实不是 Spot 实例的用途,但在这种情况下,我' 已经准备好用价格来换取可用性)。
但是,我有点惊讶地发现,当超过价格阈值时,Spot 实例被终止,而不是停止,并且实际上根本不可能停止 Spot 实例,只能终止它。
那么:是否有一些(推荐的)方法可以让 Spot 实例请求产生的实例在创建时简单地与特定的 EBS 卷相关联,以便完整的机器状态可以简单地在一系列 Spot 实例中前滚?还是我从根本上误解了现场实例的全部内容?
首先,请允许我澄清几点。正如您所指出的,竞价实例并不意味着 24/7 全天候运行 - 它们旨在以较低的成本在短时间内提供额外的计算能力。本质上,它们用于可以分解成小块的任务 - 因此终止的实例不会对整个任务产生重大影响。
也就是说,我之前曾使用 Spot 请求模型运行过一个实例——它通常的正常运行时间约为 3 个月——我通常会出价高于平均市场价格的 15 倍左右。虽然这曾经是一种具有合理成本效益的方法,但我发现随着越来越多的人采用相同的技术,价格波动会增加到与预留实例相比不再具有优势的程度。
平均现货价格往往徘徊在中等利用率预留实例的每小时成本附近。根据当前现货价格与高利用率实例进行数学计算,您会得到以下结果:
+-------------+-----------------------------+------------------------------+----------+
| | 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 |
+-------------+-----------------------------+------------------------------+----------+
Run Code Online (Sandbox Code Playgroud)
很明显,在许多情况下,3 年高利用率预留实例的结果低于当前现货价格(受波动影响)。根据我的经验,实际平均现货价格往往比基准市场价值高出至少 50%,因为大幅上涨并不少见。
现在,实际尝试回答您的问题:
您是正确的,无法停止 Spot 实例 - 在某些方面确实与 Spot 实例背后的整个前提一致。传统上,实例将从快照创建它正在使用的 EBS 卷,但可以编写附加 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
Run Code Online (Sandbox Code Playgroud)
这是针对 CentOS 的,但我想它很容易适应大多数其他 Linux。更改 Java 版本并删除 RAID 属性(并更改挂载点),您就可以开始了。然后将其设置为 init 脚本以在实例启动时运行。完成此操作的另一种方法是将 EBS 卷 ID 作为实例用户数据传递,这将提供更大的灵活性。
应该注意的是,这当然不适用于根 EBS 卷 - 此设置假定根卷大部分是固定的,数据保存在单独的挂载点上。您始终可以ec2-request-spot-instances
使用该--block-device-mapping
参数设置 EBS 根卷。
归档时间: |
|
查看次数: |
3061 次 |
最近记录: |