Ръководство за Hazelcast с Java

1. Общ преглед

Това е уводна статия за Hazelcast, където ще видим как да създадем член на клъстера, разпределена карта за споделяне на данни между клъстерните възли и да създадем Java клиент за свързване и заявки за данни в клъстера.

2. Какво е Hazelcast?

Hazelcast е разпределена In-Memory Data Grid платформа за Java. Архитектурата поддържа висока мащабируемост и разпределение на данни в клъстерна среда. Той поддържа автоматично откриване на възли и интелигентна синхронизация.

Hazelcast се предлага в различни издания. За да видите характеристиките на всички издания на Hazelcast, можем да се обърнем към следната връзка. В този урок ще използваме изданието с отворен код.

По същия начин Hazelcast предлага различни функции като Структура на разпределените данни, Разпределено изчисление, Разпределена заявка и др. За целите на тази статия ще се спрем на разпределена карта .

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

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

В тази статия обаче ще използваме само основната зависимост, необходима за създаване на самостоятелен член на клъстера Hazelcast и клиент на Hazelcast Java:

 com.hazelcast hazelcast 4.0.2  

Текущата версия е достъпна в централното хранилище на 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 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 можем да разгледаме следната връзка.

Въпреки че това може да не е пример от реалния свят, ние го използвахме само за да демонстрираме една от многото операции, които можем да приложим към разпределената карта. По-късно ще видим как да извлечем записите, добавени от члена на клъстера, от клиента на Hazelcast Java.

Вътрешно, Hazelcast разделя записите на картата и разпределя и репликира записите между членовете на клъстера. За повече подробности относно Hazelcast Map можем да разгледаме следната връзка.

4.3. Създайте клиент на Hazelcast Java

Клиентът на Hazelcast ни позволява да правим всички операции на Hazelcast, без да сме членове на клъстера. Той се свързва с един от членовете на клъстера и му делегира всички операции в целия клъстер.

Нека създадем собствен клиент:

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

Това е просто.

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

След това ще използваме създадения по-рано екземпляр на HazelcastInstance за достъп до разпределената карта :

Map map = hazelcastInstanceClient.getMap("data"); ...

Сега можем да правим операции на карта, без да сме членове на клъстера. Например, нека се опитаме да прегледаме записите:

for (Entry entry : map.entrySet()) { ... }

5. Конфигуриране на Hazelcast

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

Докато Hazelcast се стартира, той търси системно свойство hazelcast.config . Ако е зададено, стойността му се използва като път. В противен случай Hazelcast търси файл hazelcast.xml в работната директория или в пътя на класа.

If none of the above works, Hazelcast loads the default configuration, i.e. hazelcast-default.xml that comes with hazelcast.jar.

5.1. Network Configuration

By default, Hazelcast uses multicast for discovering other members that can form a cluster. If multicast isn't a preferred way of discovery for our environment, then we can configure Hazelcast for a full TCP/IP cluster.

Let's configure the TCP/IP cluster using declarative configuration:


    

Alternatively, we can use the Java config approach:

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);

By default, Hazelcast will try 100 ports to bind. In the example above, if we set the value of port as 5701 and limit the port count to 20, as members are joining the cluster, Hazelcast tries to find ports between 5701 and 5721.

If we want to choose to use only one port, we can disable the auto-increment feature by setting auto-increment to false.

5.2. Management Center Configuration

The management center allows us to monitor the overall state of the clusters, we can also analyze and browse the data structures in detail, update map configurations, and take thread dump from nodes.

To use the Hazelcast management center, we can either deploy the mancenter-version.war application into our Java application server/container or we can start Hazelcast Management Center from the command line. We can download the latest Hazelcast ZIP from hazelcast.org. The ZIP contains the mancenter-version.war file.

We can configure our Hazelcast nodes by adding the URL of the web application to hazelcast.xml and then have the Hazelcast members communicate with the management center.

So let's now configure the management center using declarative configuration:

 //localhost:8080/mancenter 

Likewise, here's the programmatic configuration:

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

6. Conclusion

In this article, we covered introductory concepts about Hazelcast. For more details, we can take a look at the Reference Manual.

As usual, all the code for this article is available over on GitHub.