Replication
Replication — копирование данных между узлами БД. Цели: HA (отказоустойчивость), read scale, geo-distribution, backup, disaster recovery.
Виды по механизму
| Тип | Что копируется |
|---|---|
| Physical / Streaming | байт-в-байт WAL/redo log |
| Logical | декодированные события (INSERT/UPDATE/DELETE) |
| Statement-based | сам SQL — legacy, проблемы с non-deterministic |
| Trigger-based | SQL-триггеры пишут в отдельную таблицу |
Виды по топологии
- Master-Slave (Primary-Replica) — один пишет, много читают
- Multi-Master — несколько принимают запись, синхронизируются
- Chain — реплика реплики
- Cascading — дерево
Sync vs Async
| Sync | Async | |
|---|---|---|
| COMMIT возвращается | после подтверждения реплики | после записи на мастере |
| Latency | + сетевой RTT | быстро |
| Потеря данных при падении мастера | нет | возможна (RPO > 0) |
| Availability | падение реплики блочит | не блочит |
Компромисс: quorum — жди N из M реплик. PG synchronous_commit=remote_apply.
PostgreSQL
Streaming replication
Мастер → WAL sender → сеть → WAL receiver → реплика
↓
apply WAL
Реплика read-only (hot standby) — можно SELECT.
Logical replication
# на мастере
CREATE PUBLICATION mypub FOR TABLE users;
# на подписчике
CREATE SUBSCRIPTION mysub
CONNECTION 'host=master.example.com dbname=shop'
PUBLICATION mypub;
Плюсы: разные версии PG, разные схемы, только выбранные таблицы, ×→× репликация.
MySQL
- Binlog-based репликация (row / statement / mixed)
- GTID (Global Transaction Identifier) — упрощает failover
- Group Replication — multi-master с consensus (Paxos-подобный)
- MySQL Router + InnoDB Cluster — HA-стек
Split-brain
При потере связи мастер+реплика оба могут думать что они primary. Оба принимают запись → расхождение данных.
Защита: quorum (нужно >N/2 узлов), fencing (STONITH — shoot the other node in the head), witness node.
Read replicas
Read-only slaves — распределение read-нагрузки. Но: replication lag. Записал → сразу читаешь с реплики → можешь не увидеть свою запись.
Решения: read-your-writes (клиент помнит LSN, ждёт), sticky routing, чтение с мастера для критических.
Consensus для multi-master
Настоящий multi-master без conflicts требует consensus. Алгоритмы: Paxos, Raft, Zab. Используют: etcd, Consul, CockroachDB, Spanner, MongoDB replica set (Raft-подобный).