Как восстановить MySQL репликацию без выключения?

Часто сервер MySQL необходимо включить в реплику прямо во время его работы без всяких пауз и даунтаймов самого приложения. Сделать это можно с помощью утилиты Xtrabackup. Весь процесс занимает 3 шага:

1. Настройка мастера

Этот пункт нужно пропустить, если мастер уже настроен. Это нужно сделать только один раз. Логинимся на мастер сервер и добавляем в секцию [mysql] конфига my.cnf:

server-id = 1
binlog-format = mixed
log-bin = mysql-bin
sync_binlog = 1

После этого перезапускаем сервер (команды выполняем на мастере):

/etc/init.d/mysql restart

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

GRANT REPLICATION SLAVE ON *.*  TO 'replica'@'10.10.0.2' IDENTIFIED BY 'BZLVT3BthaEB';

# 10.10.0.2 — ip сервера, который будет служить слейвом

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

Готовим данные для копирования (команды выполняем на мастере):

innobackupex --user=root --password=pwd /root

# самая медленная операция

Накатываем лог на данные в созданной папке (например, /root/2019-02-09_21-02-52)

innobackupex --user=root --password=pwd --apply-log /root/2019-02-09_21-02-52

# пройдет в несколько раз быстрее, чем предыдущая

Копируем эту же папку на слейв:

scp -r /root/2019-02-09_21-02-52 root@10.2.0.2:/root/master

MySQL нового слейва должен быть остановлен. Готовим данные (команды выполняем на слейве):

rm -rf /var/lib/mysql
mv /root/master /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql

/etc/init.d/mysql start

3. Включение репликации

Перед включением выясняем название и позицию бинарного лога:

cat /var/lib/mysql/xtrabackup_binlog_info

Результат будет иметь такой вид:

mysql-bin.000001	15386388

После этого выполняем такой MySQL-запрос на слейве используя эти данные:

CHANGE MASTER TO MASTER_HOST='10.10.0.1',
MASTER_USER='replica', MASTER_PASSWORD='BZLVT3BthaEB',
MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=15386388;

# 10.10.0.1 — ip нашего мастера

И еще один запрос тут же для запуска реплики:

SLAVE START;

Проверяем статус репликации:

SHOW SLAVE STATUS\G
...
Slave_IO_Running: Yes
...
Slave_SQL_Running: Yes
...
Seconds_Behind_Master: 13
...

# Все хорошо и реплика работает

Ждем пока Seconds_Behind_Master станет стремиться к нулю.


Подпишитесь на Хайлоад с помощью Google аккаунта
или закройте эту хрень