Виртуализация в прикладных распределенных программных системах
В распределенных прикладных системах переход от кластерного ПО для отдельных компонентов таких систем к виртуализационному кластерному ПО, ориентированному на работу приложений, позволяет повысить их надежность и масштабируемость.
Построение высоконадежных распределенных систем прикладного ПО и их эксплуатация никогда не была простой задачей. Различная надежность компонентов таких систем, само по себе большое количество компонентов, узкие места в их взаимодействии — все это всегда требовало сложных процедур анализа, нагрузочного тестирования и ресурсоемких механизмов ввода прикладных систем в промышленную эксплуатацию.
Наработанные в общей практике ИТ-отрасли методы увеличения надежности работы распределенных вычислительных систем базируются на механизмах кластеризации их компонентов, уровней или слоев. Однако очень часто оказывается, что нелинейность, сложность, большое количество факторов, влияющих на работу распределенных прикладных систем, различия между механизмами кластеризации компонентов (например, кластеризация в блоке хранения и использования данных существенно отличается от кластеризации в блоке промежуточного слоя в многозвенных системах) приводят к тому, что поведение таких систем при масштабировании и попытках увеличить производительность оказывается непредсказуемым.
Очень часто неразрешимость на практике задачи увеличения производительности толкает компании на замену программно-аппаратных платформ или тех их составляющих, на которых работают прикладные системы, что существенно сокращает время жизни самих прикладных систем даже при наличии развитой и постоянно совершенствующейся инфраструктуры предприятия. Особенно болезненно это может сказаться на ИТ-затратах предприятий, использующих в своей работе системы XTP (eXtreme Transaction Processing) и CRM (Customer Relationship Management). В данную категорию попадают предприятия, оказывающие финансовые услуги, большие банки, торговые и инвестиционные компании — все, кому требуются системы оценки рисков в режимах реального времени, системы управления рисками и оценки кредитов, системы обнаружения мошенничеств в финансовой сфере, торговые, аналитические системы и системы управления в режиме реального времени. Сюда же попадают предприятия, эксплуатирующие системы алгоритмической торговли, системы фондовых бирж и торговли на рынках облигаций. Рынок телекоммуникаций и электронная коммерция в режиме online, различные системы резервирования (билетов, туров, мест в отелях, полетов) и call-центры, работающие с информацией в режимах реального времени и очень чувствительные к потерям информации, существенно расширяют категорию предприятий, попадающих в зону риска дополнительных издержек на инфраструктуру прикладных систем.
Кластерное ПО, ориентированное на приложения
Стандартные способы увеличения масштабируемости и производительности систем на основе кластерного ПО для компонентов, созданного за последнее десятилетие, эффективно работают в других областях, но для данной категории предприятий и бизнесов малоэффективны. Однако ситуация оказывается не такой уж безнадежной, если перейти от кластерного ПО для компонентов, звеньев и уровней распределенных прикладных систем к кластерному ПО, ориентированному на работу приложений.
Оценивая изменения, произошедшие в последние несколько лет на рынке средств кластерного ПО, мы обнаружим появление целого нового класса продуктов: кластерного ПО, ориентированного на работу приложений. Оно открывает новые методы и подходы к созданию информационных систем, расширяет область практического применения теории кластеров и систем высокой степени надежности, порождает новую терминологию, открывает новые возможности для системных архитекторов и дизайнеров в области распределенных информационных систем высокой надежности, а также существенно продлевает время жизни и актуальность разрабатываемых прикладных программных систем.
В свою очередь развитие теории вопроса построения линейно масштабируемых информационных систем и Grid- вычислений подталкивает многие компании к развитию прикладного ПО для данного сектора ИТ-рынка.
Подобные программные решения для разработчиков и пользователей предлагает целый ряд компаний. В их числе такие продукты, как Tangosol Coherence Data Grid in-memory от компании Tangosol (последняя приобретена Oracle весной 2007 г., и продукт теперь носит название Oracle Coherence Data Grid in-memory), Data Grid/Object Grid — компонент сервера приложений WebSphere Extended Deployment (WAS XD) от IBM, GigaSpaces Enterprise Data Grid от компании GigaSpaces, GemStone GemFire EH Cache от компании GemStone, Terracotta Network Attached Memory от компании Terracotta, продукты Grid Server и Fabric Server от компании Data Synapse, JBoss Cache от компании Red Hat.
Кластерное ПО, ориентированное на работу приложений, называют также виртуализационным кластерным ПО. Термин «кластеризация» в данном случае говорит о том, что приложение для увеличения масштабируемости и надежности исполняется более чем на одном сервере. Виртуализационное кластерное ПО гарантирует работу приложений в режиме кластеризации с максимально возможным уровнем надежности, готовности, масштабируемости и производительности. Это достигается за счет кластеризации объектов и данных в используемом приложении. В самом простом понимании это означает, что объекты и данные, используемые в приложениях, доступны всем серверам, на которых они исполняются (рис. 1).
В чем же новизна этих продуктов и самого подхода к созданию линейно расширяемых прикладных программных систем?
Различные архитектурные подходы
Рынок прикладных распределенных программных систем характеризуется широким спектром продуктов и еще более широким диапазоном различных технологических решений, позволяющих создавать надежные распределенные приложения.
Как правило, современные продукты, фреймворки и технологии ориентированы на работу в многозвенной архитектуре с возможностью выделения в ней основных блоков-звеньев (рис. 2): клиентская часть (тонкие клиенты в виде браузеров, толстые клиенты, созданные с помощью различных средств разработки, Web-приложения), блок исполнения приложений (серверная часть приложений и бизнес-логика приложений), блок хранения и использования данных (различные типы баз данных или серверов регистрации данных).
Традиционный подход, позволяющий увеличить надежность и устойчивость и улучшить масштабирование систем, заключается в кластеризации работы в рамках блока в многозвенной архитектуре. Возможна кластеризация в рамках блока хранения и использования данных за счет применения аппаратных либо программных кластерных решений или кластеризация в рамках блока исполнения приложений за счет специальных технологий балансировки запросов, кластеризации или репликации объектов бизнес-логики. Возможно также сочетание механизмов кластеризации в рамках блоков многозвенной архитектуры, например, использование кластерного ПО Oracle Real Application Cluster для блока хранения и использования данных в комбинации с классическим механизмом кластеризации EJB-объектов (Enterprise Java Beans) на контейнере сервера приложений для блока исполнения приложений.
Традиционный подход решает проблему масштабируемости и надежности прикладных информационных систем, но имеет ряд существенных недостатков. Прежде всего это нелинейность и непредсказуемость основных показателей работы системы при ее масштабировании, а также сложность настройки и трудоемкость обслуживания, когда для различных блоков в многозвенной архитектуре используется разное кластерное ПО.
К сожалению, это не решает многих задач, связанных с работой таких кластерных систем в целом и управлением ими. В идеале инженеры, разработчики и администраторы в распределенном приложении не должны:
- разрабатывать дизайн, специфицировать и кодировать в приложении, как осуществляется разделяемый доступ к данным;
- обрабатывать исключительные ситуации, связанные с управлением (это задача приложения или системы);
- управлять кластером вручную или на уровне кодирования его работы;
- останавливать работу приложения для добавления новых ресурсов или изменения схемы разделяемого доступа к данным;
- использовать консоли для восстановления или масштабирования системы.
Если количество элементов управления растет до бесконечности, стоимость управления в расчете на элемент должна стремиться к нулю, и при этом сбор статистики о работе элементов кластерной системы не должен страдать. Да и сама технология кластеризации должна быть невидима и незаметна в распределенном приложении, насколько это возможно.
Виртуализационное кластерное ПО позволяет избежать недостатков традиционного подхода для целей масштабируемости информационных систем. Это достигается за счет введения в многозвенную архитектуру дополнительного блока виртуализации ПО для решения задач кластеризации и кэширования бизнес-объектов информационной системы (рис. 3).
Возможности кэширования
Начнем с кэширования. Рассмотрим простую аналогию из области аппаратного обеспечения: представим себе процессорный модуль компьютера, в котором процессор подключен напрямую к шине данных без необходимых для работы первичной и вторичной кэш-памяти процессора. Будут ли этот процессорный модуль и весь компьютер работать оптимально? Конечно нет. И процессор, и системная шина без необходимых механизмов выравнивания потоков данных и их кэширования очень часто будут находиться в режиме ожидания данных, и вся система будет работать несбалансированно. Все настолько уже привыкли к мысли о необходимости кэширования данных в аппаратных системах, что преимущество использования кэша практически не требует доказательств. Сегодня уже появились разнообразные аппаратные устройства, основанные на механизмах кэширования для Интернета и выполняющие разнообразные функции — от кэширования Web-данных до использования кэш-памяти в различных системах Интернет-телевидения.
Но как ни странно, до сих пор в архитектуре распределенных многокомпонентных программных систем очень слабо использовались элементы прямого кэширования данных; пожалуй, счастливым исключением можно считать прямое и инвертированное кэширование Web-контента для сугубо утилитарных целей — увеличения скорости доступа к последнему, а также использование экземпляров облегченных баз данных, полностью утилизующих и хранящих данные в памяти компьютера, в качестве средств кэширования данных больших реляционных баз (пример — совместная работа TimesTen In-Memory Database c Oracle RDBMS). Появление виртуализационного кластерного ПО создает такую возможность для распределенных приложений уровня предприятия.
Как все это работает
Как же работает механизм кластеризации объектов в блоке кластеризации и кэширования? Рассмотрим этот механизм на примере продукта Tangosol Coherence Data Grid in-memory, который, пожалуй, представляет собой наиболее типичный продукт категории виртуализационного кластерного ПО. Coherence Data Grid In-Memory — это JCache-совместимое (см. Java-спецификацию JSR-107, http://jcp.org/en/jsr/detail?id=107) распределенное решение для кластеризованных приложений и серверов приложений. Coherence позволяет разделять данные приложений и управлять ими в кластерной системе (группе из нескольких аппаратных серверов) так же, как если бы все данные использовались на одном сервере.
Все данные на различных серверах в реальном режиме времени находятся в оперативной памяти серверов. Это достигается за счет скоординированного обновления данных и обмена данными между различными серверами с использованием специального механизма конкурентного контроля их обновления, репликации и механизма обновления данных в кластерной системе, на основе высокопроизводительного протокола обмена данными и отправления учетных данных об обновлении информации на каждом из серверов в кластере любому из серверов, который затребует эти данные.
Чтобы получить доступ к данным и изменить их, разработчики могут использовать особенности Coherence через стандартный интерфейс Java Collections API, входящий в стандартный, свободно распространяемый набор библиотек Java Standard Edition Software Development Kit (Java SE SDK).
Можно также использовать стандартную модель событий для объектов типа Java Bean, чтобы получать уведомления об изменении данных на разных серверах в кластере. Механизм управления HTTP-сессиями доступен (он встроен в сам продукт по умолчанию), и в принципе его применение не требует никаких модификаций приложений. Кроме того, Coherence независим от используемой аппаратной платформы.
В ряде случаев, если в системе не используются контейнеры серверов приложений, Coherence может работать без них. Согласитесь, что подчас это удобно — реализовать многоуровневую распределенную прикладную систему без контейнеров серверов приложений.
Блок кластеризации и кэширования состоит из совокупности процессов, работающих под управлением различных виртуальных машин Java на разных компьютерах и аппаратных платформах. При создании объекта в области кэширования процесса на какой-либо виртуальной машине Java создаются копии — клоны данного объекта в других областях кэширования.
Объект в области кэш-памяти хранится в виде обыкновенной хэш-пары — имя объекта и сам объект. Простота способа виртуального хранения данных позволяет применять Coherence с различными вариантами базового ПО для разработки приложений — Java, .NET, C++. Соответственно и объектами для кластеризации могут быть стандартные объекты Java, .NET и С++. Единственным требованием к используемым объектам в Coherence остается принципиальная возможность сериализоваться, т. е. возможность записать или сохранить эти объекты в бинарной форме. Для инициализации кэша, размещения и удаления объектов в кэш существует достаточно простой и понятный API. Чтобы удобнее было работать с кластеризованными кэшированными объектами, данный API расширен за счет возможностей фильтрации объектов и средств управляемого доступа к ним. С помощью стандартной JMX-консоли или компонента JConsole из состава Java SE SDK можно получить непосредственный доступ к управляющим продуктам MBeans.
Созданные клоны объектов в памяти на различных экземплярах виртуальных машин Java и на разных компьютерах гарантируют сохранение объекта в блоке кластеризации и кэширования в том случае, если первичный объект, созданный в области кэш-памяти, или процесс виртуальной машины Java будут разрушены либо пострадают, или если даже сам физический компьютер в ходе работы будет остановлен либо выведен из строя.
Объект в области кэша появляется по запросу из клиентского блока приложения или создается на основе данных из блока хранения и использования данных, в том числе при помощи различных систем (фреймворков) доступа к базам данным (например, ТopLink, TopLink JPA, Hibernate, Spring и других). Совместная работа Coherence cо средами Data Access Object (DAO) позволяет интегрировать продукт в распределенные системы и устранить узкие места, связанные с обменом данными между уровнем базы данных и объектным промежуточным слоем прикладных систем (рис. 4).
Для синхронизации объектов и данных, создающихся на различных экземплярах виртуальных машин Java, используется специализированный протокол TCMP (Tangosol Cluster Management Protocol) — встроенный IP-протокол, представляющий собой комбинацию обмена данными по UDP/IP и TCP/IP. Протокол TCMP поддерживает функции нахождения новых экземпляров продукта, кластерного управления и передачи данных.
Внутренняя структура кэша в Coherence достаточно сложна, что необходимо для реализации механизма кластеризации объектов. По типу внутренней структуры кэш-памяти выделяется шесть основных ее типов. По типу элементов разделяемой топологии выделяются области логического кэша, первичного и вторичного кэша, области архивирования объектного кэша (рис. 5).
Развитая внутренняя топология кэш-памяти позволяет создавать различные архитектурные и пространственные топологии кэша и кластерные решения на их основе, ориентированные на конкретные прикладные системы. Таким образом, максимально эффективная топологическая конфигурация продукта в большой степени зависит от типа и предназначения конкретной прикладной системы.
Coherence может существенно увеличить масштабируемость и надежность критических систем и приложений, чтобы обеспечить быстрый и надежный доступ к часто используемым важным данным. Продукт позволяет разработчикам выдвинуть данные ближе к приложениям, ускоряя тем самым доступ к ним и улучшая утилизацию.
За счет автоматического и динамического разделения данных в памяти большого количества серверов Coherence обеспечивает практически 100%-ную готовность данных к их утилизации в прикладных системах, а также их целостность даже в случаях аппаратных проблем и отказов в программно-аппаратных комплексах.
Комбинируя локальное размещение и обработку данных с встроенными возможностями обмена данными по протоколу TCMP, продукт позволяет проводить анализ данных в реальном времени, grid-вычисления в оперативной памяти серверов, параллельную транзакционную обработку данных и обработку событий в реальном времени.
Продукт выпускается в нескольких редакциях — стандартной, расширенной и Grid. Редакции отличаются своими функциональными возможностями начиная от поддержки простой кластерной кэширующей конфигурации работы приложений до возможности создания сложной распределенной системы на основе Data Grid (рис. 6).
Резюме
Различное виртуализационное кластерное ПО, представленное на ИТ-рынке, имеет и общие функциональные черты, и свою специфику, но все оно призвано решать задачи создания распределенных кластерных прикладных систем и инфраструктуры приложений реального времени исполнения. Все это ПО базируется на принципе учета нестабильности отдельных компонентов в прикладной системе (failover principle) и в этом смысле хорошо согласуется с механизмами кластеризации компонентов промежуточного слоя и серверов приложений. Мы наблюдаем сегодня переход от кластерного ПО для отдельных элементов распределенных программных систем к виртуализационному кластерному ПО, ориентированному на работу приложений и призванному обеспечить высокую линейную масштабируемость, расширяемость, надежность и управляемость для распределенной прикладной программной системы как для единого целого.