Hazelcast

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 11:06, 8 января 2019.
Hazelcast
HazelcastLogo-Blue Dark.svg
Hazelcast® logo
Разработчики: Hazelcast, Inc.
Постоянный выпуск: 3.9.2 / September 13, 2018
Написана на: Java
Размер дистрибутива: 70MB
Тип ПО: In-Memory Data Grid
Лицензия:

Hazelcast: Apache 2.0

Hazelcast Enterprise: Proprietary
Веб-сайт hazelcast.org

Hazelcast IMDG представляет собой In-Memory Data Grid решение с открытым исходным кодом на основе Java. Hazelcast — также название компании, разрабатывающей продукт.

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


Обзор

Hazelcast имеет открытый исходный код. В дополнение к распространению данных In-Memory, Hazelcast предоставляет удобный набор API для доступа к ЦП в вашем кластере для максимальной скорости обработки. Hazelcast разработан как легкое и простое в использовании решение. Поскольку Hazelcast поставляется в виде компактной библиотеки (JAR), и поскольку он не имеет внешних зависимостей, отличных от Java, он легко подключается к вашему программному решению и предоставляет распределенные структуры данных и распределенные вычислительные утилиты.

Hazelcast обладает высокой масштабируемостью и доступностью. Распределенные приложения могут использовать Hazelcast для распределенного кэширования, синхронизации, кластеризации, обработки, pub / sub-обмена сообщениями и т.д. Hazelcast реализован на Java и имеет клиентов для Java, C / C ++, .NET, REST, Python, Go и Node.js. Hazelcast также поддерживает протокол Memcached. Что ещё более важно, Hazelcast упрощает распределенные вычисления, предлагая распределенные реализации многих дружественных для разработчиков интерфейсов от Java, таких как Map, Queue, ExecutorService, Lock и JCache. Например, интерфейс Map предоставляет хранилище значений ключа в памяти, которое даёт множество преимуществ NoSQL с точки зрения удобства разработчиков и производительности разработчиков. Hazelcast подключается к Hibernate и может быть легко использован с любой существующей системой баз данных. Полная архитектура системы представлена ниже на рисунке 1. [Источник 1]


Рисунок 1 – Архитектура Hazelcast IMDG


Версии Hazelcast IMDG

  • Hazelcast (Hazelcast IMDG) — open source версия Hazelcast IMDG.
  • Hazelcast IMDG Enterprise — коммерчески лицензированная версия Hazelcast IMDG, которая предоставляет ценные для предприятия функции в дополнение к Hazelcast IMDG.
  • Hazelcast IMDG Enterprise HD — коммерчески лицензированная версия Hazelcast IMDG, которая предоставляет расширения High-Density (HD) Memory Store и Hot Restart Persistence расширения в дополнение к Hazelcast IMDG Enterprise. [Источник 2]


Основные свойства

  • Простота

Hazelcast написан на Java без каких-либо других зависимостей. Он предоставляет тот же API из стандартного пакетаJava util, используя те же интерфейсы. Просто добавьте hazelcast.jar в свой путь к классам, и вы сможете быстро использовать кластеры JVM и начать создавать масштабируемые приложения.

  • Peer-to-peer

В отличие от многих NoSQL-решений, Hazelcast является одноранговым. Нет разделения master-slave; нет единой точки отказа. Все участники хранят равные объемы данных и выполняют равные объемы обработки. Вы можете встраивать Hazelcast в существующее приложение или использовать его в режиме клиента и сервера, где ваше приложение является клиентом узлов Hazelcast.

  • Масштабируемость

Hazelcast предназначен для масштабирования до сотен и тысяч узлов. Просто добавьте новые узлы, и они автоматически обнаружат кластер и будут линейно увеличивать объем памяти и производительность обработки. Узлы поддерживают TCP-соединение между собой, и все коммуникации выполняются через этот уровень.

  • Избыточность

Hazelcast сохраняет резервную копию каждой записи данных на нескольких узлах. При сбое узла данные восстанавливаются из резервной копии, и кластер будет продолжать работать без простоя.

