Налаштування репліцирування 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 - Затримка між вузлами безпосередньо впливає на продуктивність запису в Galera
Тривалість
Налаштування Galera Cluster на трьох вузлах з ProxySQL — 3–4 робочих дні. Включаючи нагрузочне тестування та настройку моніторинга.







