54 lines
6.3 KiB
Markdown
54 lines
6.3 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
- semi-sync
|
|||
|
tags:
|
|||
|
- maturity/🌱
|
|||
|
date:
|
|||
|
- - 2024-06-07
|
|||
|
zero-link:
|
|||
|
- "[[../../../meta/zero/00 HighLoad|00 HighLoad]]"
|
|||
|
parents:
|
|||
|
- "[[Репликация БД]]"
|
|||
|
linked:
|
|||
|
- "[[Асинхронная репликация]]"
|
|||
|
- "[[Синхронная репликация]]"
|
|||
|
---
|
|||
|
Полу-синхронная репликация — это компромиссный метод между [[Синхронная репликация|синхронной]] и [[Асинхронная репликация|асинхронной]] репликацией. Он обеспечивает более высокую надежность данных по сравнению с асинхронной репликацией, но при этом снижает время отклика по сравнению с синхронной.
|
|||
|
|
|||
|
Комит прошел на одной реплике, но данные по транзакции были скопированы во все остальные реплики, но еще не были применены.
|
|||
|
|
|||
|
Реализовано в [MySQL](../../../meta/zero/00%20MySQL.md)
|
|||
|
|
|||
|
Схема выполнения на MySQL ![](../../../meta/files/images/Pasted%20image%2020240206195639.png)
|
|||
|
|
|||
|
**Как работает**
|
|||
|
- Подготовка транзакции в движке БД: Транзакция начинается на master, где собираются все изменения данных.
|
|||
|
- Запись транзакции в лог: Все изменения записываются в журнал транзакций.
|
|||
|
- Пересылка лога репликам: Журнал транзакций отправляется на реплики. Master ждет подтверждения от как минимум одной реплики о получении журнала, но не обязательно его применении.
|
|||
|
- Завершение транзакции в движке БД: После получения подтверждения от одной или нескольких реплик транзакция завершается на master, и клиент получает подтверждение.
|
|||
|
- Воспроизведение транзакции на репликах: Реплики применяют полученные изменения к своим копиям данных, но это может произойти с задержкой.
|
|||
|
|
|||
|
**Преимущества**
|
|||
|
- Баланс между надежностью и производительностью: Полу-синхронная репликация обеспечивает более высокую надежность данных по сравнению с асинхронной репликацией, так как master ждет подтверждения от реплик перед завершением транзакции. Это снижает риск потери данных при сбое.
|
|||
|
- Сниженное время отклика: В отличие от синхронной репликации, master не ждет подтверждения от всех реплик, что снижает время отклика и повышает производительность системы.
|
|||
|
- Меньшая вероятность отставания данных: Благодаря ожиданию подтверждения от реплик перед завершением транзакции, вероятность отставания данных на репликах уменьшается.
|
|||
|
|
|||
|
**Минусы**
|
|||
|
- Проблемы с консистентностью данных: Хотя master ждет подтверждения от одной или нескольких реплик, данные на других репликах могут оставаться несогласованными до применения изменений, что может привести к проблемам с консистентностью. [Фантомное чтение](Фантомное%20чтение.md).
|
|||
|
- Сложность управления: Полу-синхронная репликация требует более сложной настройки и управления по сравнению с асинхронной репликацией, так как необходимо следить за подтверждениями от реплик и управлять задержками.
|
|||
|
- Увеличенное время отклика по сравнению с асинхронной репликацией: Несмотря на снижение времени отклика по сравнению с синхронной репликацией, полу-синхронная репликация все же медленнее асинхронной, так как требует ожидания подтверждений от реплик.
|
|||
|
## Примеры использования
|
|||
|
Полу-синхронная репликация часто используется в системах, где требуется баланс между надежностью данных и производительностью. Например, в финансовых системах, где важна высокая доступность и консистентность данных, но при этом необходимо обеспечить приемлемое время отклика для клиентов. Полу-синхронная репликация позволяет снизить риск потери данных при сбоях и поддерживать консистентность данных на более высоком уровне, чем асинхронная репликация.
|
|||
|
***
|
|||
|
## Мета информация
|
|||
|
**Область**:: [[../../../meta/zero/00 HighLoad|00 HighLoad]]
|
|||
|
**Родитель**:: [[Репликация БД]]
|
|||
|
**Источник**::
|
|||
|
**Автор**::
|
|||
|
**Создана**:: [[2024-06-07]]
|
|||
|
### Дополнительные материалы
|
|||
|
- [[Асинхронная репликация]]
|
|||
|
- [[Синхронная репликация]]
|
|||
|
### Дочерние заметки
|
|||
|
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|