В настоящее время все большему количеству компаний нужны масштабируемые и отказоустойчивые приложения. Как правило в таких средах используют несколько серверов приложений. Если Ваше приложение работает на нескольких серверах, может понадобиться расшаривать данными различными способами между серверами или кэшировать Ваши данные для достижения наиболее быстрого времени отклика. Hazelcast поможет нам в этом, позволяя легко шарить данные и распространять данные ваших приложений по всем нодам кластера.
Этот пост полностью сфокусирован на кластеризации. Я покажу, как можно использовать кластеризацию и платформу распределения данных Hazelcast на платформе Jelastic в облаке InfoboxCloud. Это очень быстрый, надежный, масштабируемый и дружественный к пользователю способ деплоя. Если вам нужно разделять данные между множеством серверов, кластеризовать ваше Java –приложение, кэшировать ваши данные, предоставлять вашим серверам возможность безопасных коммуникаций или отказоустойчивого управления данными, Hazelcast – то, что вам надо.
Hazelcast использует мультикаст для работы или TCP/IP для сред, где мультикаст не доступен. А Jelastic хорошо подходит для построения кластера Hazelcast. Давайте посмотрим, как эти две платформы работают вместе.
Регистрация в Jelastic и бесплатный плюшки
Зарегистрироваться и получить доступ к Jelastic можно по этой ссылке. Первые 5 дней бесплатный триал, далее — переход в коммерческий режим и 3 клаудлета + первый IP адрес — бесплатно (можно перейти в коммерческий режим и раньше, чтобы получить бесплатные лимиты).
Создаем окружение
Залогиньтесь в Jelastic. Создаем среду на Tomcat 7, состоящую из нескольких инстансов (в нашем примере 4), устанавливаем лимиты масштабирования для клаудлетов и включаем IPv4.
Не пугайтесь страшным цифрам на скриншоте (максимальное значение), оно достижимо только если ваша система постоянно на 100% загружает все сервера при максимальных выделенных ресурсах, что в реальной жизни конечно маловероятно. При моих испытаниях Hazelcast на 4 инстанса было выделено 13 клаудлетов (при том, что максимально в пик нагрузки может выделиться 132 клаудлета). В этом и прелесть облачных технологий — мы без проблем переживем пик нагрузки и при этом нам нужно платить только за реально потребляемые ресурсы, а не всегда за пиковые. К тому же ползунки управления вертикальным масштабированием можно поставить всегда в рамки бюджета на серверы.
Ждем несколько минут и ваше окружение будет создано.
Скачиваем Hazelcast
1. Идем на hazelcast.com и скачиваем последний стабильный выпуск платформы:
Распакуйте скачанный архив.
Создание приложения
Давайте создадим простой сервер на Java и клиентское приложение с использованием кластера Hazelcast для развертывания на платформу Jelastic в облако InfoboxCloud в окружение, которое мы уже создали (на самом деле деплоить можно куда угодно, тк в InfoboxCloud нет Vendor-lock и все технологии можно поставить и к себе на сервера, просто в облаке это делать гораздо удобнее).
Серверное приложение
1. Давайте создадим Java класс серверного приложения и импортируем все необходимые библиотеки Hazelcast, которые включены в загруженный пакет (hazelcast-x.x.x/lib). В нашем случае мы будем использовать приложение, которое запускает первый сервер и использует map и queue пользователя:
package com.infoboxcloud;
import com.hazelcast.config.Config;
import com.hazelcast.config.JoinConfig;
import com.hazelcast.config.NetworkConfig;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import java.util.ArrayList;
import java.util.Map;
import java.util.Queue;
/**
* Created by trukhinyuri on 05/12/13.
*/
public class HazelcastServer {
public void run() {
Config cfg = new Config();
NetworkConfig networkConfig = cfg.getNetworkConfig();
JoinConfig join = networkConfig.getJoin();
join.getMulticastConfig().setEnabled(false);
join.getTcpIpConfig().addMember("109.120.149.234").addMember("109.120.149.236").addMember("109.120.149.200").addMember("109.120.149.184").setEnabled(true);
ArrayList<String> interfaces = new ArrayList<>();
interfaces.add("109.120.149.234");
interfaces.add("109.120.149.236");
interfaces.add("109.120.149.200");
interfaces.add("109.120.149.184");
networkConfig.getInterfaces().setEnabled(true).setInterfaces(interfaces);
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());
}
}
На заметку: в Jelastic Вы можете увидеть публичные IP адреса нажав на кнопку расширенного меню на вашей серверной ноде, как показано на скриншоте:
IP адреса в предыдущем коде — адреса публичной сети, взятые из панели управления Jelastic, у вас они будут другими.
2. Создадим servlet listener, который запустит ваш код автоматически после развертывания:
package com.infoboxcloud;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* Created by trukhinyuri on 05/12/13.
*/
public class AppServletContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContextListener started");
new HazelcastServer().run();
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContextListener destroyed");
}
}
3. Добавим секцию listener в ваш web.xml файл:
<?xml version=«1.0» encoding=«UTF-8»?>
<web-app xmlns=«java.sun.com/xml/ns/javaee»
xmlns:xsi=«www.w3.org/2001/XMLSchema-instance»
xsi:schemaLocation=«java.sun.com/xml/ns/javaee
java.sun.com/xml/ns/javaee/web-app_3_0.xsd»
version=«3.0»>
<display-name>infoboxcloud_demo</display-name>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<listener-class>com.infoboxcloud.AppServletContextListener</listener-class>
</web-app>
4. Соберем проект в WAR архив.
Клиентское приложение
Создадим Java класс с использованием Hazelcast Native Java Client API. Мы будем использовать пример, в котором добавим в конфигурацию все 4 ноды у отобразим Map Size:
package com.infoboxcloud;
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
/**
* Created by trukhinyuri on 05/12/13.
*/
public class Client {
public static void main(String[] args) {
ClientConfig clientConfig = new ClientConfig();
clientConfig.addAddress("109.120.149.234:5701").addAddress("109.120.149.236:5107").addAddress("109.120.149.200:5107").addAddress("109.120.149.184:5107");
HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);
IMap map = client.getMap("customers");
System.out.println("Map Size:" + map.size());
}
}
Таким образом мы запустили Hazelcast на платформе Jelastic в облаке InfoboxCloud.
Безусловно на этом останавливаться не стоит, поэтому в следующей статье я расскажу про другие способы конфигурирования Hazelcast и настройки сети, разберемся глубже с возможностями Hazelcast и потестируем, насколько он быстр на нашем кластере.
Автор: attrukhinyuri