Статьи

Представляем Infinispan Data Grid Platform

Целью этой серии из двух частей является ознакомление читателя с Infinispan , новой открытой исходной платформой , лицензированной по сетке данных LGPL .   Первая часть будет посвящена обзору объема и возможностей Infinispan, а также примерам использования и краткому обзору API.   Следующая вторая часть будет посвящена архитектуре, более продвинутым API и расширению Infinispan.

Что такое Infinispan?

Infinispan — это одноранговая платформа IMDG, созданная для виртуальной машины Java (JVM).   Я впервые публично объявил о проекте в апреле 2009 года, и вскоре последовала череда альфа- и бета-релизов.   Проект основан на опыте, накопленном в JBoss Cache , популярной библиотеке кластерного кэширования, и в то время как JBoss Cache использовался в качестве «живого прототипа» для Infinispan — места для сбора идей, проектов, моделей использования и потребностей сообщества — он никоим образом не связан с   JBoss Cache и не зависит от него . 

Хотя между JBoss Cache и Infinispan есть несколько отличий, наиболее существенным отличием является область применения.   JBoss Cache специализируется на том, чтобы быть кластерной библиотекой кеширования, а Infinispan — платформой сетки данных, в комплекте с инструментами управления графическим интерфейсом и возможностью масштабирования до тысяч узлов.   В то же время Infinispan также выполняет требования кластерной библиотеки кэширования и даже работает исключительно как автономный некластеризованный кэш.   Чтобы помочь существующим пользователям JBoss Cache, Infinispan предлагает легкий путь миграции.

Характеристики

Предстоящий выпуск Infinispan — 4.0 — интересно, почему наш первый выпуск так нумеруется? Посмотрите на этот FAQ

Текущий выпуск: 4.0

Этот выпуск предлагает следующие функции:

API-интерфейсы

  • Знакомый Map-подобный API ( org.infinispan.Cache расширяет java.util.concurrent.ConcurrentMap )
  • Альтернативный JBoss Cache-совместимый древовидный API
  • RESTful API для удаленного доступа
  • Поддержка клиентов не JVM через RESTful API

Режимы работы

  • Кластерные и некластеризованные (автономные) режимы работы
  • Кластерные режимы работы включают аннулирование, репликацию и распространение, используя как синхронные, так и асинхронные сетевые коммуникации.
  • Распределение с дополнительным кэшированием L1 («почти кэширование») уменьшает задержку в сети для частых поисков, сохраняя масштабируемость распределения

 Поддержка транзакций JTA

  • Infinispan — это ресурс XA, совместимый с любым JTA-совместимым менеджером транзакций

Кэширование сквозной записи в подключаемые CacheStores

  • Может быть настроен для обеспечения «теплых запусков»
  • Поставляется с высокопроизводительными реализациями CacheStore для дисков, JDBC и облачных хранилищ
  • Поддержка пользовательских реализаций
  • Также полезно как пространство переполнения, если памяти мало

Выселение и истечение срока

  • FIFO и LRU основанная политика выселения
  • Истечение срока действия данных в зависимости от продолжительности жизни и времени простоя

управление

  • JMX статистика и мониторинг
  • Управление графическим интерфейсом на основе JOPR

Высокопроизводительный пользовательский уровень маршалинга для быстрой сериализации и десериализации с минимальными издержками

Будущие релизы

Посетите страницу дорожной карты проекта Infinispan, чтобы просмотреть дорожную карту проекта и узнать, что ожидает будущие выпуски, включая JPA-подобный API, клиент-серверный модуль, возможности запросов и выполнение распределенного кода.

Начало работы с Infinispan

 

демос

Хорошее место для начала — скачать дистрибутив Infinispan . В дистрибутив входит несколько демонстрационных приложений, в том числе на основе графического интерфейса для визуализации состояния, перемещающегося по сетке.

1.    Загрузите дистрибутив Infinispan. Например,

$ wget http://sourceforge.net/projects/infinispan/files/infinispan/4.0.0.CR2/infinispan-4.0.0.CR2-bin.zip/download

2. Распакуйте архив

$ unzip infinispan-4.0.0.CR2-bin.zip

3. Запустите демонстрацию GUI, вызвав скрипт runGuiDemo.sh, поставляемый с дистрибутивом (или runGuiDemo.bat на платформах Windows)

