Ответ
Синхронная репликация
При синхронной репликации мастер-узел ожидает подтверждения от всех реплик, что данные были успешно записаны, и только после этого сообщает клиенту об успехе операции.
Плюсы:
✅ Строгая консистентность (Strong Consistency): Все реплики всегда содержат одинаковые, актуальные данные. Чтение с любой реплики вернёт последнее записанное значение.
✅ Гарантия сохранности данных: Нет риска потери данных при отказе мастер-узла сразу после записи, так как данные уже находятся на репликах.
✅ Простота логики приложения: Разработчику не нужно беспокоиться о возможной рассинхронизации данных.
Минусы:
❌ Высокая задержка (High Latency): Время записи равно времени передачи и записи на самом медленном узле в кластере.
❌ Низкая доступность (Low Availability): Отказ даже одной реплики может сделать всю систему недоступной для записи.
❌ Высокая нагрузка на сеть: Требуется постоянная и быстрая связь между узлами.
// Псевдокод, иллюстрирующий синхронную запись
func syncWrite(data []byte) error {
// Запись на мастер
if err := writeToNode("master", data); err != nil {
return err
}
// Одновременная запись на реплики и ожидание ответа от всех
errChan := make(chan error, 2)
go func() { errChan <- writeToNode("replica1", data) }()
go func() { errChan <- writeToNode("replica2", data) }()
// Если хотя бы одна реплика не ответила или вернула ошибку, вся операция фейлится
for i := 0; i < 2; i++ {
if err := <-errChan; err != nil {
// В реальной системе здесь была бы логика отката транзакции
return err
}
}
return nil
}
Асинхронная репликация
При асинхронной репликации мастер-узел записывает данные у себя, сразу же подтверждает операцию клиенту и отправляет данные на реплики в фоновом режиме.
Плюсы:
✅ Низкая задержка записи: Операция подтверждается мгновенно, не дожидаясь реплик.
✅ Высокая доступность: Отказ реплик не влияет на доступность системы для записи.
Минусы:
❌ Возможная потеря данных: Если мастер-узел откажет до того, как данные будут скопированы на реплики, эти данные будут потеряны.
❌ Итоговая консистентность (Eventual Consistency): Реплики могут отставать от мастера, и чтение с них может вернуть устаревшие данные (Replica Lag).
Выбор между ними — это классический компромисс между согласованностью данных (Consistency) и доступностью/производительностью (Availability/Performance).