并行运行多个飞路迁移的最佳策略

时间:2017-08-22 15:27:34

标签: 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 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运行器的内存。

在您看来,在没有最大化ram的情况下,尽可能快地实现数据库迁移的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

看起来您需要限制并行运行的进程数。目前,您将运行与模式一样多的进程,在prod中您有100个,因此占用了所有内存。实现此目标的方法有很多,包括pexecparallel甚至xargs。我假设您可以访问xargs其他人需要安装的软件。

mklement0写了一个great answer,其中包含如何将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'