Топология Hazelcast

Кластер Hazelcast можно развернуть двумя способами: встроенным или клиент-серверным.

Встроенное развёртывание

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

Рисунок 2 – Встроенное развёртывание

Клиент-серверное развёртывание

В развертывании "клиент / сервер" данные и службы Hazelcast централизованы в одном или нескольких узлах сервера, и к ним обращается приложение через клиентов. У вас может быть кластер узлов сервера, которые могут быть независимо созданы и масштабированы. Ваши клиенты общаются с этими узлами, чтобы добраться до данных и услуг Hazelcast на них. Схематично принцип клиент-серверного развёртывания представлен ниже на рисунке 3.

Рисунок 3 – Клиент-серверное развёртывание

Развертывание "клиент-сервер" имеет преимущества в более предсказуемой и надежной производительности Hazelcast, более легком выявлении причин проблем и, самое главное, лучшей масштабируемости. При необходимости масштабирования в этом типе развертывания просто добавьте дополнительные узлы сервера Hazelcast. Проблемы масштабируемости клиентов и серверов можно решать отдельно.

Если требуется доступ к данным с низкой задержкой, как во встроенном развертывании, а также преимущества масштабируемости развертывания "клиент-сервер", можно рассмотреть возможность определения близких кэшей для клиентов. Это позволяет хранить часто используемые данные в локальной памяти клиента. [Источник 3]

Организация хранения данных

Рисунок 4 – Разделы кластера с одним узлом и двумя узлами

Рисунок 5 – Разделы кластера с четырьмя узлами

Элементы Hazelcast называются разделами. Разделы — это сегменты памяти, каждый из которых может содержать сотни или тысячи записей данных в зависимости от объема памяти системы. Каждый раздел Hazelcast может иметь несколько реплик, которые распределяются между узлами кластера. Одна из реплик становится основной, а другие — резервными копиями. Узел кластера, которому принадлежит первичная реплика раздела, называется владельцем раздела. При чтении или записи определенной записи данных вы прозрачно общаетесь с владельцем раздела, содержащего эту запись данных. По умолчанию Hazelcast предлагает 271 раздел. При запуске кластера с одним узлом он владеет всеми 271 разделами (т. е. хранит первичные реплики для 271 раздела). На рисунке 4 слева показаны разделы кластера Hazelcast с одним узлом. При запуске второго узла в этом кластере реплики разделов распределяются, как показано в правой части рисунка 4 .


В правой части рисунка 4 разделы с чёрным текстом — основные, а резервно скопированные разделы обозначены синим цветом. Первый узел имеет 135 основных разделов (черные), и каждый из этих разделов резервно скопирован во втором узле (синие). В то же время первый узел также имеет резервные копии основных разделов второго узла. По мере добавления новых узлов Hazelcast перемещает некоторые из основных и резервных разделов к новым узлам по одному, делая все узлы равными и избыточными. Благодаря последовательному алгоритму хэширования, только минимальное количество разделов будет перемещено для масштабирования Hazelcast. На рисунке 5 приведен пример распределения реплик секций в кластере Hazelcast с четырьмя узлами.[Источник 4]


Установка

Вы можете найти Hazelcast в стандартных репозиториях Maven. Если в проекте используется Maven, добавлять дополнительные репозитории в pom.xml или добавить pom.xml или добавлять hazelcast-<version>.jar в ваш classpath не требуется (Maven делает это за вас). Просто добавьте следующие строки в pom.XML:

<dependencies>
   <dependency>
      <groupId>com.hazelcast</groupId>
      <artifactId>hazelcast</artifactId>
      <version>Hazelcast IMDG Version To Be Installed</version>
    </dependency>
</dependencies>

В качестве альтернативы вы можете скачать и установить Hazelcast IMDG самостоятельно. Нужно выполнить следующее:

  • Загрузить hazelcast-<version>.zip или hazelcast-<version>.tar.gz с hazelcast.org.
  • Извлечь hazelcast-<version>.zip или hazelcast-<version>.tar.gz.
  • Добавить файл hazelcast-<version>.jar к вашему classpath. [Источник 5]

