Oracle Coherence

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 01:52, 23 января 2019.

Oracle Coherence - ключевой компонент Oracle Database, представляющий распределенную обработку данных в памяти компьютеров. Продукт позволяет организациям с высокой уверенностью масштабировать критически важные приложения, обеспечивая быстрый и надежный доступ к часто используемым данным. Автоматическое и динамическое разбиение данных в памяти в рамках многочисленных серверов обеспечивает непрерывную доступность данных и их целостность в процессе транзакций, даже в случае отказа сервера [Источник 1].

Как и любая другая совместно используемая инфраструктура, продукт Oracle Coherence совмещает данные «в памяти» и локальную вычислительную мощность с целью проведения анализа в режиме реального времени, grid-вычислений «в памяти», параллельных транзакции и обработки событий.

Особенности

  • Масштабируемость приложений с прогнозированием — обеспечивает линейную и динамическую масштабируемость с целью спрогнозировать затраты и усовершенствовать использование ресурсов
  • Улучшенные уровни обслуживания — позволяют значительно ускорить темпы транзакций, сокращая при этом время отклика приложений.
  • Обеспечивает Extreme Transaction Processing (XTP) — совмещает возможности распределенных данных и мощь технологии grid- вычислений с целью обеспечить быструю, надежную и высококачественную обработку транзакций
  • Кроссплатформенность решений совмещенное с поддержкой несколько высокоуровневых языков, а именно С++, .Net, Java.

Преимущества

  • Производительность — Oracle Coherence решает проблему медленного доступа к данным путем перемещения их ближе к приложениям в памяти для эффективного доступа.
  • Надежность — Oracle Coherence построена на основе отказоустойчивой сетки, что позволяет получать надежные и точные данные. Oracle Coherence сводит к минимуму потребность в дополнительных запросах на сервер за подтверждением надежности данных.
  • Масштабируемость — Oracle Coherence обеспечивает линейную масштабируемость и более эффективное использование ресурсов с помощью высоко эффективных алгоритмов вычисления стоимости. Для многих приложений, она предлагает прямой подход к повышению эффективности. Oracle Coherence дает возможность обслуживать постоянно растущее нагрузки без риска потери данных или прерывания обслуживания.

Где работает Coherence

  • Клиенты сервисов - Кеширование данных для всех типов клиентов: браузер, мобильные приложения и другие.
  • Приложения - Параллельная обработка больших объемов данных, распределенные вычисления, события.
  • Провайдеры сервисов - Кеширование данных на стороне провайдера и агрегация гетерогенных источников данных.

Аспекты работы

  • Кэширование — Применение кэша в data grid, избегая дорогостоящих запросов на back-end. Использование общего пространства кеш данных для приложений позволяет увеличить производительность на порядок.
  • Аналитика — Анализ запросов и данных в памяти, используя массовые параллельные возможности data grid. Oracle Coherence из коробки осуществляет поддержку поиска, агрегирования и сортировки данных, с возможностью пользовательских аналитических функций. Так же гарантирует, что серверные сбои или снижение темпов работы не влияют на результаты расчетов.
  • Транзакции — Непревзойденное сочетание масштабируемости иmпроизводительности делает Oracle Coherence оптимальным решением для обработки экстремальных транзакций. Хранение в памяти и репликации данных гарантируется согласованность, что означает он подходит для управления операциями в памяти до тех пор, пока они сохраняются на внешних хранителях для представления отчетности.
  • События — Oracle Coherence обеспечивает реагирования в режиме реального времени для изменения данных на всем data grid. Каждая транзакция может вызвать много событий, каждое из которых, возможно, необходимо будет обрабатываться в течение нескольких миллисекунд. Oracle Coherence обеспечивает разные стратегии обработки интенсивных событий, в том числе на стороне сервера, потоки обработки и интерактивные технологии, такие как «непрерывный запрос» в реальном масштабе времени

Основные понятия

Нод (кэш) — java процесс с конфигурационными файлами. Можно запустить несколько нодов на одной/разных машинах, под одним или разными пользователями без ограничений [Источник 2]. Кластер — набор нескольких нодов. В кластере всегда есть мастер-нод, который смотрит за тем, что происходит с кластером (сколько нодов есть, какие из них хранят данные и т.д.). Мастер-нод — это первый нод, который стартовал. Вычисления выполняются на нодах, где лежат требуемые данные.

Прокси (extend) ноды — ноды, которые используются для того, чтобы обеспечить доступ к кластеру со стороны клиентов. Конфигурация должна быть сделана как на стороне сервера, так и на стороне клиента.

Ноды для хранения данных (storage nodes) — ноды, над которыми производятся вычисления.

