«1. Обзор

Это вводная статья о Hazelcast, в которой мы увидим, как создать элемент кластера, распределенную карту для обмена данными между узлами кластера и создать Java-клиент для подключения и запроса данных в кластере.

2. Что такое Hazelcast?

Hazelcast — это распределенная платформа In-Memory Data Grid для Java. Архитектура поддерживает высокую масштабируемость и распределение данных в кластерной среде. Он поддерживает автоматическое обнаружение узлов и интеллектуальную синхронизацию.

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

Аналогично, Hazelcast предлагает различные функции, такие как распределенная структура данных, распределенные вычисления, распределенный запрос и т. д. В этой статье мы сосредоточимся на распределенной карте.

3. Зависимость от Maven

Hazelcast предлагает множество различных библиотек для решения различных задач. Мы можем найти их в группе com.hazelcast в Maven Central.

Однако в этой статье мы будем использовать только основную зависимость, необходимую для создания автономного члена кластера Hazelcast и Java-клиента Hazelcast:

<dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast</artifactId>
    <version>4.0.2</version>
</dependency>

Текущая версия доступна в центральном репозитории maven.

4. Первое приложение Hazelcast

4.1. Создание участника Hazelcast

Члены (также называемые узлами) автоматически объединяются в кластер. Это автоматическое присоединение происходит с помощью различных механизмов обнаружения, которые участники используют для поиска друг друга.

Давайте создадим элемент, который хранит данные в распределенной карте Hazelcast:

public class ServerNode {
    
    HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance();
    ...
}

Когда мы запускаем приложение ServerNode, мы видим текущий текст в консоли, что означает, что мы создаем новый узел Hazelcast в нашей JVM. которые должны будут присоединиться к кластеру.

Members [1] {
    Member [192.168.1.105]:5701 - 899898be-b8aa-49aa-8d28-40917ccba56c this
}

Чтобы создать несколько узлов, мы можем запустить несколько экземпляров приложения ServerNode. В результате Hazelcast автоматически создаст и добавит в кластер нового члена.

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

Members [2] {
  Member [192.168.1.105]:5701 - 899898be-b8aa-49aa-8d28-40917ccba56c
  Member [192.168.1.105]:5702 - d6b81800-2c78-4055-8a5f-7f5b65d49f30 this
}

4.2. Создание распределенной карты

Теперь давайте создадим распределенную карту. Нам нужен экземпляр HazelcastInstance, созданный ранее, для создания распределенной карты, которая расширяет интерфейс java.util.concurrent.ConcurrentMap.

Map<Long, String> map = hazelcastInstance.getMap("data");
...

Наконец, давайте добавим несколько записей на карту:

FlakeIdGenerator idGenerator = hazelcastInstance.getFlakeIdGenerator("newid");
for (int i = 0; i < 10; i++) {
    map.put(idGenerator.newId(), "message" + i);
}

Как мы видим выше, мы добавили 10 записей на карту. Мы использовали FlakeIdGenerator, чтобы получить уникальный ключ для карты. Чтобы узнать больше о FlakeIdGenerator, перейдите по следующей ссылке.

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

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

4.3. Создание Java-клиента Hazelcast

Клиент Hazelcast позволяет нам выполнять все операции Hazelcast, не будучи членом кластера. Он подключается к одному из членов кластера и делегирует ему все общекластерные операции.

Давайте создадим собственный клиент:

ClientConfig config = new ClientConfig();
config.setClusterName("dev");
HazelcastInstance hazelcastInstanceClient = HazelcastClient.newHazelcastClient(config);

Это просто.

4.4. Доступ к распределенной карте из Java-клиента

Далее мы будем использовать экземпляр HazelcastInstance, созданный ранее, для доступа к распределенной карте:

Map<Long, String> map = hazelcastInstanceClient.getMap("data");
...

Теперь мы можем выполнять операции с картой, не будучи членом кластера. Например, попробуем перебрать записи:

for (Entry<Long, String> entry : map.entrySet()) {
    ...
}

5. Настройка Hazelcast

В этом разделе мы сосредоточимся на том, как настроить сеть Hazelcast с помощью декларативных (XML) и программных (API) и используйте центр управления Hazelcast для мониторинга и управления работающими узлами.

«Во время запуска Hazelcast ищет системное свойство hazelcast.config. Если он установлен, его значение используется как путь. В противном случае Hazelcast ищет файл hazelcast.xml в рабочем каталоге или в пути к классам.

Если ничего из вышеперечисленного не работает, Hazelcast загружает конфигурацию по умолчанию, то есть hazelcast-default.xml, который поставляется с hazelcast.jar.

5.1. Конфигурация сети

По умолчанию Hazelcast использует многоадресную рассылку для обнаружения других членов, которые могут образовывать кластер. Если многоадресная рассылка не является предпочтительным способом обнаружения для нашей среды, мы можем настроить Hazelcast для полного кластера TCP/IP.

Давайте настроим кластер TCP/IP, используя декларативную конфигурацию:

<?xml version="1.0" encoding="UTF-8"?>
<hazelcast xmlns="http://www.hazelcast.com/schema/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.hazelcast.com/schema/config
                               http://www.hazelcast.com/schema/config/hazelcast-config-4.0.xsd";
    <network>
        <port auto-increment="true" port-count="20">5701</port>
        <join>
            <multicast enabled="false"/>
            <tcp-ip enabled="true">
                <member>machine1</member>
                <member>localhost</member>
            </tcp-ip>
        </join>
    </network>
</hazelcast>

В качестве альтернативы мы можем использовать подход с конфигурацией Java:

Config config = new Config();
NetworkConfig network = config.getNetworkConfig();
network.setPort(5701).setPortCount(20);
network.setPortAutoIncrement(true);
JoinConfig join = network.getJoin();
join.getMulticastConfig().setEnabled(false);
join.getTcpIpConfig()
  .addMember("machine1")
  .addMember("localhost").setEnabled(true);

По умолчанию Hazelcast попытается связать 100 портов. В приведенном выше примере, если мы установим значение порта как 5701 и ограничим количество портов до 20, поскольку члены присоединяются к кластеру, Hazelcast попытается найти порты между 5701 и 5721.

Если мы хотим использовать только один порт, мы можем отключить функцию автоинкремента, установив для автоинкремента значение false.

5.2. Конфигурация центра управления

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

Чтобы использовать центр управления Hazelcast, мы можем либо развернуть приложение mancenter-version.war на нашем сервере/контейнере приложений Java, либо запустить центр управления Hazelcast из командной строки. Мы можем загрузить последний ZIP-файл Hazelcast с сайта hazelcast.org. ZIP содержит файл mancenter-version.war.

Мы можем настроить наши узлы Hazelcast, добавив URL-адрес веб-приложения в hazelcast.xml, а затем заставить участников Hazelcast связываться с центром управления.

Теперь давайте настроим центр управления с помощью декларативной конфигурации:

<management-center enabled="true">
    http://localhost:8080/mancenter
</management-center>

Аналогично, вот программная конфигурация:

ManagementCenterConfig manCenterCfg = new ManagementCenterConfig();
manCenterCfg.setEnabled(true).setUrl("http://localhost:8080/mancenter");

6. Заключение

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

Как обычно, весь код для этой статьи доступен на GitHub.