Tenho a seguinte configuração: 1 servidor com aplicação X, que roda um crontab uma vez por hora. O crontab se conecta ao banco de dados e executa alguns cálculos pesados, exporta dados para um arquivo de dados especial e reinicia o aplicativo. A exportação pode durar de 10 a 40 minutos.
Eu quero:
Mova esse servidor para AWS e use o grupo de escalonamento automático.
O crontab deve ser executado em apenas um servidor, fazer o cálculo, exportar os dados e de alguma forma sincronizá-los com todos os outros servidores ativos.
Todos os servidores devem detectar automaticamente os novos dados e reiniciar-se com segurança (não durante a sincronização, por exemplo).
Novos servidores iniciados a partir dos grupos de escalonamento automático mostram a busca automática dos arquivos de dados na inicialização, antes de iniciar o aplicativo real.
Não tenho uma ideia "simples" de como fazer isso ou de qualquer solução específica da AWS.
Esta é a minha ideia:
Execute um servidor fora do grupo de escalonamento automático. Execute o crontab apenas nesse servidor. Todos os arquivos de dados serão carregados no S3.
Todos os servidores de escalonamento automático terão um crontab que é executado a cada minuto e verifica um arquivo exclusivo "please_download_me_TIMESTAMP"
Assim que os arquivos forem baixados, o script reiniciará o serviço.
Se um novo servidor for iniciado, na inicialização ele irá buscar automaticamente todos os arquivos do S3.
Você acha que isso funcionaria?
Responder1
Este é um problema comum no AWS EC2 e foi resolvido. Verhttps://gist.github.com/kixorz/5209217para um exemplo com implementação.
Responder2
Reconhecer que esta é uma pergunta antiga de 2015, respondida por Joe, então é melhor respondê-la.
Se o trabalho for uma vez por hora e levar de 10 a 40 minutos, você estará pagando por uma hora inteira de qualquer maneira. Não faz sentido iniciar e desligar servidores, apenas deixe um servidor em execução.
Se fosse com menos frequência, você poderia ter um evento cronometrado que colocasse uma mensagem em uma fila SQS - isso poderia ser feito por um t2.nano ou talvez haja uma maneira mais barata de fazer isso com os serviços da Amazon - Lambda? Escala automática com base no tamanho da fila. Quando há dados a serem processados, um servidor é criado, processa os dados, move-os para onde for necessário e depois desliga-se.
Outra maneira de fazer isso seria o escalonamento baseado no tempo, mas novamente apenas se fosse com menos frequência do que por hora.