Настройка репликации Master-Master для базы данных веб-приложения
Master-Master (Multi-Primary) репликация — схема, при которой запись возможна на нескольких узлах одновременно. Сложнее Master-Slave, решает задачи географически распределённых записей и high availability с немедленным failover.
Когда оправдана Master-Master
Большинство веб-приложений работают нормально на Master-Slave. Master-Master нужна, когда:
- Приложения в разных регионах должны писать в локальную БД с последующей синхронизацией
- Требуется нулевое время переключения при сбое одного мастера
- Запись невозможно направить через единую точку без неприемлемых задержек
MySQL: Galera Cluster
Galera — синхронная multi-primary репликация для MySQL/MariaDB. Все узлы принимают запись, транзакции применяются на всех узлах до commit.
# /etc/mysql/conf.d/galera.cnf (на каждом узле)
[mysqld]
binlog_format = ROW
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
bind-address = 0.0.0.0
# Galera Provider
wsrep_on = ON
wsrep_provider = /usr/lib/galera/libgalera_smm.so
wsrep_cluster_name = "production_cluster"
wsrep_cluster_address = "gcomm://192.168.1.10,192.168.1.11,192.168.1.12"
wsrep_sst_method = rsync
# Уникально для каждого узла
wsrep_node_address = "192.168.1.10"
wsrep_node_name = "node1"
Инициализация кластера на первом узле:
galera_new_cluster
# На остальных узлах — обычный запуск
systemctl start mysql
Проверка состояния:
SHOW STATUS LIKE 'wsrep_%';
-- wsrep_cluster_size должен показать количество узлов
-- wsrep_ready должен быть ON
PostgreSQL: BDR (Bi-Directional Replication)
BDR — расширение от pgEdge, поддерживает async multi-master для PostgreSQL:
-- Подключение расширения
CREATE EXTENSION bdr;
-- Инициализация первого узла
SELECT bdr.bdr_group_create(
local_node_name := 'node1',
node_external_dsn := 'host=192.168.1.10 port=5432 dbname=myapp'
);
-- Присоединение второго узла
SELECT bdr.bdr_group_join(
local_node_name := 'node2',
node_external_dsn := 'host=192.168.1.11 port=5432 dbname=myapp',
join_using_dsn := 'host=192.168.1.10 port=5432 dbname=myapp'
);
Альтернатива — Patroni + Postgres в режиме синхронной репликации. Это не истинный multi-master, но обеспечивает автоматический failover с промоцией реплики в мастер за секунды.
Решение конфликтов записи
Главная сложность Master-Master — конфликты, когда два узла одновременно изменили одну запись.
Стратегии разрешения:
| Стратегия | Подход | Риск |
|---|---|---|
| Last Write Wins | Побеждает последний по timestamp | Потеря данных |
| Origin wins | Побеждает узел-источник | Предсказуемо, но не всегда верно |
| Custom resolver | Бизнес-логика слияния | Сложно реализовать |
| Application-level | Приложение предотвращает конфликты | Требует архитектурных решений |
Для большинства случаев лучше предотвращение конфликтов: каждый регион пишет свои данные (разные таблицы или row-level partitioning по region_id).
Nginx/HAProxy для балансировки записи
upstream mysql_masters {
server 192.168.1.10:3306 weight=1;
server 192.168.1.11:3306 weight=1;
}
Для Galera: все три узла принимают запись, ProxySQL справляется с распределением:
INSERT INTO mysql_servers(hostgroup_id, hostname, port, weight)
VALUES (10, '192.168.1.10', 3306, 1),
(10, '192.168.1.11', 3306, 1),
(10, '192.168.1.12', 3306, 1);
Мониторинг Galera
-- Очередь применения входящих транзакций (должна быть мала)
SHOW STATUS LIKE 'wsrep_local_recv_queue_avg';
-- Конфликты сертификации (должны быть близки к нулю)
SHOW STATUS LIKE 'wsrep_local_cert_failures';
-- Состояние узлов
SHOW STATUS LIKE 'wsrep_cluster_size';
Ограничения
- Galera не поддерживает
MyISAMиMEMORYтаблицы -
AUTO_INCREMENTтребуетinnodb_autoinc_lock_mode=2+wsrep_auto_increment_control=ON - DDL-операции (ALTER TABLE) блокируют кластер — используется
pt-online-schema-changeилиgh-ost - Latency между узлами напрямую влияет на производительность записи в Galera
Срок выполнения
Настройка Galera Cluster на трёх узлах с ProxySQL — 3–4 рабочих дня. Включая нагрузочное тестирование и настройку мониторинга.







