运行 并行多飞路迁移的最佳策略
Best strategy to run multiple flyway migration in parallel
我想在单个 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 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 的情况下尽快实现数据库迁移的最佳方法是什么?
看来您需要限制并行进程数 运行。目前你将 运行 与模式一样多的进程,在产品中你有 100 个,这样就用完了所有的内存。有很多方法可以实现这一点,包括 pexec
、parallel
甚至 xargs
。我假设您可以访问 xargs
其他人需要安装软件。
mklement0 wrote a great answer 以及如何使用带有 -P 选项的 xargs 的示例:
-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'
我想在单个 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 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
.
在您看来,在不耗尽 ram 的情况下尽快实现数据库迁移的最佳方法是什么?
看来您需要限制并行进程数 运行。目前你将 运行 与模式一样多的进程,在产品中你有 100 个,这样就用完了所有的内存。有很多方法可以实现这一点,包括 pexec
、parallel
甚至 xargs
。我假设您可以访问 xargs
其他人需要安装软件。
mklement0 wrote a great answer 以及如何使用带有 -P 选项的 xargs 的示例:
-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'