44 lines
3.1 KiB
Markdown
44 lines
3.1 KiB
Markdown
---
|
||
aliases:
|
||
tags:
|
||
- зрелость/🌱
|
||
date:
|
||
- - 2024-06-04
|
||
zero-link:
|
||
- "[[00 Базы Данных]]"
|
||
parents:
|
||
- "[[Репликация БД]]"
|
||
linked:
|
||
---
|
||
![800](Pasted%20image%2020240226135429.png)
|
||
|
||
Клиент сразу пишет во все реплики. До каких-то информация доходит, до каких-то нет. Ноды возвращают результаты, клиент их подсчитывает. Если количество успешных ответов больше, чем заранее выставленное число W, то мы считаем эту запись успешной. ==Если их меньше, но не 0, отката транзакции не будет.==
|
||
|
||
Читаем мы также со всех реплик разом, но удастся прочитать может только с нескольких. В таком случае у нас есть число R, которое означает, какое минимальное количество реплик нам должно ответить, чтобы мы считали операцию чтения успешной.
|
||
|
||
Формула расчета кворума: W + R > number of replics
|
||
- W - в каком количестве реплик должна примениться запись, чтобы мы считали ее успешной
|
||
- R - со скольки реплик мы должны прочитать значение ключа, чтобы считать, что чтение прошло успешным
|
||
|
||
Такая репликация есть в:
|
||
- DynamoDB
|
||
- Cassandra
|
||
- Scylla (Переписанная на C++ Cassandra)
|
||
- Riak
|
||
- Voldemort
|
||
|
||
**Поддержание консистентности:**
|
||
- Анти-энтропия. Реплики переодически ходят друг к другу и синхронизируются.
|
||
- Противодействие энтропии. Внешний клиент опрашивает все ноды, находит устаревшие данные и обновляет их.
|
||
- Обновление при чтении (Set on read). Берем последнюю версию после чтения и отправляем в реплики с устаревшими данными.
|
||
- Last write wins. Кто последний записал, те данные и верные.
|
||
- [Happens before](Happens%20before.md).
|
||
- Векторы версий.
|
||
- [Tombstone](Tombstone.md)
|
||
|
||
**Проблемы:**
|
||
- [Нестрогий кворум](Нестрогий%20кворум.md). Возможно чтение старых данных при W+R < N
|
||
- Нет отката транзакций.
|
||
- Как в таком случае работает обновление при чтении или противодействие энтропии, ведь эти данные становятся новыми.
|
||
- Конфликт записей и [Потерянное обновление](Потерянное%20обновление.md).
|
||
- Проблемы с линеаризуемостью. |