Ответ
Синхронная репликация — это режим, при котором операция записи считается успешно завершенной только после того, как данные были записаны не только на основной узел (лидер), но и подтверждены всеми или кворумом синхронных реплик.
Пошаговый процесс:
- Клиент отправляет запрос на запись лидеру.
- Лидер записывает данные локально.
- Лидер пересылает данные всем синхронным репликам.
- Лидер ожидает подтверждения (acknowledgment) от каждой реплики.
- Только после получения всех подтверждений лидер отправляет клиенту ответ об успешном завершении операции.
Концептуальный пример на Go:
Этот код иллюстрирует блокирующую природу синхронной репликации. Функция не завершится, пока все реплики не "прочитают" данные из канала.
// replicas - это слайс небуферизованных каналов
func syncReplicate(data string, replicas []chan string) error {
// Отправляем данные в каждую реплику.
// Операция `replica <- data` является блокирующей.
for _, replica := range replicas {
replica <- data
}
// Функция вернет управление только после того,
// как все реплики подтвердят получение данных (прочитав из канала).
return nil
}
Преимущества:
- Строгая согласованность (Strong Consistency): После успешной записи клиент гарантированно может прочитать эти данные с любой реплики.
- Гарантия отсутствия потерь данных (Zero Data Loss): Если лидер выходит из строя после подтверждения записи, данные гарантированно сохранены как минимум на одной реплике.
Недостатки:
- Высокая задержка записи (High Write Latency): Общая задержка операции определяется скоростью самого медленного узла в синхронной группе.
- Низкая отказоустойчивость на запись: Если хотя бы одна синхронная реплика выходит из строя, вся система (или, по крайней мере, операции записи) может остановиться до её восстановления.
Примеры использования:
Синхронная репликация используется в системах, где сохранность и консистентность данных имеют наивысший приоритет, например:
- Финансовые системы и банковские транзакции.
- Управление критически важными конфигурационными данными.