Вычислительные ноды (application tier/storage disabled nodes) — ноды, которые используется для того, чтобы равномерно распределить вычисления на кластер. На этих нодах можно также кэшировать промежуточные вычисления.

Локализация данных (data affinity) — данные, сгруппированные вместе по какому-либо принципу. Можно сгруппировать данные таким образом, что ноды, находящиеся на одной физической машине, будут иметь зависимые данные. В этом случае не будут задержки сети и вычисления будут происходить быстрее.

Механизмы отправки задачи на выполнение

  • Агрегатор(EntryAggregator) — это задача, которая будет выполнена над копиями данных.
  • Процессор(EntryProcessor) — эта задача, которая предполагает изменения данных внутри кэша.
  • InvocationService — это задача уровня нода.
  • MapListener — эта задача будет выполнена асинхронно, как реакция на события на уровне кэша.

POF (portable object format) сериализация — все данные в кластере хранятся в байтовом массиве. Поля сериализованного объекта хранятся последовательно (у каждого поля свой индекс). Внутри байтового массива поля сохраняются последовательно. Данные объекта, записываемые в массив, могут быть вложенные и иметь свою сериализацию. При реализации интерфейсов PortableObject и PofSerializer, иерархическая структура java-объекта переводится в плоскую структуру байтового массива.

Извлечение данных из кластера (ValueExtractor) — для того, чтобы извлечь данные, нужно написать класс, который реализует интерфейс ValueExtractor. Coherence будет использовать этот класс для того, чтобы достать необходимую часть сериализованного объекта и представить его виде класса, с которым вы можете работать.

Партишн (partition) — Coherence предоставляет возможность хранить данные в виде «ключ-значение», но ключ и значение — это логические понятия системы. На физическом уровне данные группируются в партишн. То есть, несколько ключей и значений могут принадлежать одной партишн. Партишн является единицей хранения данных. Когда ноды падают и данные перегруппируются между нодами, партишн копируется целиком.

Индекс — индекс в Coherence используется для ускорения поиска данных. Индекс — это структура уровня нода. То есть, когда данные копируются с одного нода на другой, индекс не будет скопирован, вместо этого он будет изменён в соответствии с данными, которые находятся на этом ноде. Данные в индексе хранятся в десериализованном виде, поэтому если у вас есть необходимость достать данные быстро и без десериализации, создайте индекс. Индекс состоит из двух под-индексов (прямой и обратный). Прямой индекс хранит данные В виде ключ->значение (которое предоставил экстрактор), обратный индекс хранит данные в виде значение-> множество ключей.

Сервис — это группа java-потоков которые отвечают за коммуникацию с другими нодами кластера, выполнение задач, присланных на выполнение для хранимых данных, копирование данных в случае отказа других нодов, а также другие задачи обслуживания данных.

Кластерное кеширование

Секционирование

  • Данные распределяются в памяти серверов кластера
  • Данные автоматически и синхронно реплицируются с одного сервера на другой для постоянной доступности
  • Единый взгляд на данные: Логическое представление всех данных на всех серверах

Отказоустойчивость

  • Сервера контролируют работоспособность друг друга
  • Если сервер падает или неправильно работает, другие сервера совместно диагностируют его состояние

Непрерывность

  • Работоспособные сервера немедленно берут на себя обязанности упавшего сервера
  • В случае падения сервера не происходит прерывания работы или потери данных

Технология разделения данных

Доступ к данным

На рисунке 1 представлена схема доступа к данным.

  • Данные распространяются и резервируются между узлами
  • Прозрачно для разработчиков
  • Узлы имеют доступ ко всем данным
Рисунок 1 - Доступ к данным

Обновление данных

На рисунке 2 представлена схема обновления к данным.

  • Синхронное обновление
  • Предупреждение потенциальной потери и разрушения данных
  • Предсказуемая производительность
  • Резервные разделы выбираются далеко от первичных
  • Не требуется настроек для установки первичных и резервных разделов
  • Автоматическое и динамически управляемое
Рисунок 2 - Обновление данных

Восстановление данных

На рисунке 3 представлена схема восстановления данных.

  • Изменение состава узлов (новые узлы добавляются или старые покидают)
  • Другие узлы параллельно, восстанавливаются / перераспределяются
  • Запущенные операции продолжают выполняться
  • Бывают задержки (из-за более высокого приоритета восстановления)
  • Надежность, Масштабируемость, Производительность – приоритетные задачи
Рисунок 3 - Восстановление данных

Топология развертывания

Механизм для организации данных часто называют топологией или более в общем случае схемой. Coherence поставляется с несколькими стандартными схемами, такими как replicated, distributed и near [Источник 3].

