Настройка Percona XtraDB Cluster (3 узла) на Debian 8
Зачем нужен трёхузловой кластер и что такое quorum
Трёхузловая конфигурация обеспечивает возможность автоматически определить, какая часть кластера имеет актуальные данные при разрыве связи между узлами. Чётность количества узлов важна, чтобы избежать ситуации «split brain» — когда две изолированные части кластера принимают независимые записи, и при восстановлении соединения непонятно, какая версия данных правильная.
Quorum — минимальное число узлов, необходимое для определения корректной стороны. Для трёх узлов quorum = 2. Это значит, что всегда должны быть подключены по крайней мере два узла. Если все три узла окажутся недоступными одновременно, потребуется ручная выборка узла для загрузки кластера (bootstrap).
Важно: multicast/heartbeat и корректные записи в /etc/hosts облегчают обнаружение и соединение узлов.
Кому полезна эта инструкция
- DBA и инженерам DevOps, которым нужен высокодоступный MySQL с возможностью записи на любом узле.
- Тем, кто использует Percona XtraDB Cluster (Galera) и хочет развернуть тестовый или production‑кластер на Debian 8.
Ключевые понятия (в одну строку)
- Galera: синхронный слой репликации для MySQL/Percona.
- SST: State Snapshot Transfer — полная синхронизация состояния при присоединении узла.
- wsrep: набор системных переменных и параметров Galera.
Требования и предвариельная подготовка
Минимальные требования:
- Три сервера с Debian 8 (Jessie). Рекомендуется одинаковая версия ОС и сетевых настроек.
- Постоянные IP-адреса и корректные записи в /etc/hosts на каждом узле.
- Доступ root для установки пакетов и редактирования конфигурации.
Пример конфигурации хостов (выполните на каждом узле):
127.0.0.1 localhost
192.168.152.100 mysql1.local.vm mysql1
192.168.152.110 mysql2.local.vm mysql2
192.168.152.120 mysql3.local.vm mysql3
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allroutersСовет: проверьте связность с помощью ping/nc/telnet по порту 3306 и 4567 (порт Galera) между узлами.
Шаг 1. Установка Percona XtraDB Cluster
На всех узлах выполните команды от root:
wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
apt-get update
apt-get -y install percona-xtradb-cluster-57При установке укажите пароль для MySQL root, когда установщик запросит. После установки служба mysqld может запуститься автоматически. Остановите её на всех трёх узлах перед внесением конфигурации:
/etc/init.d/mysql stopВажно: не оставляйте одинаковые идентификаторы узлов и пароли в production без дополнительной защиты.
Шаг 2. Конфигурация первого узла (bootstrap)
На первом узле (mysql1.local.vm, 192.168.152.100) добавьте в конец секции [mysqld] файла /etc/mysql/my.cnf следующие строки (оставьте другие параметры без изменений):
[mysqld]
...
# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #1 address
wsrep_node_address=192.168.152.100
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD"Обратите внимание на пароль в wsrep_sst_auth — в примере использовано “PASSW0RD”. Подумайте о безопасном хранении этих учётных данных.
После сохранения конфигурации запустите первый узел в режиме bootstrap:
root@mysql1:~# /etc/init.d/mysql bootstrap-pxcВы должны увидеть подтверждение успешного запуска:
[ ok ] Bootstrapping Percona XtraDB Cluster database server: mysqld ..Проверьте статус кластера в mysql:
mysql> show status like 'wsrep%';В примере ожидаемые переменные: wsrep_cluster_size = 1, wsrep_connected = ON, wsrep_ready = ON, wsrep_local_state_comment = Synced.
Создайте пользователя для SST (XtraBackup) на первом узле:
mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'PASSW0RD';
mysql> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
mysql> FLUSH PRIVILEGES;Важно: можно использовать root для SST, но безопаснее создать отдельного пользователя с ограниченными привилегиями.
Шаг 3. Конфигурация второго узла
На втором узле (mysql2.local.vm, 192.168.152.110) внесите аналогичные строки в /etc/mysql/my.cnf, изменив только адрес узла:
[mysqld]
...
# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=192.168.152.110
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD"Запустите MySQL обычным образом (без bootstrap):
root@mysql2:~# /etc/init.d/mysql startПри старте второй узел автоматически запросит SST у первого узла. Проверьте статус:
mysql> show status like 'wsrep%';Ожидайте wsrep_cluster_size = 2 и wsrep_local_state_comment = Synced.
Шаг 4. Конфигурация третьего узла
На третьем узле (mysql3.local.vm, 192.168.152.120) повторите ту же конфигурацию, изменив wsrep_node_address на 192.168.152.120:
[mysqld]
...
# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=192.168.152.120
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_ubuntu_cluster
# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD"Запустите MySQL:
root@mysql3:~# /etc/init.d/mysql startПроверяйте статус. В норме wsrep_cluster_size = 3 и все узлы должны быть Synced.
Если при старте возникают проблемы, смотрите логи в /var/log/syslog и /var/log/mysql/error.log. Пример строки из syslog, показывающей процесс передачи состояния:
Oct 4 12:16:13 mysql3 mysql[2767]: Starting MySQL (Percona XtraDB Cluster) database server: mysqld . . .State transfer in progress, setting sleep higher: mysqld . ..
Oct 4 12:16:13 mysql3 systemd[1]: Started LSB: Start and stop the mysql (Percona XtraDB Cluster) daemon.
Oct 4 12:17:01 mysql3 CRON[3731]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)В этом примере видна передача состояния (State Transfer).
Тестирование репликации
Приведём простой тест, чтобы убедиться, что запись, созданная на одном узле, видна на всех остальных.
- На втором узле создайте базу данных:
mysql@mysql2> CREATE DATABASE percona;
Query OK, 1 row affected (0.01 sec)- На третьем узле создайте таблицу в этой базе:
mysql@mysql3> USE percona;
Database changed
mysql@pxc3> CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
Query OK, 0 rows affected (0.05 sec)- На первом узле вставьте запись:
mysql@mysql1> INSERT INTO percona.example VALUES (1, 'percona1');
Query OK, 1 row affected (0.02 sec)- На втором узле проверьте результат:
mysql@mysql2> SELECT * FROM percona.example;
+---------+-----------+
| node_id | node_name |
+---------+-----------+
| 1 | percona1 |
+---------+-----------+
1 row in set (0.00 sec)Если данные синхронизировались, репликация работает.
Совет: для приложений используйте балансировщик нагрузки перед узлами, чтобы обеспечить простой доступ и распределение подключений.
Практические рекомендации и безопасность
- Фаерволл: откройте только необходимые порты (3306, 4567/4568 для Galera, 4444 для SST если используется). По возможности ограничьте доступ по IP.
- Учетные записи: используйте отдельного пользователя для SST (как показано) и минимальные привилегии.
- Бекапы: регулярно делайте бэкапы и тестируйте восстановление. SST не заменяет резервное копирование при логической ошибке приложения.
- Авто‑апдейты: в production планируйте окна обслуживания для обновлений Percona.
- Мониторинг: контролируйте wsrep_* переменные и метрики задержек репликации.
Важно: храните wsrep_sst_auth в безопасном месте и не кладите пароли в публичные репозитории.
Отладка: основные сценарии проблем и решения
Узел не подключается к кластеру
- Проверить /etc/hosts и сетевую связность.
- Убедиться, что wsrep_cluster_address содержит все IP.
- Проверить логи /var/log/mysql/error.log и /var/log/syslog.
Долгая передача состояния (SST)
- SST с XtraBackup может занять значительное время при больших базах. Убедитесь в наличии места на диске и пропускной способности сети.
- Для больших данных используйте Incremental IST (если применимо) или подготовьте узлы заранее.
Split brain после массового отказа
- Если все узлы недоступны, при восстановлении решите вручную, какой узел будет bootstrap. Проверьте последние логи и внешний источник правды.
Конфликты автоинкремента
- Параметр innodb_autoinc_lock_mode=2 необходим для согласованного поведения автоинкремента в Galera.
Когда эта схема не подойдёт (контрпримеры)
- Если ваши транзакции сильно зависят от локальных триггеров/функций с побочными эффектами, мульти‑мастер может усложнить консистентность.
- Если задержки сети между узлами большие (>100мс), синхронная репликация ухудшит производительность записей.
- Если у вас большой объём одноразовых нагрузочных вставок, SST/IST может съесть значительные ресурсы.
Альтернативные подходы
- Асинхронная репликация Master‑Slave — проще, но есть задержка и потеря возможности записывать на всех узлах.
- MySQL Group Replication — встроенное решение от Oracle с собственными особенностями.
- Кластерные файловые системы и шардинг — для специфичных сценариев масштабирования.
Роль‑ориентированные чеклисты
DBA:
- Настроить резервное копирование и проверку restore.
- Мониторить wsrep_* переменные.
- Провести план отката и процедуру bootstrap.
DevOps:
- Настроить /etc/hosts и сеть между узлами.
- Настроить firewall и LB перед кластером.
- Автоматизировать установку пакетов и конфигураций.
Разработчик приложения:
- Проверить, что приложение корректно обрабатывает транзакции и конфликты.
- Не полагаться на моментальные консистентные чтения без проверки ошибок.
Факт‑бокс: ключевые числа и значения
- Узлы: 3
- Quorum: 2
- Порты Galera: 4567 (события), 4568 (IST), 4444 (SST по умолчанию), 3306 (MySQL)
- innodb_autoinc_lock_mode: 2 (рекомендуется)
Критерии приёмки
- Все три узла в статусе wsrep_local_state_comment = Synced.
- wsrep_cluster_size = 3.
- SST успешно выполняется при добавлении нового узла.
- Запись, сделанная на любом узле, видна на остальных.
Короткая инструкция по восстановлению после split brain
- Остановить MySQL на всех узлах: /etc/init.d/mysql stop
- Выбрать узел с наибольшим и корректным набором данных (по логам и времени).
- На выбранном узле выполнить: /etc/init.d/mysql bootstrap-pxc
- На остальных узлах выполнить обычный старт: /etc/init.d/mysql start
- Проверить wsrep_cluster_size и состояние Synced.
Глоссарий (1 строка)
- SST — State Snapshot Transfer, полная синхронизация данных для присоединяющегося узла.
- IST — Incremental State Transfer, передача только недостающих транзакций.
Итог: трёхузловой Percona XtraDB Cluster на Debian 8 даёт отказоустойчивую мульти‑мастер репликацию при условии правильной сетевой конфигурации, защищённых учётных данных для SST и мониторинга состояния wsrep. Планируйте резервные копии, мониторйте метрики и тестируйте процедуру восстановления заранее.
Похожие материалы
Как сохранить и выйти из Vi
Как почистить контроллер PS4 — полный гайд
Как печатать в Word: советы и макросы
Как продавать на Amazon — руководство для частных
Очистка очереди печати в Windows 11