Перейти к основному содержимому

Руководство по Hazelcast с Java

· 6 мин. чтения

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-версию . war в наш сервер/контейнер приложений Java, или мы можем запустить Центр управления Hazelcast из командной строки. Мы можем загрузить последний ZIP-файл Hazelcast с сайта hazelcast.org . ZIP содержит mancenter-версию . военный файл.

Мы можем настроить наши узлы 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 .