Некластеризуемый локальный (replicated) кэш

Это кэш, в котором все данные хранятся в десериализованном виде на каждом из нодов. Данный тип кэша с ограниченным размером, который предоставляет самые быстрые операции чтения, но медленные операции записи. Совместим с другими схемами Coherence.

Распределенная (distributed) схема

Основной тип кэша, который используется для хранения данных. Позволяет преодолеть ограничения по размеру оперативной памяти, выделенной на отдельный нод. Каждый нод имеет логический доступ ко всем записям. Этот тип кэша также предоставляет горизонтальную масштабируемость за счёт включения новых нодов в кластер, а также отказоустойчивость за счёт хранения копии данных на других нодах.

Ближняя схема (Near)

Гибридный тип кэша, который конфигурируется на вызывающей стороне (вызывающая сторона может быть как клиент так и другой нод внутри кэша). Как правило, этот кэш «стоит» перед distributed кэшем, и хранит наиболее часто используемые данные. Данные хранятся в десериализованном виде.

Класс NamedCache

Класс NamedCache является основным интерфейсом, используемым приложениями для получения и взаимодействия с экземплярами кэша. [Источник 4] NamedCache может использовать распределенный (Distributed) кэш или другую топологию. Класс логически эквивалентен таблице в базе данных, может создаваться динамически и содержать любой сериализуемый объект. При необходимости запускается базовый сервис кэша.

import com.tangosol.net.*;
...
NamedCache cache = CacheFactory.getCache("MyCache");

Coherence сканирует XML-файл конфигурации кэша для сопоставления имен для MyCache. Файл конфигурации кэша Coherence содержит (в простейшем случае) набор сопоставлений (от имени кэша до схемы кэша) и набор схем кэширования. Кэш-ключи и значения должны быть сериализуемыми (например, java.io.Serializable).

Конфигурация кэшей

По умолчанию используются конфигурационные файлы из coherence.jar. Конфигурационные файлы следует менять под конкретную задачу. Существует 3 основных конфигурационных файла, с которыми можно работать:

  • tangosol-coherence.xml — файл отвечает за конфигурацию кластера в целом
  • coherence-cache-config.xml — файл отвечает за конфигурацию различных кэшей, которые кластер будет обслуживать
  • coherence-pof-config.xml — файл предназначен для того, чтобы определить, какие данные будут обрабатываться кластером. Также, в этом файле определяется, каким образом данные будут сериализироваться для передачи и хранения в кластере.

Запуск Coherence

Cоздается базовый кластер, который содержит три отдельных процесса Java: сервер кеша и два экземпляра фабрики кэша. Для простоты три процесса объединены на одном компьютере. Кэш-сервер по умолчанию настроен для хранения данных резервного копирования. По мере запуска каждого процесса они автоматически присоединяются и становятся членами кластера (также называемыми узлами кластера).

Для этого примера конфигурация Coherence слегка изменена для создания уникального кластера, который гарантирует, что эти члены кластера не будут пытаться присоединиться к существующему кластеру Coherence, который может работать в сети.

Создание базового кластера

  1. С помощью текстового редактора открыть скрипт COHERENCE_HOME / bin / cache-server.
  2. Изменить переменную java_opts, чтобы включить свойства tangosol.coherence.cluster и свойства tangosol.coherence.clusterport:
    set java_opts = "- Xms% memory% -Xmx% memory% -Dtangosol.coherence.cluster = cluster_name-Dtangosol.coherence.clusterport = port"
    Заменить name_claster и port на значения, уникальные для этого кластера.
  3. Сохранить и закрыть скрипт кеш-сервера.
  4. Повторить шаги с 1 по 3 для скрипта COHERENCE_HOME / bin / coherence.
  5. Запустить скрипт кэша-сервера. Начинается кеш-сервер и выдается выход, который предоставляет информацию об этом члене кластера.
  6. Запустить 2 экземпляра скрипт coherence. По мере запуска каждого экземпляра выдается выход, который предоставляет информацию о соответствующих членах кластера. Каждый экземпляр возвращает командную строку для инструмента командной строки.

На этом этапе кеш создается и размещается в базовом кластере. Простая строка вводится в кеш с помощью инструмента командной строки первого экземпляра фабрики кэша. Затем строка извлекается из кеша с помощью инструмента командной строки второго экземпляра фабрики кеша. Пример упрощен и не очень практичен, но он быстро демонстрирует распределенный характер кэшей Coherence. Более того, эти шаги обычно выполняются непосредственно с использованием API Coherence.