Пример использования

В примере ниже демонстрируется работа с Hazelcast IMDG, а именно: создание простого с помощью distributed map и queue. Запуск наше приложение дважды, чтобы иметь кластер с двумя членами (JVM); подключение к нашему кластеру из Java-приложения с помощью Hazelcast Native Java Client API.

Следующий код запускает первый узел Hazelcast и создает и использует map и queue клиентов.

public class GettingStarted {

   public static void main(String[] args) {
      Config cfg = new Config();
      HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
      Map<Integer, String> mapCustomers = instance.getMap("customers");
      mapCustomers.put(1, "Joe");
      mapCustomers.put(2, "Ali");
      mapCustomers.put(3, "Avi");

      System.out.println("Customer with key 1: "+ mapCustomers.get(1));
      System.out.println("Map Size:" + mapCustomers.size());

      Queue<String> queueCustomers = instance.getQueue("customers");
      queueCustomers.offer("Tom");
      queueCustomers.offer("Mary");
      queueCustomers.offer("Jane");
      System.out.println("First customer: " + queueCustomers.poll());
      System.out.println("Second customer: "+ queueCustomers.peek());
      System.out.println("Queue size: " + queueCustomers.size());
   }
}

Запустите класс GettingStarted во второй раз, чтобы создать второй узел.Узлы сформируют кластер, который будет похож на следующее:

Members {size:2, ver:2} [
    Member [127.0.0.1]:5701 - e40081de-056a-4ae5-8ffe-632caf8a6cf1 this
    Member [127.0.0.1]:5702 - 93e82109-16bf-4b16-9c87-f4a6d0873080
]

Здесь можно увидеть размер кластера (size) и версию списка участников (ver). Версия memberlist будет увеличена, когда в кластере произойдут изменения, например, присоединится или удалится узел.

Теперь добавьте библиотеку hazelcast-client-<version>.jar к вашему classpath. Это необходимо для использования клиента Hazelcast. Следующий код запускает клиент Hazelcast, подключает его к кластеру и печатает размер map клиентов.

public class GettingStartedClient {

    public static void main( String[] args ) {
        ClientConfig clientConfig = new ClientConfig();
        HazelcastInstance client = HazelcastClient.newHazelcastClient( clientConfig );
        IMap map = client.getMap( "customers" );
        System.out.println( "Map Size:" + map.size() );
    }
}

При его запуске клиент правильно подключается к кластеру и печатает размер map, т.е. 3. [Источник 6]

Источники

  1. Hazelcast Overview // Hazelcast.org [2018-2018]. Дата обновления: 20.08.2018 URL: https://docs.hazelcast.org/docs/3.10.5/manual/html-single/index.html#hazelcast-overview (дата обращения: 07.10.2018).
  2. Hazelcast Preface // Hazelcast.org [2018-2018]. Дата обновления: 20.08.2018. URL: https://docs.hazelcast.org/docs/3.10.5/manual/html-single/index.html#preface (дата обращения: 07.10.2018).
  3. Hazelcast Topology// Hazelcast.org [2018-2018]. Дата обновления: 20.08.2018. URL: https://docs.hazelcast.org/docs/3.10.5/manual/html-single/index.html#hazelcast-topology (дата обращения: 07.10.2018).
  4. Hazelcast Data Partitioning // Hazelcast.org [2018-2018]. Дата обновления: 20.08.2018. URL: https://docs.hazelcast.org/docs/3.10.5/manual/html-single/index.html#data-partitioning (дата обращения: 07.10.2018).
  5. Hazelcast Installation // Hazelcast.org [2018-2018]. Дата обновления: 20.08.2018. URL: https://docs.hazelcast.org/docs/3.10.5/manual/html-single/index.html#installation (дата обращения: 07.10.2018).
  6. Hazelcast Starting Member and Client // Hazelcast.org [2018-2018]. Дата обновления: 20.08.2018. URL: https://docs.hazelcast.org/docs/3.10.5/manual/html-single/index.html#starting-the-member-and-client (дата обращения: 07.10.2018).