Лучшая стратегия для параллельного выполнения миграции по нескольким пролетным путям

Я хочу обновить несколько схем в устаревшей системе, работающей на одном экземпляре 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

Эта стратегия отлично работала в dev. В процессе производства я быстро исчерпываю возможности бегуна gitlab, который запускает flyway migrate.

По вашему мнению, что было бы наилучшим способом выполнить миграцию базы данных как можно быстрее, не перегружая память?


person vinni_f    schedule 22.08.2017    source источник


Ответы (1)


Похоже, вам нужно ограничить количество параллельных процессов. В настоящее время вы будете запускать столько процессов, сколько схем, в продукте у вас их 100, чтобы израсходовать всю оперативную память. Есть много способов добиться этого, включая pexec, parallel и даже xargs. Я предполагаю, что у вас есть доступ к xargs остальным, требующим установки программного обеспечения.

mklement0 написал отличный ответ с примерами использования 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'
person Hamish Carpenter    schedule 23.08.2017