Создание кеша

  1. В командной строке для экземпляра фабрики кэша создайте кэш с именем Test с помощью команды cache:
    cache Test
  2. В командной строке используйте команду put, чтобы поместить простую строку в новый кеш, введя пару ключ / значение (разделенное пробелом):
    put key1 Hello
    Команда возвращает и отображает null. Команда put всегда возвращает предыдущее значение для заданного ключа. Значение null возвращается, потому что это первое значение, введенное для этого ключа.
  3. Переключитесь на другой экземпляр фабрики кеша и в командной строке создайте кэш проверки с помощью команды кэша:
    cache Test
  4. Из этой командной строки извлеките строку в кеше с помощью команды get и введите имя ключа:
    get key1
    Команда возвращает и отображает Hello. Любой заводский процесс кэша может добавлять или удалять записи кэша, потому что процессы являются частью одного и того же кластера, и поскольку кеш тестирования известен всем членам кластера. Кроме того, поскольку кэш-сервер хранит резервную копию данных кэша, может быть завершен заводский процесс кэша (или оба), и данные кэша сохраняются.

Доступ к данным

Механизм хранения данных

Coherence управляет данными парами ключ-значение (key-value) или ключ-объект (key-object) (рисунок 4). Ключ и объект могут быть любым типом данных. Нет служебной схемы или словаря, пользователь только должен определить объекты и типы данных. Нет SQL или другого языка запросов, запросы пишутся внутри приложения, используя классы и их методы. Для управления данными используется класс NamedCache.

Рисунок 4 - Интерфейс запроса

Запрос к кэшу

Для запроса есть возможность создать индексы (глобальны для кэша). Исполнение обработчиков запросов в контексте записей, коллекций или фильтров происходит параллельно.

События

Coherence поддерживает две модели программирования событий, которые позволяют приложениям получать уведомления об операциях кластера и реагировать на них. Приложения рассматривают события как логические понятия независимо от того, какой компьютер вызвал событие. События предоставляют общий способ расширения согласованности с логикой конкретного приложения. Модели программирования событий:

  • Live Events - модель использует пользовательские перехватчики событий, зарегистрированные для получения различных типов событий. Приложения решают, какие действия предпринять в зависимости от типа события. Многие события, доступные с помощью событий map, также поддерживаются с помощью событий live.
  • Map Events - модель использует определяемые пользователем прослушиватели Map, которые присоединены к базовой реализации Map. События карты предлагают настраиваемые серверные фильтры и упрощенные события, которые могут минимизировать сетевой трафик и обработку. Прослушиватели карт следуют парадигме JavaBean и могут различать события системного кэша (например, исключение) и события кэша приложений (например, операции get/put).

Уровни кэшей

Кэш-сервис в Coherence имеет три разных уровня:

  • Client View - представляет собой виртуальный уровень, обеспечивающий доступ к лежащим в основе секционированным данным. Доступ к этому уровню обеспечивается с помощью интерфейса NamedCache. В этом слое вы также можете создавать синтетические структуры данных, например, NearCache
  • Storage Manager - это серверный уровень, который отвечает за обработку запросов, связанных с кешем, из клиентского уровня. Он управляет структурами данных, которые содержат фактические данные кеша (первичные и резервные копии), а также информацию о блокировках, прослушивателях событий, триггерах карт и т.д.
  • Backing Map - это структура данных на стороне сервера, которая содержит фактические данные

Кэширование источников данных

