
334 Глава 6. Непротиворечивость и репликация
ношение обращений к обновлениям очень низкое, мы попадаем в такую ситуацию,
когда обращений ко многим обновленным версиям со стороны Р попросту не бу-
дет и задействовать сетевую связь для доставки этих версий бесполезно. В этом
случае может быть правильнее не устанавливать локальную реплику вблизи про-
цесса Р или применить другую стратегию обновления этой реплики. Ниже мы
вернемся к этим вопросам.
Более серьезной проблемой является то, что сохранение актуальности мно-
жества копий само по себе может стать серьезной проблемой масштабирования.
Интуитивно понятно, что набор копий актуален, если все копии постоянно оди-
наковы. Это означает, что операция чтения должна давать одинаковые результа-
ты для каждой из копий. Соответственно, при выполнении операции обновле-
ния одной из копий обновление должно распространиться на все копии до того,
как начнется следующая операция. При этом безразлично, с какой копии нача-
лась эта операция.
Такой тип непротиворечивости иногда неформально (и неверно) называют
плотной непротиворечивостью, поскольку она поддерживает так называемую син-
хронную репликацию [78]. (В следующем разделе мы представим точное опреде-
ление непротиворечивости и введем ряд моделей непротиворечивости.) Ключевой
является идея о том, что обновление всех копий проводится как одна атомарная
операция или транзакция. К сожалению, реализация атомарности операции, если
в нее вовлечено большое число реплик, которые к тому же могут быть разброса-
ны по узлам крупной сети, изначально затруднена, особенно когда эта операция
вдобавок должна производиться за короткое время.
Трудности вытекают из того факта, что мы должны синхронизировать все ре-
плики. Конкретно это означает, что все реплики должны достичь согласия в том,
когда точно должно производиться их локальное обновление. Так, например, реп-
ликам может потребоваться договориться о глобальном упорядочении операций
с использованием механизма отметок времени Лампорта или завести координа-
тора, который будет диктовать им порядок действий. Глобальная синхронизация
просто отнимет массу времени на взаимодействие, особенно если реплики раз-
бросаны по глобальной сети.
Итак, мы оказались перед дилеммой. С одной стороны, остроту проблем мас-
штабируемости можно снизить, используя репликацию и кэширование, которые
вызовут рост производительности. С другой стороны, чтобы поддерживать все
копии в актуальном состоянии, обычно требуется глобальная синхронизация, ко-
торая чересчур сильно влияет на производительность. Лекарство может оказать-
ся хуже болезни.
Во многих случаях единственное реальное решение состоит в том, чтобы по-
жертвовать ограничениями. Другими словами, если мы снимем требование об
атомарности операций обновления, мы сможем отказаться от необходимости
мгновенной глобальной синхронизации, выиграв при этом в производительно-
сти.
Ценой за это станет ситуация возможной неодинаковости копий. То, в какой
степени мы можем пожертвовать непротиворечивостью, зависит от вариантов до-
ступа к реплицированным данным и вариантов их обновления, а также от задач,
в которых используются эти данные.