代码之家  ›  专栏  ›  技术社区  ›  vinni_f

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

  •  2
  • vinni_f  · 技术社区  · 7 年前

    我想在一个mysql实例上运行的遗留系统上升级多个模式。

    在开发中,我使用一个简单的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迁移

    在您看来,在不增加ram的情况下,尽快实现数据库迁移的最佳方法是什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Hamish Carpenter    6 年前

    看起来需要限制并行运行的进程数。目前,您将运行与模式一样多的进程,在prod中,您有100个进程,因此会耗尽所有ram。实现这一点的方法有很多,包括 pexec parallel 甚至 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
    

    $(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'