Статьи

Репликация в MySQL 5.6: преимущества и ограничения GTID. Часть 1

Это сообщение  написано Стефаном Комбоудоном в блоге MySQL Performance.

Репликация на основе GTIDГлобальные идентификаторы транзакций являются одной из новых функций, касающихся репликации в MySQL 5.6. Они открывают множество возможностей, позволяющих значительно упростить жизнь администраторов баз данных, когда им приходится обслуживать серверы с определенной топологией репликации. Однако вы должны иметь в виду некоторые ограничения текущей реализации. Этот пост является первым из серии статей, посвященных влиянию включения GTID на производственную установку.

В руководстве очень хорошо описано, как перейти к репликации на основе GTID, я не буду повторять это.

В основном шаги:

  • Сделайте мастер доступным только для чтения, чтобы подчиненные устройства могли выполнять все события и были синхронизированы с мастером.
  • Изменить конфигурацию для всех серверов и перезапустить их
  • Используйте CHANGE MASTER TOдля указания всех серверов использовать GTID
  • Отключить режим только для чтения

Эта процедура переключит все ваши серверы с обычной репликации на репликацию GTID. Но если вы работаете с производственной системой, вы, вероятно, захотите постепенно включить репликацию GTID для облегчения отката в случае возникновения проблемы. И некоторые пункты в документации не очень понятны.

Например:

  • Нужно ли перезагружать все серверы одновременно? Мы хотели бы избежать простоев!
  • Нужно ли делать мастер доступным только для чтения?
  • Можем ли мы использовать обычную репликацию для некоторых подчиненных и репликацию GTID для других ведомых одновременно?

Чтобы найти ответ на эти вопросы, давайте создадим простую конфигурацию репликации с одним ведущим и двумя подчиненными, все работают под управлением MySQL 5.6 с отключенными GTID.

Первая попытка: настройте только один из серверов с GTID

Давайте остановим slave # 2, изменим конфигурацию и перезапустим его:

mysql> show slave status\G
[...]
Slave_IO_Running: No
Slave_SQL_Running: Yes
          [...]

Журнал ошибок сообщает нам, почему поток ввода-вывода не запустился:

2013-05-17 13:21:26 3130 [ERROR] Slave I/O: The slave IO thread stops because the master has GTID_MODE OFF and this server has GTID_MODE ON, Error_code: 1593

К сожалению, если вы хотите, чтобы репликация работала правильно, gtid_mode должен быть включен на всех серверах или выключен на всех серверах, но не в середине.

Что если мы попытаемся перенастроить мастер? На этот раз репликация на ведомом устройстве № 1 остановится:

2013-05-17 13:32:08 2563 [ERROR] Slave I/O: The slave IO thread stops because the master has GTID_MODE ON and this server has GTID_MODE OFF, Error_code: 1593

Эти простые тесты отвечают на первые два вопроса: репликация работает, только если все серверы имеют одинаковое значение для gtid_mode, поэтому вы должны перезапустить их одновременно, что лучше всего сделать, сделав мастер доступным только для чтения. Однако «в то же время» означает «в одной и той же позиции бинлога», поэтому вы можете идеально перезапустить серверы один за другим.

Вторая попытка: включены GTID, смешивая обычную репликацию и репликацию GTID

На этот раз мы включим репликацию GTID на ведомом устройстве № 1, но не на ведомом устройстве № 2:

# slave #1
mysql> change master to master_auto_position = 1;
mysql> start slave;

и давайте создадим новую таблицу на мастере:

mysql> create table test.t (id int not null auto_increment primary key);

Выполнение SHOW TABLES FROM testна обоих ведомых устройствах показывает, что таблица была создана везде. Таким образом, как только GTID включены на всех серверах, вы можете иметь несколько подчиненных, использующих позиционирование на основе файлов, и некоторых других подчиненных, использующих позиционирование на основе GTID.

Это отвечает на второй вопрос: у нас могут быть разные режимы репликации на разных серверах, но только если на всех серверах для gtid_mode установлено значение ON. Может быть интересно запустить репликацию на основе файлов, когда gtid_mode включен? Я не могу придумать ни одного варианта использования, поэтому на практике вы, вероятно, будете использовать либо только репликацию на основе файлов (gtid_mode = off для всех серверов), либо только репликацию на основе GTID (gtid_mode = on для всех серверов).

Дополнительный вопрос: как узнать, использует ли ведомое устройство репликацию на основе GTID, проверяя выходные данные SHOW SLAVE STATUS? Посмотрите на последнее поле Auto_Position:

# Slave #1
mysql> show slave status\G
[...]
Auto_Position: 1  -> GTID-based positioning
# Slave #2
mysql> show slave status\G
[...]
Auto_Position: 0  -> File-based positioning

Вывод

Включение репликации на основе GTID может оказаться непростым делом, если ваше приложение с трудом переносит простои или режим только для чтения, особенно если у вас много серверов для перенастройки. Было бы очень хорошо иметь возможность смешивать серверы, где gtid_mode включен, с серверами, где gtid_mode выключен. Это значительно упростит переход к репликации на основе GTID и упростит откат, если что-то пойдет не так.