并行运行多个flyway迁移的最佳策略
我想在一个mysql实例上运行的遗留系统上升级多个模式 在开发中我有大约10个模式,而在生产中我有大约100个模式 在开发过程中,我使用一个简单的bash循环为每个模式启动一个并行运行多个flyway迁移的最佳策略,flyway,Flyway,我想在一个mysql实例上运行的遗留系统上升级多个模式 在开发中我有大约10个模式,而在生产中我有大约100个模式 在开发过程中,我使用一个简单的bash循环为每个模式启动一个flyway migrate: schemas=$(echo "SET SESSION group_concat_max_len=8192; select GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') from information_schema.SCHEMATA where SCHEM
flyway migrate
:
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
这个策略在开发中运行得很好。在生产中,我很快将运行flyway migrate
的gitlab runner的ram最大化
在您看来,在不耗尽ram的情况下尽可能快地实现数据库迁移的最佳方法是什么?看起来您需要限制并行运行的进程数。目前,您将运行与模式一样多的进程,在prod中,您有100个进程,这样就耗尽了所有ram。实现这一点的方法有很多,包括
pexec
,parallel
甚至xargs
。我假设您可以访问xargs
其他人需要安装软件
编写了一个示例,介绍如何将xargs与-p选项结合使用:
-P, --max-procs=MAX-PROCS Run up to max-procs processes at a time
编辑:在使用-p进行实验后使用示例进行更新
此命令演示-p:
echo -e "a\nb\nc\nd\n" | xargs -i -P 2 sh -c 'touch {}.log; sleep 3;'
ls --full-time
使用flyway尝试此命令:
$(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'