$ infinispan-4.0.0.CR2/bin/runGuiDemo.sh

4. Консоль графического интерфейса должна загрузиться, и вы увидите что-то вроде кадра ниже:

Нажатие на кнопку START CACHE запустит экземпляр кэша, завернутый в кадр.

5. Естественно, один экземпляр имеет ограниченное использование — вещи веселее, когда в кластере несколько экземпляров кеша. Вызов сценария runGuiDemo.sh еще несколько раз создаст больше кадров GUI, и вы сможете запустить их все. Например, запустив еще два графических интерфейса, мы видим, что кэши обнаруживают друг друга и образуют кластер.

Вы можете запустить столько экземпляров кэша, сколько пожелаете.

6. Теперь вы можете использовать один из экземпляров для генерации данных. 

7. Вы видите, что эта запись была добавлена ​​в кеш:

8. Вы сможете извлечь этот ключ из любого из фреймов в кластере:

 

Использование Infinispan в вашем проекте

Самый простой способ сделать это — использовать Maven и добавить зависимости к модулям Infinispan в POM вашего проекта. В качестве альтернативы вы можете скачать дистрибутив и получить необходимые jar-файлы для включения в ваш проект.

Чтобы использовать Infinispan с Maven, просто добавьте следующее в pom.xml вашего проекта:

<dependencies>
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-core</artifactId>
<version>4.0.0.CR2</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>repository.jboss.org</id>
<url>http://repository.jboss.org/maven2</url>
</repository>
</repositories>

С этого момента вы сможете создавать экземпляры кэша и использовать его:

//1.  Create a configuration
Configuration cfg = new Configuration();

// ... Customize your configuration as you wish.
// ... Defaults to LOCAL mode.

CacheManager mgr = new DefaultCacheManager(cfg);

//2. Let's create a stock price cache, keyed on String
Cache<String, Float> stockPriceCache = mgr.getCache("strockPriceCache");

//3. Let's check if we have the price of IBM, and if not,
// retrieve and cache it
String ticker = "IBM";
Float value;
if (stockPriceCache.containsKey(ticker)) {
value = stockPriceCache.get(ticker);
} else {
value = getStockPriceFromTheInternet(ticker);
stockPriceCache.put(ticker, value);
}

System.out.printf("Got the price of %s as %s", ticker, value);

 
Мы поддерживаем интерактивное интерактивное учебное пособие, которое поможет вам выполнить основные этапы создания кэша и его использования. Для большего количества примеров мы рекомендуем это как хорошую отправную точку, и, вероятно, очень хорошая идея иметь документацию Infinispan API под рукой, когда вы делаете это. Такое изучение API — отличный способ быстро освоить Infinispan.

Настройка вашего кеша

Онлайн-руководство по настройке — ваш друг здесь. XML-файл конфигурации Infinispan прост в использовании, особенно с хорошим XML-редактором, ссылающимся на схему XSD. Все элементы в этом файле являются необязательными, при этом разумные значения по умолчанию выбраны для любого пропущенного элемента. Пожалуйста, обратитесь к
справочнику конфигурации для деталей.

 

Перенос конфигураций

Дистрибутив Infinispan поставляется с инструментами для переноса файлов конфигурации кэша из JBoss Cache, EHCache и Oracle Coherence в файлы конфигурации Infinispan. Это может быть полезной отправной точкой, если вы рассматриваете Infinispan в качестве замены одной из этих систем кеша.  Информацию об этих инструментах можно найти здесь .

Использование REST API

Хотите подключиться к бэкэнду Infinispan с помощью REST API? Загрузите REST-сервер для Infinispan! Это в форме файла WAR, который может быть развернут в большинстве контейнеров сервлетов.

1. Загрузите сервер Infinispan REST

$ wget http://sourceforge.net/projects/infinispan/files/infinispan/4.0.0.CR2/infinispan-4.0.0.0.CR2-server-rest.zip/download

2. Распакуйте архив

$ unzip infinispan-4.0.0.CR2-server-rest.zip

3. Разверните веб-приложение в своем любимом контейнере сервлетов или на сервере Java EE.

$ cp infinispan-4.0.0.CR2/webapp/infinispan.war $JBOSS_HOME/server/default/deploy/

