
6.5. Протоколы непротиворечивости 385
В качестве простого примера работы этого алгоритма рассмотрим распреде-
ленную файловую систему и предположим, что файл реплицирован на
Л^
серве-
ров.
Мы можем создать правило, согласно которому для обновления файла кли-
ент должен сначала связаться как минимум с половиной серверов плюс еще
одним (большинством) и попросить их согласия на обновление. Как только они
согласятся, файл изменится и с новым файлом будет ассоциирован новый номер
версии. Номер версии используется для идентификации версии файла и являет-
ся одинаковым для всех обновленных файлов.
Для чтения реплицированного файла клиент также должен связаться с поло-
виной серверов плюс еще одним и запросить у них номера версий, ассоцииро-
ванные с файлом. Если все номера версий согласованы, среди них должна быть и
последняя версия, поскольку попытка произвести обновления только на серве-
рах, которым не был направлен запрос, невозможна,
—
они не составляют боль-
шинства.
Так, например, если имеется пять серверов и клиент определил, что три из
них имеют файл версии 8, то не может быть, чтобы на остальных двух хранился
файл версии 9, поскольку любое обновление версии 8 на версию 9 требует разре-
шения как минимум трех, а не двух серверов.
Реальная схема более обобщенная, чем мы только что описали. Согласно этой
схеме для чтения файла, имеющего N реплик, клиент должен собрать кворум
чтения
(read
quorum) —
произвольный набор любых
NR
ИЛИ
более серверов. Со-
ответственно, для модификации файла требуется кворум записи (write quorum),
образованный как минимум Nw серверами. Значения NR и Nw должны удовле-
творять следующим двум условиям:
NR + Nw> N,
Nw>N/2.
Первое ограничение используется для предотвращения конфликтов чтения-
записи, а второе
—
для предотвращения конфликтов двойной записи. Только по-
сле того как соответствующее число серверов даст согласие на операцию, файл
можно будет прочитать или изменить.
Чтобы рассмотреть, как работает алгоритм, взглянем на
рис.
6.26, а, на котором
NR
=
3,3.
NW
=10. Представим, что последний кворум записи состоял из 10 серве-
ров,
с
С
по I. Все они получили новую версию файла и новый номер версии. Все
последующие кворумы чтения из трех серверов будут содержать как минимум
одного члена этого набора. Когда клиент будет просматривать номера версий, он
обнаружит последнюю версию и воспользуется ей.
Рисунок 6.26, б иллюстрирует конфликт двойной записи, который может
произойти, поскольку Nw<N/2, Так, если один из клиентов выберет набор запи-
си
{A,B,C,E,F,G},
а другой
—
{D,HyIJ,K,L},
понятно, что мы столкнемся с пробле-
мами, поскольку оба обновления будут приняты, несмотря на то, что между ни-
ми явно имеется конфликт.
Ситуация, представленная на рис. 6.26, в, особенно интересна, потому что
значение NR В этом случае равно единице, что делает чтение реплицируемого
файла значительно проще. Достаточно найти одну копию и пользоваться ей.
Однако все имеет свою цену. За это мы платим тем, что для записи обновлений