Добавление нового узла в кластер Percona XtraDB Cluster

Предположим, что база MySQL лежит в /srv/mysql, IP-адрес источника - 192.168.1.1, IP-адрес приемника - 192.168.1.2.

На источнике и приемнике должны быть установлены пакеты percona-xtrabackup, socat и pigz, а версии Percona XtraDB Cluster должны быть одинаковыми.

Конфигурацию Percona XtraDB Cluster для нового узла можно взять с источника, главное - правильно настроить переменные, касающиеся Writeset Replication. В случае, если мы имеем дело с deb-пакетом, файл конфигурации сервера MySQL находится в файле /etc/mysql/percona-xtradb-cluster.conf.d/mysqld.cnf, а настройки репликации находятся в файле /etc/mysql/percona-xtradb-cluster.conf.d/wsrep.cnf.

Важно! На источнике выполняем команду:

SET GLOBAL wsrep_provider_options="gcache.freeze_purge_at_seqno = now";

Эта команда отключит удаление Writeset'ов из журналов Galera. Если этого не сделать, то к моменту окончания снятия резервной копии записи в этом файле устареют и новый узел кластера не сможет догнать источник по IST.

На приемнике запускаем команду:

# socat -u TCP-LISTEN:4444,reuseaddr stdio | pigz -dc -p 4 - | xbstream —p 4 -x -C /srv/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

Дожидаемся завершения запущенных команд. Если резервное копирование прервалось, то повторять нужно с пункта 3.

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

# xtrabackup --use-memory=1G --prepare --target-dir=/srv/mysql
# chown -R mysql:mysql /srv/mysql

Далее заглядываем на приёмнике в файл /srv/mysql/xtrabackup_galera_info. В нём в одной строчке через двоеточие указаны UUID кластера и номер последовательности Writeset'а. Пусть это будут UUID "d2270c6d-3195-11e7-a33c-12e6ebfb7267" и "46050303461" соответственно.

Создаём на приёмнике файл /srv/mysql/grastate.dat со следующим содержимым:

# GALERA saved state
version: 2.1
uuid:    d2270c6d-3195-11e7-a33c-12e6ebfb7267
seqno:   46050303461
cert_index:

И выставим права доступа:

# chmod u=rw,g=r,o= /srv/mysql/grastate.dat
# chown mysql:mysql /srv/mysql/grastate.dat

Запускаем MySQL на приемнике. Заглядываем в журнал. В журнале должно быть написано, что новый узел присоединился к кластеру и начал синхронизацию по IST.

Отслеживаем состояние синхронизации по журналу и по выводу команды:

# mysql -Bse "SHOW GLOBAL STATUS LIKE 'wsrep%'" | egrep 'state|status'

Когда синхронизация завершится, переменная статуса wsrep_local_state_comment в выводе предыдущей команды примет значение "Synced", а переменная wsrep_cluster_status - значение "Primary".

При успешном завершении синхронизации на источнике выполняем команду:

SET GLOBAL wsrep_provider_options="gcache.freeze_purge_at_seqno = -1";

Кэш Galera вернётся в нормальный режим, а временные файлы с Writeset'ами, созданными во время создания резервной копии и настройки нового узла, будут удалены.

Использованные материалы