Э. Таненбаум, М. ван Стеен - Распределённые системы (принципы и парадигмы) (1162619), страница 94
Текст из файла (страница 94)
Такая непротиворечивость применяется в тех случаях, когда операции записи коммутативны, то есть их упорядоченность насамом деле не является необходимой. Детали можно найти в [453].6.3.4. Чтение собственных записейСуществует и еще одна модель непротиворечивости, ориентированная на клиента, весьма схожая с непротиворечивостью монотонной записи. Хранилище данных обладает свойством непротиворечивости чтения собственных записей (readyour-writes consistency), если оно удовлетворяет следующему условию: результатопераций записи процесса в элемент данных х всегда виден последующим операциям чтения х этого же процесса.Другими словами, операция записи всегда завершается раньше следующейоперации чтения того же процесса, где бы ни происходила эта операция чтения.Отсутствие непротиворечивости чтения собственных записей часто обнаруживается при обновлении web-страниц с последующим просмотром результатов.Операции обновления часто производятся при помощи стандартного или другого текстового редактора, который записывает новую версию в совместно используемую файловую систему web-сервера.
Web-браузер пользователя работает стем же самым файлом, возможно, запрашивая его с локального web-сервера. Однако после первой же загрузки этого файла сервер или браузер кэшируют дляпоследующего доступа его локальную копию. Соответственно, если браузер илисервер возвращает кэшированную копию, а не оригинальный файл, то при обновлении web-страницы пользователь не в состоянии увидеть его результат. Непротиворечивость чтения собственных записей может гарантировать, что еслиредактор и браузер интегрированы в единую программу, то при обновлениистраницы кэш объявляется неактуальным, и в результате загружается и отображается новая версия файла.Тот же эффект проявляется и при изменении паролей. Так, например, длявхода в цифровую библиотеку в Web часто необходимо иметь там учетную запись с соответствующим паролем.
Однако при смене пароля для вступления нового пароля в силу может потребоваться несколько минут. В результате эти несколько минут библиотека будет недоступна для пользователей. Задержкаможет возникнуть из-за того, что для работы с паролями используется отдельный сервер и последующая рассылка пароля (зашифрованного) серверам, на которых находится библиотека, может потребовать времени. Эта проблема ужевстречалась в Grapevine, одной из первых распределенных систем, поддерживавших причинно-следственную связь. Помогла решить эту. проблему реализациянепротиворечивости чтения собственных записей [61].362Глава 6.
Непротиворечивость и репликацияНа рис. 6.16, а показано хранилище данных с непротиворечивостью чтениясобственных записей. Отметим, что этот рисунок очень похож на рис. 6.14, а, заисключением того, что непротиворечивость теперь определяется по последнейоперации записи процесса Р, а не по последней операции чтения.L1:L2:W(x^)WS(Xi;x2)L1:RCXj)L2:W(Xi)WS(X2)R(X2)Рис. 6.16. Хранилище данных с непротиворечивостью чтения собственных записей (а).Хранилище данных без непротиворечивости чтения собственных записей (б)На рис. 6.16, а процесс Р выполняет операцию записи W{x\), а затем операцию чтения другой локальной копии.
Непротиворечивость чтения собственныхзаписей гарантирует, что эффект, произведенный операцией записи, будет наблюдаться при последующей операции чтения. На это указывает операцияWS{x\\X2), означающая, что W{x\) является частью операции W5(x2). В противоположность этому, на рис. 6.16, б операция W{X]) остается вне операции WS{x2),указывая на то, что эффект предыдущей операции записи процесса Р не распространяется на копию 12.6.3.5. Запись за чтениемПоследняя модель непротиворечивости, ориентированная на клиента, — это модель, в которой изменения распространяются как результаты предыдущей операции чтения.
В этом случае говорят, что хранилище данных обеспечивает непротиворечивость записи за чтением (writes-follow-reads consistency), если соблюдается следующее условие: операция записи в элемент данных х процесса, следующаяза операцией чтения х того же процесса, гарантирует, что будет выполнятьсягшд тем же самым или более свежим значением х, которое было прочитано предыдущей операцией.Иными словами, любая последующая операция записи в элемент данных х,производимая процессом, будет осуществляться с копией х, которая имеет последнее считанное тем же процессом значение х.Непротиворечивость записи за чтением позволяет гарантировать, что пользователи сетевой группы новостей увидят письма с ответами на некое письмотолько позже оригинального письма [453]. Поясним проблему.
Представьте себе,что пользователь сначала читает письмо А. Затем он реагирует на него, посылаяписьмо В. Согласно требованию непротиворечивости записи за чтением, письмо В будет разослано во все копии группы новостей только после того, как тудабудет послано письмо А. Отметим, что пользователи, которые только читают письма, не нуждаются в какой-либо особой модели непротиворечивости, ориентированной на клиента. Непротиворечивость записи после чтения обеспечит сохранение в локальной копии ответа на письмо только в том случае, если там уженаличествует оригинал.6.3.
Модели непротиворечивости, ориентированные на клиента363Эту модель непротиворечивости иллюстрирует рис. 6.17. На рис. 6.17, а процесс читает элемент х из локальной копии L1, Операции записи, заменяющиепрочитанное значение, присутствуют в наборе операций записи в L2, которыепозже осуществляет этот процесс (отметим, что другие процессы в L2 также наблюдают эти операции записи). В противоположность этому, как показано нарис. 6.17, бу отсутствуют всякие гарантии того, что операция записи в L2 выполняется над копией, которая не противоречит копии, только что считанной из L1.L1: WS(x^)L2:WS(Xi;x2)R(x^)L1: WSCx,)W(X2)L2:WS(X2)R{x^)W(X2)Рис.
6.17. Хранилище данных с непротиворечивостью записи после чтения (а).Хранилище данных без непротиворечивости записи после чтения (б)6.3.6. РеализацияРеализация непротиворечивости, ориентированной на клиента, относительно проста, если не принимать во внимание вопросы производительности. Далее мы сначала опишем именно такую реализацию, после чего поговорим о более «жизненных» вариантах реализации.Примитивная реализацияв примитивной реализации непротиворечивости, ориентированной на клиента,каждой операции записи приписывается глобально уникальный идентификатор.Это делается тем сервером, который первым выполняет операцию.
Мы говоримтакже, что операция инициируется этим сервером. Отметим, что генерация глобально уникальных идентифргкаторов может быть реализована в виде локальнойоперации (см. задания в конце главы 4). Итак, для каждого клиента мы отслеживаем два набора идентификаторов записи. Набор чтения для клиента состоит изидентификаторов записи, соответствующих операциям чтения, выполненнымклиентом. Аналогично, набор записи состоит из идентификаторов операций записи, выполненных клиентом.Непротиворечивость монотонного чтения реализуется следующим образом.Когда клиент осуществляет операцию чтения с сервера, этот сервер проверяетнабор чтения клиента на локальное присутствие результатов всех его операцийзаписи (размер этого набора может породить проблемы производительности, решение которых обсуждается ниже). Если это не так, он связывается с другимисерверами, чтобы актуализировать данные до проведения операции чтения.
С другой стороны, операции чтения могут быть переданы серверу, на котором производились операции записи. После выполнения операции чтения последующиеоперации записи, производимые на выбранном сервере и связанные с операциями чтения, добавляются к набору чтения клиента.Отметим, что точно можно определить лишь место, где происходят операциизаписи, указанные в наборе чтения. Так, например, идентификатор записи может364Глава 6. Непротиворечивость и репликациявключать в себя идентификатор сервера, инициировавшего операцию. Этот сервер требуется, например, для того, чтобы запротоколировать операцию записи вжурнале, чтобы ее можно было повторить на другом сервере.
Кроме того, операции записи должны осуществляться в том же порядке, в котором они были инициированы. Упорядоченность введена для того, чтобы клиент мог генерироватьглобально уникальный последовательный номер, включаемый в идентификаторзаписи, такой, например, как отметка времени Лампорта. Если каждый элементданных модифицируется только его владельцем, последний и сможет поддерживать последовательную нумерацию.Непротиворечивость монотонной записи реализуется аналогично монотонному чтению. Всякий раз при инициировании клиентом новой операции записи насервере этот сервер просматривает набор записи клиента.