n/2 + 1



Кворум — подмножество нод в распределенной системе



Quorum-based Consistency — модель, использумая для обеспечения Consistency из CAP-теоремы “Every read receives the most recent write or an error”, т.е. гарантирует, что не возникнет ситуаций, что один клиент получил успешное подтверждение о записи, а второй клиент эту запись некоторое время не видит. Обеспечивается за счет того, что для подтверждения операции записи/чтения нужно подтверждение от некоторого количества остальных узлов



Обычно разделяют кворум на запись и кворум на чтение

Пусть общее кол-во узлов в системе = N

Размер кворума на чтение = R

Размер кворума на запись = W



Возникает вопрос, как выбрать R и W, чтобы обеспечить consistency. Как минимум нужно, чтобы R + W > N, поскольку это обеспечивает пересечение множеств узлов на запись и на чтение — это нам гарантирует, что при чтении, мы обязательно увидим узел, на который успешно произошла запись



Однако вариаций, как обеспечить R + W > N довольно много, рассмотрим некоторые из них



1) R = 1, W = N



При записи на какой-либо из узлов, он ждет подтверждения от всех остальных узлов

Читаем всегда с одного узла



Поскольку каждая операция записи гарантированно распространится на все узлы, то и чтение с одного узла тоже будет консистентным. Однако в случае недоступности любого из узлов, весь кластер становится недоступным на запись



2) R = N, W = 1



Записываем изменения только на один узел

При чтении опрашиваем все узлы, чтобы определить где самые актуальные данные



И здесь в случае недоступности одного из узлов, весь кластер становится недоступным на чтение, т.к. мы уже не сможем гарантировать, что write-узел будет попадать в кворум на чтение



3) R = N / 2 + 1, W = N / 2 + 1



Записываем изменения на большинство узлов

При чтении опрашиваем большинство узлов



Здесь мы по прежнему сохраняем условие, что кворумы на запись и чтение пересекаются, однако мы можем пережить отказы N - (N / 2 + 1) узлов, поскольку в случае отказа кворумы могут просто перегруппироваться







Пример:



Узлы {A, B, C}, N = 3

Кворум на чтение: {A, B}, R = 2

Кворум на запись: {B, C}, W = 2



Узел B отказывает, кворумы просто перераспределяются

Кворум на чтение: {A, C}

Кворум на запись: {A, C}



Таким образом, n/2 + 1 используется как компромисс между availability и consistency, поскольку позволяет сохранять consistency, но также и переживать отказы некоторых узлов