Como migrar uma instância padrão do EC2 + EBS para a instância spot?

5

Eu tenho jogado com instâncias spot do EC2, com o objetivo final de migrar uma instância padrão hospedando um site para uma instância spot (sim, estou bem ciente de que isso realmente não é o que instâncias spot são, mas em Neste caso, estou bastante preparado para negociar preço por disponibilidade).

No entanto, fiquei um pouco surpreso ao descobrir que, quando o limite de preço é ultrapassado, a instância spot é encerrada, não interrompida e, na verdade, simplesmente não é possível interromper uma instância pontual, apenas para finalizá-la.

Portanto: há alguma maneira (recomendada) de obter as instâncias geradas por solicitações de instância spot para simplesmente se associarem a um volume EBS específico na criação, para que o estado completo da máquina possa ser simplesmente transferido para uma série de instâncias spot? ? Ou estou fundamentalmente entendendo mal o que são as instâncias pontuais?

    
por timday 12.03.2012 / 02:47

3 respostas

5

Primeiramente, permita-me esclarecer alguns pontos. Como você observou, as instâncias spot não devem funcionar 24 horas por dia, 7 dias por semana - elas têm a finalidade de fornecer capacidade de computação extra por um curto período de tempo a um custo menor. Essencialmente, eles são destinados a tarefas que podem ser divididas em pequenos pedaços - portanto, uma instância finalizada não terá um impacto significativo na tarefa geral.

Antes disso, executei anteriormente uma instância usando o modelo de solicitação spot - seu tempo de atividade normal era de cerca de 3 meses - e costumava fazer overbid em cerca de 15x o preço médio de mercado. Enquanto isso costumava ser uma abordagem razoavelmente econômica, descobri que, à medida que mais pessoas empregavam a mesma técnica, a volatilidade dos preços aumentava a ponto de não ser mais vantajosa em relação a uma instância reservada.

O preço spot médio tende a pairar em torno do custo por hora de uma instância reservada de média utilização. Fazendo as contas com base nos atuais preços spot versus instâncias de utilização pesada, você obtém o seguinte:

+-------------+-----------------------------+------------------------------+----------+
|             |           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 |
+-------------+-----------------------------+------------------------------+----------+

É evidente que, em muitos casos, a instância reservada de utilização pesada de 3 anos funciona para menos do que o preço à vista atual (que está sujeito à volatilidade). Pela minha experiência, o preço spot médio real tende a ser pelo menos 50% superior ao valor de mercado de referência, já que picos significativos não são incomuns.

Agora, para tentar responder à sua pergunta:

Você está certo de que instâncias pontuais não podem ser interrompidas - de alguma forma que concorda com toda a premissa por trás das instâncias pontuais. Tradicionalmente, uma instância criará o (s) volume (s) EBS que está usando a partir de capturas instantâneas, mas é possível fazer o script do processo de anexar um volume do EBS. Eu usei este script para configurar 2 volumes do EBS em um RAID0 (tenho certeza que eu o modifiquei de algum script que encontrei, mas não consigo encontrar o original no momento):

#! /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 

Isso foi para o CentOS, mas imagino que seria fácil se adaptar à maioria dos outros Linuxes. Altere a versão do Java e remova os atributos RAID (e altere o ponto de montagem) e você estará pronto. Isso seria configurado como um script de inicialização para ser executado quando a instância for iniciada. Uma maneira alternativa de realizar isso seria passar os IDs de volume do EBS como dados do usuário da instância, o que permitiria muito mais flexibilidade.

Deve-se notar que isso, obviamente, não funcionará para o volume raiz do EBS - essa configuração presume um volume de raiz fixo, com dados mantidos em um ponto de montagem separado. Você sempre pode definir o volume da raiz do EBS de ec2-request-spot-instances usando o --block-device-mapping parâmetro.

    
por 12.03.2012 / 03:47
1

O que você está procurando pode ser realizado pelo uso da API deles , Eu não acho que é possível usar a automação fornecida pela Amazon para fazer isso. Você tem que escrever você mesmo. É perfeitamente possível escrever um script para criar uma nova instância spot e associar um volume específico do EBS a ele.

O que você não conseguirá fazer é migrar todo o estado da máquina, e ainda sofrerá interrupções para ativar novas instâncias pontuais.

    
por 12.03.2012 / 02:57
1

Confira o link

Do README:

EC2-Spotter is a utility that brings together the best of both worlds -- Spot Instance pricing with the simplicity (persistent EBS filesystem) of On Demand & Reserved Instances. This sounds like cheating, but apparently is not forbidden by the Amazon Terms Of Service.

    
por 31.12.2016 / 18:18