Настройка реплики MySQL с помощью xtrabackup

Содержание

Подготовка источника

Во-первых, на источнике должно быть все готово для включения репликации: включен binlog на достаточное время (например, 1 сутки), формат лога - ROW. Если источник является членом кластера xtradb, то должна быть включена настройка log_slave_updates:

[mysqld]
server_id = X
log_slave_updates
binlog_format = ROW
log_bin = <binlog basename>

Во-вторых, на источнике и приемнике должны быть установлены пакеты percona-xtrabackup, socat и pigz.

В-третьих, нужно определиться с каталогом, куда будем лить данные. Если сразу в /var/lib/mysql, то на приемнике нужно остановить сервер MySQL. В дальнейшем для определенности будем считать что выбран каталог /var/lib/mysql, а IP-источинка приемника - 192.168.1.2 (он используется в команде, выполняемой на источнике). IP-адрес источника для определенности положим 192.168.1.1.

В-четвертых, желательно сохранить логин и пароль для пользователя, от имени которого осуществляется репликация. Их можно подсмотреть в файле /var/lib/mysql/master.info на источнике. Проще всего перед началом заливки новых данных просто скопировать файл куда-нибудь в укромное место. Для примера положим имя пользователя "repl" и пароль "password".

В-пятых, версия сервера MySQL на приемнике не должна быть ниже, чем на источнике. Выше - можно, но желательно иметь одинаковые мажорные версии.

Копирование данных

На приемнике запускаем команду:

# socat -u TCP-LISTEN:4444,reuseaddr stdio | pigz -dc -p 4 - | xbstream -p 4 -x -C /var/lib/mysql

На источнике запускаем команду:

# xtrabackup --defaults-file=/root/.my.cnf --open-files-limit=100000 --backup --stream=xbstream --parallel 4 --no-timestamp --target-dir=/tmp | pigz -k -1 -p4 - | socat -u stdio TCP:192.168.1.2:4444

Ждем окончания процесса. Если процесс бекапа по каким-то причинам прервался, необходимо начать с шага 1, т.к. на применике socat завершается после завершения коннекта. Все дальнейшие шаги выполняем только на приемнике. С источника лучше выйти вообще, чтобы случайно там ничего не испортить.

На приемнике готовим каталог с данными для запуска сервера MySQL:

# xtrabackup --use-memory=1G --prepare --target-dir=/var/lib/mysql
# chown -R mysql:mysql /var/lib/mysql

Запускаем сервер MySQL на приемнике. Если версии сервера MySQL на источнике и приемнике не совпадают, то потребуется запустить команду mysql_upgrade, после которой обязательно перезапустить сервер MySQL.

Настройка репликации

На приемнике смотрим /var/lib/mysql/xtrabackup_binlog_pos_innodb. Это простой текстовый однострочный файл. Нас интересуют первые два поля. Первое поле - это имя лог-файла на источнике, а второе - позиция в этом файле. С нее мы начнем репликацию. Для примера положим эти поля равными "bin-log.009578" и 1020556956 соответственно.

Собственно, запуск репликации. На этом шаге у нас есть логин и пароль пользователя репликации и позиция в файле на источнике, с которой начнем репликацию. Запускаем на приемнике консольный клиент mysql, вводим команды:

CHANGE MASTER TO MASTER_HOST = '192.168.1.1',
                 MASTER_USER = 'repl',
                 MASTER_PASSWORD = 'password',
                 MASTER_LOG_FILE = 'bin-log.009578',
                 MASTER_LOG_POS = 1020556956;
START SLAVE;

Настройка репликации по GTID

Если на сервере-источнике была настроена запись глобальных идентификаторов транзакций в журнал, то в файле /var/lib/mysql/xtrabackup_binlog_info, по сравнению с файлом /var/lib/mysql/xtrabackup_binlog_pos_innodb, будет дополнительное поле - GTID, с которой нужно продолжить репликацию:

bin-log.009578  1020556956  2dd8f392-ce6a-ee18-5cc3-ed1914048d98:1-6533716360,
d4ee4813-079f-ee11-4d66-d093339ebf17:1-244581749

Для настройки репликации нужно сначала указать идентификатор транзакции из этого файла с помощью следующих команд:

SET SESSION wsrep_on = 0;
RESET MASTER;
SET SESSION wsrep_on = 1;
SET GLOBAL gtid_purged = '2dd8f392-ce6a-ee18-5cc3-ed1914048d98:1-6533716360,d4ee4813-079f-ee11-4d66-d093339ebf17:1-244581749';

Если в файле /var/lib/mysql/xtrabackup_binlog_info есть несколько идентификаторов, разделённых запятыми в нескольких строчках, то подставить в команду нжуно их все.

Далее можно настроить и запустить репликацию с автоматическим позиционированием:

CHANGE MASTER TO MASTER_HOST = '192.168.1.1',
                 MASTER_USER = 'repl',
                 MASTER_PASSWORD = 'password',
                 MASTER_AUTO_POSITION = 1;
START SLAVE;

Отслеживание состояния репликации

Репликация запустится и реплика начнёт догонять источник. Текущее состояние можно посмотреть на реплике командой:

$ mysql -Bse 'SHOW SLAVE STATUS\G'

Использованные материалы