2017-08-22 1 views
1

Je souhaite mettre à niveau plusieurs schémas sur un système hérité s'exécutant sur une seule instance mysql.Meilleure stratégie pour exécuter plusieurs migrations de voies de migration en parallèle

En développement, j'ai ~ 10 schémas, alors qu'en production j'ai environ 100 schémas.

Dans le développement que j'utilisais simple boucle bash pour démarrer une flyway migrate pour chaque schéma:

schemas=$(echo "SET SESSION group_concat_max_len=8192; select GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') from information_schema.SCHEMATA where SCHEMA_NAME like 'FOO_%'" | mysql -h$DB_URL -P$DB_PORT -u$DB_USER -p$DB_PASSWORD -sN) 
for schema in $schemas; do 
    echo "Starting Migration for : $schema" 
    flyway -configFile=src/flyway.conf -user=$DB_USER -password=$DB_PASSWORD -url="jdbc:mysql://$DB_URL:$DB_PORT" -schemas=$schema -locations=filesystem:src/schema/ migrate 2>&1 | tee $schema.log & 
done 

Cette stratégie fonctionnait très bien dans dev. En production, je mors rapidement le bélier du coureur gitlab qui court le flyway migrate. À votre avis, quelle serait la meilleure façon de réaliser la migration de la base de données aussi vite que possible sans pour autant sortir le bélier de la base de données?

Répondre

0

Il semble que vous deviez limiter le nombre de processus exécutés en parallèle. Actuellement vous allez exécuter autant de processus que de schémas, en prod vous en avez 100 donc ça consomme tout le ram. Il y a beaucoup de manières de réaliser ceci comprenant pexec, parallel et même xargs. Je suppose que vous avez accès à xargs les autres ont besoin de logiciels à installer.

mklement0 a écrit un great answer avec des exemples sur la façon d'utiliser xargs avec l'option -P:

-P, --max-procs=MAX-PROCS Run up to max-procs processes at a time 

EDIT: Mise à jour de l'exemple après avoir expérimenté -P.

Cette commande démontre -P:

echo -e "a\nb\nc\nd\n" | xargs -i -P 2 sh -c 'touch {}.log; sleep 3;' 
ls --full-time 

Essayez cette commande avec des voies de migration:

$(echo "SET SESSION group_concat_max_len=8192; select GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') from information_schema.SCHEMATA where SCHEMA_NAME like 'FOO_%'" | mysql -h$DB_URL -P$DB_PORT -u$DB_USER -p$DB_PASSWORD -sN) | xargs -i -P 10 sh -c 'echo "Starting Migration for : {}"; flyway -configFile=src/flyway.conf -user=$DB_USER -password=$DB_PASSWORD -url="jdbc:mysql://$DB_URL:$DB_PORT" -schemas={} -locations=filesystem:src/schema/ migrate 2>&1 | tee {}.log'