Назад | Перейти на главную страницу

Galera: медленно запускайте ALTER без блокировки всего сервера

У меня есть 3-узловой кластер galera с несколькими сотнями баз данных, обслуживающих различных клиентов.

Я использую galera только как простой способ справиться с репликацией и падением. На самом деле я не использую сразу несколько мастеров.

Мне нужно запустить довольно дорогой ALTER для некоторых таблиц в каждой базе данных. Как правило, у меня есть сценарий, который запускает сценарий обновления для каждой базы данных, один за другим, и просто отключает каждый сайт по одному.

Но с этим кластером galera любой медленный DDL приводит к полной блокировке всех баз данных, а не только той, с которой он запущен. По сути, это означает, что всякий раз, когда мне нужно запустить обновление, все отключаются от сети на все время, необходимое мне, чтобы запустить обновление для всех.

Я знаю есть wsrep_OSU_method, но изменение этого параметра на RSU имеет собственные проблемы, и я не думаю, что это помогает.

Есть ли способ отключить блокировку? Или, по крайней мере, сделать его блокировкой на уровне базы данных, а не на уровне сервера?

Что, если бы я отключил другие мои узлы в кластере во время выполнения запроса - все равно это приведет к глобальной блокировке? Как я уже сказал, я на самом деле не использую несколько мастеров, поэтому в этом случае, если другие узлы отключены на несколько минут, это нормально (при условии, что происходит обычный автоматический процесс повторного присоединения, когда я их вернул).

Тебе повезло! Percona производит инструмент под названием pt-online-schema-change как раз для такой ситуации.

pt-online-schema-change имитирует способ, которым MySQL изменяет таблицы внутренне, но работает с копией таблицы, которую вы хотите изменить. Это означает, что исходная таблица не заблокирована, и клиенты могут продолжать читать и изменять данные в ней.

pt-online-schema-change работает, создавая пустую копию таблицы для изменения, изменяя ее по желанию, а затем копируя строки из исходной таблицы в новую таблицу. Когда копия завершена, исходная таблица удаляется и заменяется новой. По умолчанию также удаляется исходная таблица.

Хотя он создан Percona, он работает с любым из основных вариантов MySQL.