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