4. Запустите контейнер сервлетов или сервер Java EE.

Теперь сервер Infinispan REST должен прослушивать имя хоста и порт, которые вы использовали для настройки контейнера сервлетов или сервера Java EE. Например, на http: // localhost: 8080 / infinispan

5. Подключение к вашему REST-серверу легко — вот пример использования Python:

import httplib
hostname = "localhost:8080"

#putting data in
conn = httplib.HTTPConnection(hostname)
data = "SOME DATA HERE !" #could be a string, or a file ...
conn.request("POST", "/infinispan/rest/Bucket/0", data, {"Content-Type":
"text/plain"})
response = conn.getresponse()
print response.status

#getting data out
conn = httplib.HTTPConnection(hostname)
conn.request("GET", "/infinispan/rest/Bucket/0")
response = conn.getresponse()
print response.status
pring response.read()

 

Или используя Ruby:

require 'net/http'

http = Net::HTTP.new('localhost', 8080)

#Create new entry
http.post ('/infinispan/rest/MyData/MyKey', 'DATA HERE', {"Content-Type" =>
"text/plain"})

#get it back
puts http.get ('/infinispan/rest/MyData/MyKey').body

#use PUT to overwrite
http.put ('/infinispan/rest/MyData/MyKey', 'MORE DATA', {"Content-Type" =>
"text/plain"})

#and remove ...
http.delete('/infinispan/rest/MyData/MyKey')

У нас есть более подробное руководство по использованию сервера REST . Долгосрочная цель этого API — объединиться с усилием REST- * и стандартизировать API для распределенных кэшей через REST.

Управление вашими кешами с помощью JOPR

У нас есть подробное руководство по использованию инструмента JOPR GUI для управления вашими экземплярами кэша. Текущая версия позволяет вам визуально отслеживать работоспособность вашей сетки данных и строить графики различных метрик с течением времени. По мере развития этого инструмента мы надеемся добавить такие функции, как автоматическое предоставление узлов на основе правил, где может быть реализована истинно эластичная природа сетки.

Запрос сетки

В то время как запросы на самом деле запланированы только для 4.1, нашего следующего выпуска, у нас есть технический предварительный просмотр запросов в текущем выпуске 4.0. Имейте в виду, что в качестве предварительного технического описания интерфейс запросов и API могут изменяться, но это дает вам представление о том, чего ожидать. Подробную информацию о техническом предварительном просмотре API запросов, а также инструкции по использованию и пример кода можно найти здесь .

Режимы работы

Здесь мы обсудим различные режимы работы более подробно. 

Автономная операция

В качестве простого автономного кэша для хранения данных, которые дорого получать, например, из базы данных или мэйнфрейма, или пересчитывать, высококонкурентный основной контейнер Infinispan работает исключительно хорошо с минимальными издержками и отлично настроен для многоядерных / многоядерных Процессорные среды. Синхронизация и блокировка сведены к минимуму, обеспечивая одновременную изоляцию транзакций и предлагая все другие функции платформы, включая сквозную запись в CacheStore, удаление и совместимость транзакций JTA.

Кластерная операция

Помимо автономной работы, Infinispan может работать как кластер, где узлы знают о присутствии друг друга и могут взаимодействовать и поддерживать согласованность состояний. Поддерживаются следующие кластерные режимы:

Недействительная сетка данных

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

Реплицированная сетка данных

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

Распределенная сетка данных

Это режим работы кластера по умолчанию в Infinispan, и он использует согласованный алгоритм хеширования, чтобы определить, где ключи должны находиться в кластере. Последовательное хеширование обеспечивает дешевое, быстрое и, прежде всего, детерминированное расположение ключей без необходимости использования дополнительных метаданных или сетевого трафика. Цель распространения — поддерживать достаточное количество копий состояния в кластере, чтобы быть долговечными, но не слишком много копий, чтобы быть масштабируемыми. Таким образом, количество копий каждой записи поддерживается в сетке — numOwnersАтрибут конфигурации — это настраиваемый параметр, который может быть настроен и представляет собой компромисс между производительностью и масштабируемостью и долговечностью данных. Независимо от того, насколько большой кластер, количество копий является фиксированным. Это означает, что такая установка масштабируется линейно, когда узлы добавляются в кластер. Кроме того, добавленная емкость — это реализованная емкость, поскольку добавление большего количества узлов означает, что можно использовать больше используемой памяти. Например, дисконтирование накладных расходов, 200 JVM в таком кластере с размером кучи 1 ГБ каждая и установка numOwners 2 даст вам 100 ГБ адресуемой памяти во всей системе!

