Thank you for reading this post, don't forget to subscribe!
Часто сервер MySQL необходимо включить в реплику прямо во время его работы без всяких пауз и даунтаймов самого приложения. Сделать это можно с помощью утилиты Xtrabackup. Весь процесс занимает 3 шага:
1. Настройка мастера
Этот пункт нужно пропустить, если мастер уже настроен. Это нужно сделать только один раз. Логинимся на мастер сервер и добавляем в секцию [mysql] конфига my.cnf:
1 2 3 4 |
server-id = 1 binlog-format = mixed log-bin = mysql-bin sync_binlog = 1 |
После этого перезапускаем сервер (команды выполняем на мастере):
1 |
/etc/init.d/mysql restart |
Мы включили бинарные логи, которые нужны для работы репликации. Это единственная перезагрузка, которая понадобится за весь процесс. Далее устанавливаем права доступа для реплики:
1 |
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'10.10.0.2' IDENTIFIED BY 'BZLVT3BthaEB'; |
# 10.10.0.2 — ip сервера, который будет служить слейвом
2. Копирование данных
Готовим данные для копирования (команды выполняем на мастере):
1 |
innobackupex --user=root --password=pwd /root |
# самая медленная операция
Накатываем лог на данные в созданной папке (например, /root/2019-02-09_21-02-52)
1 |
innobackupex --user=root --password=pwd --apply-log /root/2019-02-09_21-02-52 |
# пройдет в несколько раз быстрее, чем предыдущая
Копируем эту же папку на слейв:
1 |
scp -r /root/2019-02-09_21-02-52 root@10.2.0.2:/root/master |
MySQL нового слейва должен быть остановлен. Готовим данные (команды выполняем на слейве):
1 2 3 4 5 |
rm -rf /var/lib/mysql mv /root/master /var/lib/mysql chown -R mysql:mysql /var/lib/mysql /etc/init.d/mysql start |
3. Включение репликации
Перед включением выясняем название и позицию бинарного лога:
1 |
cat /var/lib/mysql/xtrabackup_binlog_info |
Результат будет иметь такой вид:
1 |
mysql-bin.000001 15386388 |
После этого выполняем такой MySQL-запрос на слейве используя эти данные:
1 2 3 |
CHANGE MASTER TO MASTER_HOST='10.10.0.1', MASTER_USER='replica', MASTER_PASSWORD='BZLVT3BthaEB', MASTER_LOG_FILE='<b>mysql-bin.000001</b>', MASTER_LOG_POS=<b>15386388</b>; |
# 10.10.0.1 — ip нашего мастера
И еще один запрос тут же для запуска реплики:
1 |
SLAVE START; |
Проверяем статус репликации:
1 |
SHOW SLAVE STATUS\G |
1 2 3 4 5 6 7 |
... Slave_IO_Running: <b>Yes</b> ... Slave_SQL_Running: <b>Yes</b> ... <b>Seconds_Behind_Master: 13</b> ... |
# Все хорошо и реплика работает
Ждем пока Seconds_Behind_Master станет стремиться к нулю
===============================================
Xtrabackup — это необходимый инструмент для создания горячих бэкапов MySQL. Инструмент создает резервную копию сервера (т.е. всех баз данных сразу) без блокировок и остановок. Устанавливается из пакетов:
1 |
yum install percona-xtrabackup |
Если нет в пакетах.
Создание резервной копии
Сначала копируем файлы текущего сервера с помощью команды:
1 |
innobackupex --user=root --password=pwd /var/backups |
В папке /var/backups будет создана подпапка с текущей датой (например, 20201010132431). После этого необходимо накатить лог изменений на файл данных:
1 |
innobackupex --user=root --password=pwd --apply-log /var/backups/20201010132431 |
Теперь эту папку можно сохранить на резервный сервер и ждать случая для использования.
Восстановление
Для восстановления достаточно скопировать бэкап в папку данных MySQL (параметр datadir в my.cnf):
1 2 3 4 5 |
/etc/init.d/mysql stop mv /var/lib/mysql /var/lib/mysql.old <b>mv /var/backups/db/20201010132431 /var/lib/mysql</b> chown -R mysql:mysql /var/lib/mysql /etc/init.d/mysql start |
Периодическое копирование
Резервирование лучше добавить в cron и выполнять раз в час (день, если база занимает более 10Гб):
1 2 3 4 5 6 |
rm -rf /var/backups/db.prev mv /var/backups/db /var/backups/db.prev innobackupex --user=root --password=pwd /var/backups d="/var/backups/db/`ls /var/backups/db`" innobackupex --user=root --password=pwd --apply-log $d |