Сравните синхронную и асинхронную репликацию: каковы их плюсы и минусы?

Ответ

Синхронная репликация

При синхронной репликации мастер-узел ожидает подтверждения от всех реплик, что данные были успешно записаны, и только после этого сообщает клиенту об успехе операции.

Плюсы:
Строгая консистентность (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).