- •1. Соединение пользователей с ресурсами
- •2. Прозрачность
- •3. Открытость
- •4. Масштабируемость
- •1. Строгая непротиворечивость
- •2. Линеаризуемость и последовательная непротиворечивость
- •3. Причинная непротиворечивость
- •4. Непротиворечивость fifo
- •5. Слабая непротиворечивость
- •6. Свободная непротиворечивость
- •7. Поэлементная непротиворечивость
4. Масштабируемость
Масштабируемость системы может измеряться по трем различным показателям.
а) Масштабируемость по отношению к размеру системы, что означает легкость подключения к ней дополнительных пользователей и ресурсов.
б) Географическая масштабируемость, то есть пользователи и ресурсы могут быть разнесены в пространстве.
в) Масштабируемость в административном смысле, то есть система должна быть проста в управлении при работе во множестве административно независимых организаций.
Одна из важных технологий масштабирования — распределение. Распределение предполагает разбиение компонентов на мелкие части и последующее разнесение этих частей по системе.
Хорошим примером распределения является система доменных имен Интернета (DNS). Пространство DNS-имен организовано иерархически, в виде дерева доменов, которые разбиты на неперекрывающиеся зоны,. Имена каждой зоны обрабатываются одним сервером имен. Не углубляясь чересчур в детали, можно считать, что каждое доменное имя является именем хоста в Интернете и ассоциируется с сетевым адресом этого хоста. В основном интерпретация имени означает получение сетевого адреса соответствующего хоста. Рассмотрим, к примеру, имя nl.vu.cs.flits. Для интерпретации этого имени оно сначала передается на сервер зоны Z1, который возвращает адрес сервера зоны Z2, который, вероятно, сможет обработать остаток имени, vu.cs.flits. Сервер зоны Z2 вернет адрес сервера зоны Z3, который способен обработать последнюю часть имени и вернуть адрес соответствующего хоста.
В качестве другого примера рассмотрим World Wide Web. Для большинства пользователей Web представляется гигантской информационной системой документооборота, в которой каждый документ имеет свое уникальное имя — URL. Концептуально можно предположить даже, что все документы размещаются на одном сервере. Однако среда Web физически разнесена по множеству серверов, каждый из которых содержит некоторое количество документов. Имя сервера, содержащего конкретный документ, определяется по URL-адресу документа. Только благодаря подобному распределению документов Всемирная паутина смогла вырасти до ее современных размеров.
Модель клиент-сервер
В базовой модели клиент-сервер все процессы в распределенных системах делятся на две возможно перекрывающиеся группы. Процессы, реализующие некоторую службу, например службу файловой системы или базы данных, называются серверами. Процессы, запрашивающие службы у серверов путем посылки запроса и последующего ожидания ответа от сервера, называются клиентами. Взаимодействие клиента и сервера, известное под названием режим работы запрос-ответ, иллюстрирует рисунок.
Разделение приложений по уровням
Приложения типа клиент-сервер, предназначенные для организации доступа пользователей к базам данных, разделяются их на три уровня.
уровень пользовательского интерфейса;
уровень обработки;
уровень данных.
Уровень пользовательского интерфейса обычно реализуется на клиентах. Этот уровень содержит программы, посредством которых пользователь может взаимодействовать с приложением.
Многие приложения модели клиент-сервер построены как бы из трех различных частей: части, которая занимается взаимодействием с пользователем, части, которая отвечает за работу с базой данных или файловой системой, и средней части, реализующей основную функциональность приложения. Эта средняя часть логически располагается на уровне обработки.
В качестве примера рассмотрим поисковую машину в Интернете. Пользовательский интерфейс поисковой машины очень прост: пользователь вводит строку, состоящую из ключевых слов, и получает список заголовков web-страниц. Результат формируется из гигантской базы просмотренных и проиндексированных web-страниц. Ядром поисковой машины является программа, трансформирующая введенную пользователем строку в один или несколько запросов к базе данных. Затем она помещает результаты запроса в список и преобразует этот список в набор HTML-страниц. В рамках модели клиент-сервер часть, которая отвечает за выборку информации, обычно находится на уровне обработки. Эта структура показана на рисунке.
В качестве второго примера рассмотрим систему поддержки принятия решений для фондового рынка. Так же как и в поисковой машине, эту систему можно разделить на внешний интерфейс, реализующий работу с пользователем, внутреннюю часть, отвечающую за доступ к базе с финансовой информацией, и промежуточную программу анализа. Анализ финансовых данных может потребовать замысловатых методик и технологий на основе статистических методов и искусственного интеллекта. В некоторых случаях для того, чтобы обеспечить требуемые производительность и время отклика, ядро системы поддержки финансовых решений должно выполняться на высокопроизводительных компьютерах.
Уровень данных в модели клиент-сервер содержит программы, которые предоставляют данные обрабатывающим их приложениям. Специфическим свойством этого уровня является требование сохранности. Это означает, что когда приложение не работает, данные должны сохраняться в определенном месте в расчете на дальнейшее использование. В простейшем варианте уровень данных реализуется файловой системой, но чаще для его реализации задействуется полномасштабная база данных. В модели клиент-сервер уровень данных обычно находится на стороне сервера.
Обычно в деловой среде уровень данных организуется в форме реляционной базы данных. Ключевым здесь является независимость данных. Данные организуются независимо от приложений так, чтобы изменения в организации данных не влияли на приложения, а приложения не оказывали влияния на организацию данных.
В тех случаях, когда операции с данными значительно проще выразить в понятиях работы с объектами, имеет смысл реализовать уровень данных средствами объектно-ориентированных баз данных. Подобные базы данных не только поддерживают организацию сложных данных в форме объектов, но и хранят реализации операций над этими объектами. Таким образом, часть функциональности, приходившейся на уровень обработки, мигрирует в этом случае на уровень данных.
Варианты архитектуры клиент-сервер
Один из подходов к организации клиентов и серверов — это распределение программ, по различным машинам, как показано на рисунке. Простейшим является разделение на два типа машин: на клиенты и на серверы.
Один из возможных вариантов организации — поместить на клиентскую сторону терминальную часть пользовательского интерфейса (а), позволив приложению удаленно контролировать представление данных. Альтернативой этому подходу будет передача клиенту всей работы с пользовательским интерфейсом (б). В обоих случаях мы отделяем от приложения графический внешний интерфейс, связанный с остальной частью приложения (находящейся на сервере) посредством специфичною для данного приложения протокола. В подобной модели внешний интерфейс делает только необходимое для предоставления интерфейса приложения.
Можно перенести во внешний интерфейс часть приложения (в). Примером может служить текстовый процессор, в котором базовые функции редактирования осуществляются на стороне клиента с локально кэшируемыми или находящимися в памяти данными, а специальная обработка, такая как проверка орфографии или грамматики, выполняется на стороне сервера.
В том случае, когда клиентская машина — персональный компьютер или рабочая станция — соединена сетью с распределенной файловой системой или базой данных, большая часть приложения работает на клиентской машине, а все операции, с файлами или базой данных передаются на сервер (г). Часть данных при этом может содержится на локальном диске клиента (д). Так, например, при работе в Интернете клиент может постепенно создать на локальном диске огромный кэш наиболее часто посещаемых web-страниц.
Иногда серверу может понадобиться работать в качестве клиента. Такая ситуация приводит нас к физически трехзвенной архитектуре.
В подобной архитектуре программы, составляющие часть уровня обработки, выносятся на отдельный сервер, но дополнительно могут частично находиться и на машинах клиентов и серверов. Типичный пример трехзвенной архитектуры — обработка транзакций. В этом случае отдельный процесс — монитор транзакций — координирует все транзакции, возможно, на нескольких серверах данных.
В современных архитектурах распределение на клиенты и серверы происходит способом, известным как горизонтальное распределение. При таком типе распределения клиент или сервер может содержать физически разделенные части логически однородного модуля, причем работа с каждой из частей может происходить независимо. Это делается для выравнивания загрузки.
В качестве примера горизонтального распределения рассмотрим web-сервер, реплицированный на несколько машин локальной сети. На каждом из серверов содержится один и тот же набор web-страниц, и всякий раз, когда одна из web-страниц обновляется, ее копии незамедлительно рассылаются на все серверы. Сервер, которому будет передан входящий запрос, выбирается по правилу «карусели». Эта форма горизонтального распределения успешно используется для выравнивания нагрузки на серверы популярных web-сайтов.
Репликация — хранение нескольких копий одних и тех же данных.
Данные реплицируются для повышения надежности системы.
Если файловая система реплицирована, она может продолжать свою работу после сбоя в одной из реплик, просто переключившись на другую. Кроме того, поддерживая несколько копий, легче противостоять сбоям данных. Так, представим себе, что существует три копии некоего файла, и операции чтения и записи производятся со всеми тремя. Мы можем защитить себя от единичной неудачной операции записи, считая правильным значение, которое выдают как минимум две.
Другой довод в пользу репликации данных — производительность.
Репликация повышает производительность, когда распределенную систему приходится масштабировать на множество машин и географических зон. Масштабирование на множество машин имеет место, например, когда возрастает число процессов, требующих доступа к данным, управляемым одним сервером. В этом случае производительность можно повысить путем репликации сервера с последующим разделением общего объема работы между сервером и репликами.
При масштабировании на увеличившуюся географическую зону мы также нуждаемся в репликации. Основная идея состоит в помещении копии данных поблизости от использующего ее процесса, что ведет к сокращению времени доступа. В результате наблюдаемая производительность процесса возрастает.
Проблема репликации в том, что наличие множества копий может создать проблемы с непротиворечивостью данных. Каждый раз при изменении копии она начинает отличаться от всех прочих. Соответственно, для сохранения непротиворечивости эти изменения должны быть перенесены и на остальные копии. То, как и когда следует переносить эти изменения, и определяет цену репликации.
Рассмотрим постоянно растущее время доступа к web-страницам. Если не предпринимать никаких специальных мер, загрузка страницы с удаленного web-сервера может занимать до нескольких секунд. Для повышения производительности web-браузеры часто локально сохраняют копии загруженных ранее web-страниц, то есть кэшируют web-страницы. Если пользователь снова запросит подобную страницу, браузер автоматически вернет е локальную копию. Скорость доступа, с точки зрения пользователя, будет потрясающая. Однако если пользователь всегда хочет иметь последнюю версию страницы, его может постичь разочарование. Проблема состоит в том, что если в промежутке между обращениями страница будет модифицирована, модификации распространяться на копии в кэше, что сделает эти копии устаревшими.
Модели непротиворечивости, ориентированные на данные
Будем рассматривать распределенное хранилище данных и множество процессов, которым необходим доступ к данным из этого хранилища. Данные реплицированы, т.е. в общем случае каждый процесс имеет доступ к локальной копии данных, расположенной поблизости от него. Процесс может производить над данными операции чтения и записи. Операции над данными называются операциями записи, если они изменяют данные. Все прочие операции считаются операциями чтения. Операции записи распространяются на локальные копии всех других процессов.
Модель непротиворечивости представляет собой контракт между процессами и хранилищем данных. Он гласит, что если процессы соблюдают некоторые правила, хранилище работает правильно.
Обычно процесс, выполняющий операцию чтения элемента данных, ожидает, что операция вернет значение, соответствующее результату последней записи этих данных. Но в отсутствие глобальных часов трудно точно определить, какая из операций записи была последней. Возникает необходимость во введении других, альтернативных определений, которые приведут к созданию моделей непротиворечивости. Каждая модель будет успешно ограничивать набор значений, которые может возвратить операция чтения над элементом данных. Модели с минимальным объемом ограничений использовать проще, а модели с максимальными ограничениями — труднее. Плата за это состоит в том, что простые модели работают хуже, чем сложные.
