В системе с N репликами запись считается успешной после подтверждения W реплик. Как выбрать W, чтобы две успешные записи не могли опереться на непересекающиеся наборы реплик?
Нужно выбрать размер записи так, чтобы выполнялось условие 2W > N. Тогда любые два набора из W реплик имеют хотя бы одну общую реплику.
Это пересечение не устраняет конфликт автоматически: общая реплика должна участвовать в обнаружении конфликта, выборе версии или ином протоколе согласования. Кроме того, одно лишь условие для записи не гарантирует свежие чтения и линейризуемость.
Репликация появилась как способ переживать отказ узлов, снижать задержку чтения и повышать доступность данных. Однако независимое подтверждение операций на разных репликах может привести к расхождению состояния.
Кворумный подход ограничивает такие расхождения математическим условием пересечения наборов реплик. Он позволяет принимать решения без ожидания всех узлов, сохраняя некоторую гарантию согласованности при отказах и сетевых задержках.
Пусть запись считается успешной после подтверждения W реплик из N. Если 2W ≤ N, теоретически возможны два непересекающихся набора подтверждающих реплик.
Например, при N = 6 и W = 3 одна запись может завершиться на репликах 1–3, а другая — на репликах 4–6. Ни одна реплика не увидит обе операции, поэтому локальных сведений недостаточно для непосредственного обнаружения конфликта.
Больший W уменьшает риск такого расхождения, но повышает задержку и снижает доступность: операция должна дождаться большего числа узлов. При сетевом разделении сторона, в которой меньше W реплик, не сможет успешно принимать записи.
Два множества размера W, выбранные из N элементов, гарантированно пересекаются, если их суммарный размер превышает N: W + W > N, то есть 2W > N. Например, при N = 5 значение W = 3 даёт пересечение минимум в одной реплике.
На практике общая реплика должна не просто принять байты, а сохранить информацию, позволяющую разрешить конфликт: номер версии, логический timestamp, идентификатор операции или запись в журнале. Конкретный способ зависит от протокола хранения.
Для чтений обычно выбирают отдельный размер кворума R. Условие R + W > N гарантирует пересечение чтения и записи, но и оно само по себе не означает линейризуемость: важны порядок обработки версий, правила выбора значения, поведение при восстановлении и защита от устаревших ответов.
Кворумные схемы также не равны консенсусу. Консенсусный протокол согласует общий порядок решений и обычно использует лидера или кворум участников; простое пересечение наборов подтверждений может лишь создать возможность заметить конфликт, но не выбрать единственный порядок.
В сервисе хранятся настройки клиента на пяти репликах. Команда рассматривает два варианта: использовать W = 2 или W = 3.
При W = 2 запись быстрее и переживает больше отказов. Но две успешные записи могут использовать пары реплик без пересечения, поэтому после сетевого разделения возникают независимые версии, которые нельзя сопоставить только по факту подтверждения.
При W = 3 любые две успешные записи имеют общую реплику. Команда выбирает этот вариант, добавляет версионирование и принимает запись только на стороне разделения, где доступны минимум три реплики. Это снижает доступность меньшей части кластера, зато после восстановления позволяет обнаруживать конфликтующие версии и применять определённое правило разрешения.
Результат: сервис получил предсказуемое пересечение подтверждений и не скрывает сетевые разделения под видом успешных записей. Цена решения — более высокая задержка записи и отказ от доступности при потере большинства.
Нет. Оно гарантирует пересечение наборов реплик, но не запрещает общей реплике принять две разные версии или не определяет, какая версия победит. Нужны правила версионирования, порядок операций, блокировки, протокол лидера или другой механизм разрешения конфликтов.
Записи в этой части не смогут получить успешное подтверждение. Это сознательный обмен доступности на согласованность: система предпочитает отказ операции потенциально противоречивому состоянию. Если разрешить запись меньшинству, условие кворума нарушится и после восстановления потребуются механизмы слияния или отката.
Нет. Пересечение R + W > N лишь означает, что хотя бы одна реплика из набора чтения участвовала в записи. Она может быть недоступна, вернуть устаревшую версию или не иметь правил сравнения версий, а чтение может выбрать более старый ответ от другой реплики.
Для сильной гарантии нужны согласованные правила чтения, проверка актуальности версии, корректное поведение при восстановлении и, в зависимости от модели, дополнительный протокол упорядочивания операций. Поэтому кворум — это строительный блок согласованности, а не полная спецификация семантики системы.