Estamos a punto de pasar de una arquitectura monolítica a un grupo autoescalado y no estoy seguro de cómo debería ejecutar las migraciones de mi base de datos (Laravel).
Estoy pensando que se ejecutará una secuencia de comandos cuando se active un nuevo cuadro, esto hará que mi último código baje. ¿Debería este script también ejecutar la migración de mi base de datos? No estoy seguro de cómo puedo ejecutarlo en una sola caja.
Respuestas:
¿Cómo estás haciendo tus despliegues? Nuke + reconstruye el ASG (ya sea un nodo a la vez, o reemplazando todo el grupo a la vez), o ¿tiene un script que redistribuya todos sus nodos activos?
Y también, ¿cómo está activando sus implementaciones?
Idealmente, desea ejecutar / activar implementaciones desde alguna forma de servidor CI como Bamboo o Jenkins. Si está haciendo esto, puede ejecutar sus migraciones de base de datos desde el servidor de compilación (o sus instancias de agente de compilación de componentes).
Esto le permitiría un mayor control sobre su entorno, ya que podría, por ejemplo, restaurar la base de datos desde la instantánea si falla la implementación.
fuente
El estado de migración de muchas tiendas de orm en la base de datos en sí, pero si lo hace 'manualmente' tampoco es difícil de construir. Simplemente tenga una tabla de "estado de migración" donde se almacenan todas las migraciones ejecutadas. De esa manera, cuando un nodo se conecta, simplemente puede verificar esa tabla con su carpeta local de "migraciones" y ejecutar lo que falta: esto debería causar que solo su primer nodo después de un golpe de versión ejecute las migraciones.
Como nota al margen: CloudFoundry resuelve esto permitiendo que cada instancia (nodo) en su conjunto de escalas acceda a su identificador. El primero obtiene 0, el siguiente 1, etc. De esa manera, un nodo sabe si es el primero y puede ejecutar migraciones. No creo que los ASG tengan lo mismo.
fuente