Настройка реплики MySQL с помощью снимков LVM и rysnc

Если реплика ранее уже была настроена, но необходимо развернуть её повторно, то перед началом работ лучше сохранить права доступа, например, при помощи утилиты pt-show-grants:

# pt-show-grants > grants.sql

Также нам понадобится информация об источнике репликации и пользователе, от имени которого реплика забирает журналы с источника. Эти данные можно взять из файла master.info. Например, вот так можно сохранить адрес исходного сервера, имя пользователя, от имени которого происходит репликация, его пароль и номер порта на исходном сервере, если он отличается от порта по умолчанию 3306:

# awk 'NR>3 && NR<8 { print $0; }' /var/lib/mysql/master.info
192.168.0.101
repl
p4$$w0rd
3306

Подключаемся через консольный клиент MySQL под пользователем root к серверу-источнику, блокируем таблицы и выводим состояние источника:

mysql> FLUSH LOCAL TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.10 sec)

mysql> SHOW MASTER STATUS;
+----------------+----------+--------------+------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------+----------+--------------+------------------+
| bin-log.001038 | 96682764 | nnovgorod    |                  |
+----------------+----------+--------------+------------------+
1 row in set (0.02 sec)

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

# lvcreate -L 100G -s vg0/storage -n storage-snapshot

Возвращаемся к консольному клиенту MySQL и снимаем блокировки с таблиц (или можно просто выйти из клиента):

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

Теперь можно смонтировать снимок:

# mount /dev/vg0/storage-snapshot /mnt/

И скопировать его на удалённый сервер с помощью rsync через SSH-клиента:

# rsync -axv --delete -e 'ssh -i /storage/mysql/.ssh/id_rsa' /mnt/mysql/ mysql@bill1.nnov.ufanet.ru:/failover/storage/mysql.new/

После завершения копирования снимок больше не нужен, его можно размонтировать и удалить:

# umount /mnt
# lvremove vg0/storage-snapshot
Do you really want to remove active logical volume storage-snapshot? [y/n]: y
  Logical volume "storage-snapshot" successfully removed

Из каталога с данными на реплике можно удалить файлы журналов репликации, а также файл auto.cnf, в котором содержится UUID сервера. При совпадении UUID у источника и реплики репликация не запустится с сообщением об ошибке следующего вида:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

Запускаем на реплике сервер MySQL с использованием каталога с данными, скопированными с источника. Восстанавливаем права доступа:

mysql> SOURCE grants.sql
mysql> FLUSH PRIVILEGES;
mysql> FLUSH HOSTS;

Осталось подключиться консольным клиентом MySQL к реплике, указать настройки источника и запустить репликацию:

mysql> CHANGE MASTER TO MASTER_HOST = '192.168.0.101',
                        MASTER_USER = 'repl',
                        MASTER_PASSWORD = 'xxxxxxxxxx',
                        MASTER_LOG_FILE = 'bin-log.001038',
                        MASTER_LOG_POS = 96682764;
mysql> START SLAVE;

За процессом репликации можно наблюдать при помощи команды следующего вида:

# watch "mysql -Be 'SHOW SLAVE STATUS\G' | grep Seconds_Behind_Master"

Она выводит количество секунд, на которое реплика отстаёт от источника. Когда отставание станет нулевым, можно считать реплику полностью синхронизированной с источником. Если же вместо числа выводится значение NULL, то процесс синхронизации по каким-то причинам не активен. Стоит посмотреть на полный вывод запроса SHOW SLAVE STATUS\G.

Источники