Estamos prestes a mudar de uma arquitetura monolítica para um grupo de escala automática e não tenho certeza de como devo executar minhas migrações de banco de dados (Laravel).
Eu estou pensando que um script será executado quando uma nova caixa ficar online, isso irá puxar meu código mais recente. Esse script também deve executar minha migração de banco de dados? Não tenho certeza de como posso executá-lo em apenas uma caixa?
Respostas:
Como você está fazendo suas implantações? O Nuke + reconstrói o ASG (seja um nó de cada vez ou substituindo todo o grupo de uma vez) ou você possui um script que reimplanta todos os seus nós ativos?
E também, como você está acionando suas implantações?
Idealmente, você deseja executar / acionar implantações de algum tipo de servidor de CI, como Bamboo ou Jenkins. Se você estiver fazendo isso, poderá executar suas migrações de banco de dados a partir do servidor de compilação (ou de suas instâncias do agente de compilação de componentes).
Isso permitiria maior controle sobre seu ambiente, pois você poderia, por exemplo, restaurar o banco de dados a partir do instantâneo se a implantação falhar.
fonte
A migração de muitas lojas da orm está no próprio banco de dados, mas se você fizer isso manualmente, também não será difícil criar você mesmo. Basta ter uma tabela "migrationstate" onde todas as migrações executadas são armazenadas. Dessa forma, quando um nó fica on-line, ele pode simplesmente verificar essa tabela na pasta "migrações" local e executar o que está faltando - isso deve causar apenas o primeiro nó após um bump de versão para executar as migrações.
Como observação lateral: o CloudFoundry resolve isso permitindo que cada instância (nó) no seu conjunto de escalas acesse seu identificador. O primeiro obtém 0, o próximo 1 etc. Dessa forma, um nó sabe se é o primeiro e pode executar migrações. Eu não acho que os ASGs tenham o mesmo.
fonte