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