Статьи

Руководство для начинающих по Hazelcast, часть 1

Вступление

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

Что такое Hazelcast?

Hazelcast — это распределенная база данных в памяти. Есть проекты по всему миру, использующие Hazelcast. Код с открытым исходным кодом под лицензией Apache 2.0.

Особенности

В Hazelcast уже встроено множество функций. Вот некоторые из них:

  • Автоматическое обнаружение узлов в сети
  • Высокая доступность
  • В резервных копиях памяти
  • Возможность кеширования данных
  • Пулы распределенных потоков
    • Распределенная служба исполнителя
  • Возможность иметь данные в разных разделах.
  • Способность сохранять данные асинхронно или синхронно.
  • операции
  • Поддержка SSL
  • Структуры для хранения данных:
    • IList
    • IMap
    • MultiMap
    • ISet
  • Структуры для общения между различными процессами
    • IQueue
    • ITopic
  • Атомные Операции
    • IAtomicLong
  • Идентификация поколения
    • IdGenerator
  • запирающий
    • ISemaphore
    • ICondition
    • ILock
    • ICountDownLatch

Работа с Hazelcast

Просто игра с Hazelcast и чтение научили меня принимать эти вещи.

  1. Данные будут храниться в виде массива байтов. (Это не предположение, я получил это прямо из книги)
  2. Данные будут передаваться по сети.
  3. Данные являются удаленными.
  4. Если данные не находятся в памяти, они не существуют.

Позвольте мне объяснить эти предположения:

Данные будут храниться в виде массива байтов

Я получил эту информацию из Книги Hazelcast, так что это действительно не предположение. Это важно, потому что таким образом хранятся не только данные, но и ключ . Это делает жизнь очень интересной, если в качестве ключа используется нечто иное, чем примитив или строка. Разработчик hash () и equals () должен думать о нем с точки зрения ключа как массива байтов, а не как класса.

Данные будут идти по сети

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

Данные удалены

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

Если данные не находятся в памяти, они не существуют

Не забывайте, что это база данных в памяти . Если он не загружается в память, база данных не будет знать, что данные хранятся где-то еще. Эта база данных не сохраняет данные, чтобы поднять ее позже. Это сохраняется, потому что данные важны. Невозможно вернуть его с диска, как только в нем не будет памяти, как в обычной базе данных ( MySQL) .

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

Разработчики Java будут рады узнать, что контейнеры хранения данных Hazelcast, кроме одного, являются расширениями интерфейсов java.util.Collections. Например, IList следует тем же контрактам методов, что и java.util.List. Вот список различных типов хранения данных:

  • IList — хранит несколько объектов в порядке их размещения
  • IQueue — это следует за BlockingQueue и может использоваться в качестве альтернативы очереди сообщений в JMS. Это может быть сохранено через QueueStore
  • IMap — это расширяет ConcurrentMap. Это также может быть сохранено в MapStore. Он также имеет ряд других функций, о которых я расскажу в другом посте.
  • ISet — хранит набор уникальных элементов, порядок которых не гарантирован.
  • MultiMap — это не соответствует типичной карте, поскольку может быть несколько значений на ключ.

пример

Настроить

Для всех функций, которые содержит Hazelcast, начальные шаги установки действительно просты.

  1. Загрузите zip-файл Hazelcast по адресу www.hazelcast.org и извлеките его содержимое.
  2. Добавьте файлы jar, найденные в каталоге lib, в свой путь к классам.
  3. Создайте файл с именем hazelcast.xml и поместите в него следующее
01
02
03
04
05
06
07
08
09
10
11
12
 <?xml version="1.0" encoding="UTF-8"?>
<hazelcast
    <network>
        <join><multicast enabled="true"/></join>
    </network>
     
    <map name="a"></map>
</hazelcast>

Hazelcast ищет файл конфигурации в нескольких местах:

  • Путь, определенный свойством hazelcast.config
  • hazelcast.xml в classpath, если classpath включен в hazelcast.config
  • Рабочий каталог
  • Если ничего не помогает, загружается hazelcast-default.xml, который находится в hazelcast.jar.
  • Если одна доза не хочет иметь дело с файлом конфигурации вообще, конфигурация может быть выполнена программно.

Пример конфигурации здесь определяет многоадресную рассылку для объединения. Он также определяет IMap «а».

Предупреждение о конфигурации

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

Код

Этот код вызывает два узла и помещает значения в IMap экземпляра, используя IdGenerator для генерации ключей и считывания данных из instance2.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package hazelcastsimpleapp;
 
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IdGenerator;
import java.util.Map;
 
/**
 *
 * @author Daryl
 */
public class HazelcastSimpleApp {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        HazelcastInstance instance = Hazelcast.newHazelcastInstance();
        HazelcastInstance instance2 = Hazelcast.newHazelcastInstance();
         
        Map map = instance.getMap("a");
        IdGenerator gen = instance.getIdGenerator("gen");
        for(int i = 0; i < 10; i++) {
            map.put(gen.newId(), "stuff " + i);
        }
         
        Map map2 = instance2.getMap("a");
        for(Map.Entry entry: map2.entrySet()) {
            System.out.printf("entry: %d; %s\n", entry.getKey(), entry.getValue());
        }
         
        System.exit(0);
    }
     
}

Удивительно просто, не правда ли! Обратите внимание, что я даже не использовал интерфейс IMap, когда извлекал экземпляр карты. Я просто использовал интерфейс java.util.Map. Это не хорошо для использования распределенных функций Hazelcast, но для этого примера, он работает нормально.

Здесь можно наблюдать предположения на работе. Первое предположение — хранение информации в виде массива байтов. Обратите внимание, что данные и ключи являются сериализуемыми. Это важно, потому что это необходимо для хранения данных. Второе и третье допущения верны для данных, к которым обращается узел instance2. Четвертое предположение верно, потому что каждое значение, которое было введено в карту «a», отображалось при чтении. Весь этот пример можно найти по адресу http://darylmathisonblog.googlecode.com/svn/trunk/HazelcastSimpleApp, используя subversion. Проект выполнен с использованием Netbeans 8.0.

Вывод

Краткий обзор многочисленных функций Hazelcast был рассмотрен на простом примере, показывающем IMap и IdGenerator. Был обсужден список предположений, применимых при разработке в среде распределенных баз данных в памяти.

использованная литература