Coherence поддерживает кэширование для чтения / записи любого источника данных, включая базы данных, веб-службы и файловые системы, однако базы данных являются наиболее распространенным вариантом использования. Кэши должны поддерживать интенсивные операции операции чтения / записи, кэш и база данных должны быть полностью синхронизированы. Виды кэширований:

  • Read-Through - когда приложение запрашивает в кэше запись, например, ключ X, а X не находится в кэше, Coherence автоматически делегирует CacheStore и просит его загрузить X из базового источника данных. Если X существует в источнике данных, CacheStore загружает его, возвращает его в Coherence, затем Coherence помещает его в кэш для будущего использования и, наконец, возвращает X в код приложения, который его запросил. Это называется сквозным кэшированием. Функциональность кэширования с опережением может дополнительно повысить производительность чтения (за счет уменьшения предполагаемой задержки).
  • Write-Through - Coherence может обрабатывать обновления источника данных двумя различными способами, первым из которых является сквозная запись. В этом случае, когда приложение обновляет часть данных в кеше (то есть вызывает put (...), чтобы изменить запись в кеше), операция не завершается (то есть, put не возвращается) до согласованности прошел через кэш-хранилище и успешно сохранил данные в базовом источнике данных. Это совсем не улучшает производительность записи, так как вы все еще имеете дело с задержкой записи в источник данных
  • Write-Behind - измененные записи кэша асинхронно записываются в источник данных после заданной задержки, будь то через 10 секунд, 20 минут, день, неделю или даже дольше. Это относится только к вставкам и обновлениям кэша - записи кэша синхронно удаляются из источника данных. Для кэширования с обратной записью Coherence поддерживает очередь с обратной записью данных, которые должны быть обновлены в источнике данных. Когда приложение обновляет X в кэше, X добавляется в очередь с обратной записью (если ее там нет; в противном случае она заменяется), и после указанной задержки обратной записи Coherence вызывает CacheStore для обновления основного источника данных. с последним состоянием X.
  • Refresh-Ahead - Coherence позволяет разработчику настроить кэш для автоматической и асинхронной перезагрузки (обновления) любой недавно доступной записи в кэш из загрузчика кэша до истечения срока его действия. В результате после того, как часто используемая запись вошла в кэш, приложение не ощущает влияние чтения на потенциально медленное хранилище кэша, когда запись перезагружается из-за истечения срока действия. Асинхронное обновление запускается только при доступе к объекту, который находится достаточно близко к его времени истечения - если к объекту обращаются после его истечения, Coherence выполняет синхронное чтение из хранилища кэша, чтобы обновить его значение.

Дополнения к Coherence

Coherence*Web

  • Распределенное управление HTTP-сессиями
  • «Бесшовное» разделение сессий между приложениями
  • Разделение сессий между серверами приложений WebLogic, OAS, WebSphere, JBoss*
  • Обработка объемных сессий - хранение большого количества информации в сессии (возможно это ошибка проектирования приложения)
  • Обработка большего числа пользователей без добавления новых серверов приложений
  • Перезагрузка/обслуживание приложений/контейнеров без потери состояния сессий
  • Хранение данных в сессии надежно при высокой нагрузке

Coherence*Extend

  • Расширение позволяет клиентским приложениям присоединяться к кластеру по протоколу TCP
  • Coherence включает в себя встроенный proxy server, который управляет TCP/IP соединениями
  • Клиент может быть настроен таким образом, что в случае отказа сервера, его запросы будут переброшены на другой IP адрес
  • Приложение написано не на Java (поддерживается C#, .NET, и C++)
  • Требует высокой полосы пропускания сети, в зависимости от транзакционной загрузки системы

Coherence.NET

  • Клиентская библиотека .NET 1.1 и 2.0 для Coherence*Extend
  • «Родная» реализация .NET – нет необходимости запускать JVM через JNI
  • Полный функциональный эквивалент клиенту на Java
  • Так же включает в себя реализацию ASP.NET Session-State Store Provider для хранения объектов ASP.NET HTTP-сессий в Data Grid

Системные требования

Минимальные требования для запуска установщика Coherence:

  • 300 МГц CPU
  • 512 Мбайт пространства подкачки
  • 256 цветной монитор (требуется только для установки на основе графического интерфейса)
  • Java Development Kit (JDK) 1.6.0_4 или новее

Минимальные системные требования для выполнения Coherence в среде разработки:

  • 100 МБ дискового пространства для полной установки (включая документацию и примеры API)
  • 1 ГБ ОЗУ (при максимальном размере кучи Java размером 512 МБ)
  • Кэш-серверы и клиенты - JVM 1.7 или новее
  • Расширение клиентов - JVM 1.6 или новее
  • Windows или UNIX-система, поддерживающая требуемую версию Java
  • Сетевой адаптер

Источники

  1. Oracle Coherence // Официальный сайт [1998-2018]. Дата обновления: 22.10.2018. URL: https://www.oracle.com/technetwork/middleware/coherence/overview/oracle-coherence-12c-data-sheet-2227284.pdf?ssSourceSiteId=ocomen (дата обращения: 01.11.2018)
  2. Основные понятия // Об Oracle Coherence [2003-2018]. Дата обновления: 11.10.2018. URL: https://habr.com/post/245057 (дата обращения: 01.11.2018)
  3. Стандартные схемы // Oracle Big data [2001-2018]. Дата обновления: 01.07.2018. URL: https://idc-cema.com/dwn/SF_75945/07_2_oracle_big_data_grigoriy_sen.pdf (дата обращения: 01.11.2018)
  4. Документация // Developing Applications with Oracle Coherence [1998-2018]. Дата обновления: 20.10.2018. URL: https://docs.oracle.com/middleware/1212/coherence/COHDG/preface.htm#COHDG4970 (дата обращения: 01.11.2018)