Многопоточный ALTER TABLE с pt-online-schema-change и myloader
pt-online-schema-change эмулирует способ, которым MySQL изменяет внутренне таблицы, но работает с ее копией, которую вы хотите изменить. Он выполняет инструкции INSERT для импорта данных, которые выполняются в одном соединении для заполнения новой таблицы. В этом репозитории есть скрипт myloader_pt-osc.sh, который использует myloader для выполнения параллельных вставок, вместо использования внутренних инструментов pt-online-schema-change, но также использует ее исправленную версию.
Патч pt-online-schema-change
Есть 2 изменения, которые нам нужно выполнить для pt-online-schema-change:
1) иметь возможность остановить выполнение после создания копии таблицы.
2) сообщить pt-online-schema-change, что данные не нужно импортировать.
Мы добавляем параметр –no-data, чтобы сообщить pt-online-schema-change не импортировать данные в новую таблицу. pt-online-schema-change может остановить выполнение с параметром –pause-file. Файл патча содержит код для остановки выполнения при использовании –no-data и –pause-file.
Процедура
Скрипт выполняет несколько задач, основными из которых являются:
- Создание каталога резервных копий в формате, который может использовать myloader.
- Запуск pt-online-schema-change, который будет остановлен после создания новой таблицы и триггеров.
- Запуск выполнения myloader.
- После замены myloader, возобновите pt-online-schema-change, чтобы поменять местами таблицы.
Учтите, что сценарий не предназначен для поддержки первичных ключей с несколькими столбцами или нецелыми числами. Не используйте его в производственных средах без тщательного тестирования.
Задержки
sysbench с 10м строками была создана для выполнения таблицы alter с “engine innodb", которая похожа на таблицу оптимизации, я использовал эти два выполнения, для сравнения:
~/git/myloader_pt-osc/myloader_pt-osc.sh -D sbtest -T sbtest1 --alter 'engine innodb' --chunk-size 10000 -t 10
pt-online-schema-change --alter 'engine innodb' --execute D=sbtest,t=sbtest1 --chunk-size 10000
Размер фрагмента и количество потоков были переменными для создания этих графиков:
На следующем графике показано улучшение в процентах:
Случаи использования
Я считаю, что этот метод или стратегию следует использовать в конкретных сценариях, так как существуют соображения, когда их не следует использовать, например:
- Регулирующий механизм pt-online-schema-change не замедлит вставку, ведомые устройства могут отстать.
- Поскольку предполагается использовать несколько потоков, сервер получит больше нагрузки и не будет иметь механизма для его остановки.
Вывод и ожидание
По сути, это оболочка pt-online-schema-change, которая использует myloader для параллельного выполнения INSERT, что ускоряет изменение таблицы. Это может быть использовано, когда нужно сократить время, и нагрузка не является проблемой.