Настройка реплики 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

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

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

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

CHANGE MASTER TO MASTER_HOST = '192.168.1.1',
                 MASTER_USER = 'repl',
                 MASTER_PASSWORD = 'password',
                 MASTER_LOG_FILE = 'bm3-bin.000126',
                 MASTER_LOG_POS = 1038494360;
START SLAVE;

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

$ mysql -Bse 'show slave status\G'