Назад | Перейти на главную страницу

Как перенести стандартный инстанс EC2 + EBS на спотовый инстанс?

Я играл со спотовыми инстансами EC2 с конечной целью переноса стандартного инстанса, на котором размещен веб-сайт, на спотовый инстанс (да, я хорошо понимаю, что спотовые инстансы не для этого, но в данном случае я вполне готов променять цену на наличие).

Тем не менее, я был немного удивлен, обнаружив, что при пересечении ценового порога спотовый экземпляр завершается, а не останавливается, и действительно, что просто невозможно остановить спотовый экземпляр, только чтобы завершить его.

Итак: существует ли какой-либо (рекомендуемый) способ создать экземпляры, порожденные запросами на точечные экземпляры, чтобы просто связать себя с определенным томом EBS при создании, чтобы можно было просто выполнить откат полного состояния машины для ряда спотовых экземпляров? Или я в корне неправильно понимаю, что такое спотовые инстансы?

Во-первых, позвольте мне прояснить несколько моментов. Как вы отметили, спотовые инстансы не предназначены для работы в режиме 24/7 - они предназначены для обеспечения дополнительных вычислительных мощностей на короткий промежуток времени по более низкой цене. По сути, они предназначены для задач, которые можно разбить на небольшие части, поэтому завершенный экземпляр не окажет существенного влияния на общую задачу.

Тем не менее, я ранее запускал инстанс, используя модель спотового запроса - его обычное время безотказной работы составляло около 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 |
+-------------+-----------------------------+------------------------------+----------+

Очевидно, что во многих случаях зарезервированная трехлетняя инстанция для интенсивного использования работает по цене ниже текущей спотовой цены (которая подвержена волатильности). Исходя из моего опыта, фактическая средняя спотовая цена имеет тенденцию быть как минимум на 50% выше, чем базовая рыночная стоимость, поскольку значительные скачки не являются редкостью.

Теперь, чтобы попытаться ответить на ваш вопрос:

Вы правы в том, что спотовые экземпляры невозможно остановить - в некотором смысле это согласуется со всей предпосылкой, лежащей в основе спотовых экземпляров. Традиционно экземпляр создает том (ы) EBS, которые он использует, из моментальных снимков, но можно создать сценарий для процесса подключения тома EBS. Я использовал этот сценарий для установки 2 томов EBS в RAID0 (я почти уверен, что модифицировал его из какого-то найденного мной сценария, но в настоящий момент я не могу найти оригинал):

#! /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 в качестве пользовательских данных экземпляра, что обеспечит большую гибкость.

Следует отметить, что это, конечно, не будет работать для корневого тома EBS - эта настройка предполагает в основном фиксированный корневой том с данными, хранящимися в отдельной точке монтирования. Вы всегда можете установить корневой том EBS из ec2-request-spot-instances используя --block-device-mapping параметр.

То, что вы ищете, может быть выполнено с помощью их API, Я не думаю, что для этого можно использовать автоматизацию, поставляемую Amazon. Вы должны написать это сами. Вполне возможно написать сценарий для создания нового спотового экземпляра и связать с ним определенный том EBS.

Что вы не сможете сделать, так это перенести полное состояние машины, у вас все равно будут сбои для запуска новых спотовых инстансов.

Проверять, выписываться https://github.com/atramos/ec2-spotter

Из README:

EC2-Spotter - это утилита, объединяющая лучшее из обоих миров - ценообразование на спотовые инстансы с простотой (постоянная файловая система EBS) инстансов по запросу и зарезервированных инстансов. Это звучит как обман, но, видимо, не запрещено Условиями обслуживания Amazon.