Кэширование L1 («близкое кеширование»)

С распределенной сеткой данных нет гарантии, что экземпляр, к которому вы обращаетесь, локально содержит искомую запись. Системе может потребоваться выполнить удаленный вызов к другому узлу кэша, чтобы получить запрошенную запись. Хотя этот удаленный поиск происходит прозрачно, с ним связаны затраты. Чтобы минимизировать эту стоимость в случае повторного поиска на одном и том же ключе, можно включить кэширование L1. Кэширование L1 заставляет запрашивающий узел локально кэшировать полученную запись и прослушивать изменения ключа на проводе. L1-кэшированные записи получают внутренний срок действия для контроля использования памяти. Включение L1 улучшит производительность при повторном чтении нелокальных ключей, но в некоторой степени увеличит потребление памяти.Он предлагает хороший компромисс между производительностью «в основном для чтения» недействительной сетки данных и масштабируемостью распределенной.

Случаи применения

Infinispan может быть использован для ряда целей. 

Автономный кеш данных

Традиционное использование кеша — перед базами данных или другими дорогими, не масштабируемыми хранилищами данных — одно. Такое использование помогает настройкам «в основном для чтения» избавить хранилище данных от перегрузки и обеспечить быстрый доступ с минимальными задержками к считываемым данным.

Набор инструментов кластеризации

Использование в качестве инструментария для кластеризации контейнера, инфраструктуры или сервера путем распределения состояния «на лету» и разрешения аварийного переключения является еще одним распространенным случаем использования. Такое использование позволяет разработчикам каркасов или серверов создавать кластерные предложения, в которых управление состоянием делегировано Infinispan, и клиенты, подключенные к таким бэкэндам, могут изящно переключаться на другой экземпляр в случае сбоя.

Хранилище данных

Тем не менее, все более популярным становится использование в качестве основного хранилища данных, особенно для неструктурированных или полуструктурированных данных. Из-за малой задержки, высокой степени параллелизма и высокой масштабируемости сеток данных в памяти они стали популярными во многих приложениях, которым требуется возможность масштабирования по требованию или быстрый доступ к данным с низкой задержкой. Infinispan хорошо сочетается с движением NoSQL, которое набирает обороты, а также с развертыванием в облаке, где традиционные хранилища данных проблематичны. Предстоящие функции, такие как индексирование и запрос состояния, а также распределенное выполнение («переместить процесс в данные, а не данные в процесс») делают это интересное пространство для наблюдения.

Интеграция с другими продуктами и платформами

Мы знаем о нескольких открытых и закрытых продуктах, рассматривающих Infinispan как часть своего предложения, и некоторые из них достигли определенной степени зрелости, которая может представлять интерес.

Hibernate провайдер кэша 2-го уровня

Начиная с версии 3.5, Hibernate поставляется с поставщиком кэша Infinispan для кэширования 2-го уровня. Эта установка обычно использует Infinispan в качестве кластеризованной недействительной сетки данных и помогает повысить производительность для объектов «в основном для чтения». Более подробную информацию об этом поставщике кэша можно найти здесь .

Поставщик Lucene Directory

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

 

Следующие шаги

 

Хочу больше?

Официальное руководство пользователя находится в процессе написания. Ожидайте, что это будет доступно в ближайшее время, но в то же время вики должна быть вашим основным источником информации. Вики служит стартовой площадкой для получения дополнительной информации о Infinispan, от проектных документов до часто задаваемых вопросов , документов API и ссылок на конфигурацию , учебных пособий и советов по содействию проекту. Не можете найти нужную вам информацию по конкретному предмету? Посетите форум пользователей, чтобы спросить об этом. Мы используем JIRA в качестве трекера проблем проекта. И, конечно же, вы должны следить за проектом в Twitter!   Понравился наш логотип? Проверьте эти классные обои для рабочего стола хорошие люди на JBoss.org созданы для нас!

Чувствуете себя вовлеченным?

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