digital-garden/_inbox/Синхронная репликация.md

3.6 KiB
Raw Blame History

aliases tags date zero-link parents linked
зрелость/🌱
2024-06-07
00 Базы Данных
Репликация БД
Асинхронная репликация
Полу-синхронная репликация

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

Реализовано в PostgreSQL.

Как работает:

  • Подготовка транзакции в движке БД: Транзакция начинается на главном сервере (мастере), где собираются все изменения данных.
  • Запись транзакции в лог: Все изменения записываются в журнал транзакций, что обеспечивает возможность восстановления данных в случае сбоя.
  • Пересылка лога репликам: Журнал транзакций отправляется на все реплики для синхронного применения изменений.
  • Выполнение транзакций на репликах: Реплики применяют полученные изменения к своим копиям данных.
  • Завершение транзакции в движке БД: После успешного применения изменений на всех репликах транзакция завершается.
  • Возврат результата клиенту: Клиент получает подтверждение о завершении транзакции только после того, как изменения применены на всех репликах.

Плюсы:

  • Высокая надежность данных: Данные не теряются даже в случае сбоя одного из серверов, так как изменения применяются на всех репликах одновременно.
  • Консистентность данных: Обеспечивается консистентность данных на всех репликах, что исключает возможность получения различных результатов для одного и того же запроса.

Минусы:

  • Увеличенное время отклика: Поскольку подтверждение транзакции возвращается клиенту только после её завершения на всех репликах, время отклика увеличивается. Это может негативно сказаться на производительности системы, особенно при большом количестве реплик.
  • Высокая вероятность сбоев: С увеличением числа реплик общая вероятность сбоя возрастает, так как транзакция завершается только при успешном выполнении на всех репликах. Если хотя бы одна реплика не отвечает, транзакция не может быть завершена.