Ответ
Репликация — это механизм создания и синхронизации копий базы данных (реплик) с основной базой (мастером). Это ключевой элемент для построения отказоустойчивых и масштабируемых систем.
Основные цели репликации:
- Повышение доступности (High Availability): Если мастер-сервер выходит из строя, одна из реплик может взять на себя его роль (failover).
- Масштабирование нагрузки на чтение (Read Scaling): Запросы на чтение можно распределять между репликами, снижая нагрузку на мастер.
- Резервное копирование: Реплики можно использовать для создания бэкапов без остановки работы мастера.
Основные виды репликации:
- Асинхронная: Мастер записывает данные и сразу отвечает клиенту, а затем отправляет изменения на реплики. Это самый быстрый режим, но есть риск потери данных, которые не успели реплицироваться при сбое мастера.
- Синхронная: Мастер ждет подтверждения записи от одной или нескольких реплик, прежде чем ответить клиенту. Гарантирует отсутствие потерь данных, но увеличивает задержку записи.
- Полусинхронная (Semi-Synchronous): Компромиссный вариант. Мастер ждет подтверждения хотя бы от одной реплики, а остальные обновляются асинхронно.
Как это используется в Go:
В Go-приложении работа с репликацией обычно сводится к настройке двух (или более) пулов соединений: один для записи (на мастер) и один для чтения (на реплики).
// Пул соединений для записи (мастер)
dbMaster, err := sql.Open("postgres", "host=master-db ...")
// Пул соединений для чтения (реплика)
dbReplica, err := sql.Open("postgres", "host=replica-db ...")
// Запросы на изменение данных отправляются на мастер
_, err = dbMaster.Exec("UPDATE users SET status = 'active' WHERE id = 1")
// Запросы на чтение можно отправлять на реплику
var status string
err = dbReplica.QueryRow("SELECT status FROM users WHERE id = 1").Scan(&status)
Ключевые проблемы:
- Задержка репликации (Replication Lag): В асинхронном режиме данные на реплике могут быть неактуальными. Приложение должно быть готово к тому, что только что записанные данные могут быть недоступны для чтения с реплики.
- Split-Brain: Ситуация в сетевых топологиях с несколькими мастерами, когда из-за сбоя сети появляются две независимые "главные" версии базы.