Синхронный запуск 2 экземпляров Hazelcast на одном компьютере (с помощью hazelcast.initial.min.cluster.size=2)

Как я могу настроить Hazelcast (оптимально версию, которую я сейчас использую: 3.1.2) для запуска 2 экземпляров Hazelcast на одном компьютере и блокировать первый экземпляр во время запуска, пока не появятся оба экземпляра?

hazelcast.initial.min.cluster.size

Описанное выше поведение блокировки может быть реализовано с помощью hazelcast.initial.min.cluster.size при запуске обоих экземпляров на разных машинах: с конфигурацией:

Config cfg = new Config(); 
cfg.setProperty("hazelcast.initial.min.cluster.size",
  Integer.toString(minimumInitialMembersInHazelCluster));
cfg.getGroupConfig().setName(clusterName);
hazelInst = Hazelcast.newHazelcastInstance(cfg);

бегаю на разных машинах, получаю вывод

Apr 15, 2014 9:31:39 AM com.hazelcast.instance.DefaultAddressPicker
INFO: Prefer IPv4 stack is true.
Apr 15, 2014 9:31:39 AM com.hazelcast.instance.DefaultAddressPicker
INFO: Picked Address[192.168.31.105]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
Apr 15, 2014 9:31:40 AM com.hazelcast.system
INFO: [192.168.31.105]:5701 [dev] Hazelcast Community Edition 3.1.2 (20131120) starting at Address[192.168.31.105]:5701
Apr 15, 2014 9:31:40 AM com.hazelcast.system
INFO: [192.168.31.105]:5701 [dev] Copyright (C) 2008-2013 Hazelcast.com
Apr 15, 2014 9:31:40 AM com.hazelcast.instance.Node
INFO: [192.168.31.105]:5701 [dev] Creating MulticastJoiner
Apr 15, 2014 9:31:40 AM com.hazelcast.core.LifecycleService
INFO: [192.168.31.105]:5701 [dev] Address[192.168.31.105]:5701 is STARTING
Apr 15, 2014 9:31:43 AM com.hazelcast.cluster.MulticastJoiner
INFO: [192.168.31.105]:5701 [dev] 


Members [1] {
    Member [192.168.31.105]:5701 this
}

Apr 15, 2014 9:31:43 AM com.hazelcast.core.LifecycleService
INFO: [192.168.31.105]:5701 [dev] Address[192.168.31.105]:5701 is STARTED
Apr 15, 2014 9:31:43 AM HazelMultiInstanceExp <init>
SEVERE: debug: joined via JoinConfig{multicastConfig=MulticastConfig [enabled=true, multicastGroup=224.2.2.3, multicastPort=54327, multicastTimeToLive=32, multicastTimeoutSeconds=2, trustedInterfaces=[]], tcpIpConfig=TcpIpConfig [enabled=false, connectionTimeoutSeconds=5, members=[], requiredMember=null], awsConfig=AwsConfig{enabled=false, region='us-east-1', securityGroupName='null', tagKey='null', tagValue='null', hostHeader='ec2.amazonaws.com', connectionTimeoutSeconds=5}} with 1 members.
Apr 15, 2014 9:31:43 AM com.hazelcast.instance.DefaultAddressPicker
INFO: Prefer IPv4 stack is true.
Apr 15, 2014 9:31:43 AM com.hazelcast.instance.DefaultAddressPicker
INFO: Picked Address[192.168.31.105]:5702, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5702], bind any local is true
Apr 15, 2014 9:31:43 AM com.hazelcast.system
INFO: [192.168.31.105]:5702 [dev] Hazelcast Community Edition 3.1.2 (20131120) starting at Address[192.168.31.105]:5702
Apr 15, 2014 9:31:43 AM com.hazelcast.system
INFO: [192.168.31.105]:5702 [dev] Copyright (C) 2008-2013 Hazelcast.com
Apr 15, 2014 9:31:43 AM com.hazelcast.instance.Node
INFO: [192.168.31.105]:5702 [dev] Creating MulticastJoiner
Apr 15, 2014 9:31:43 AM com.hazelcast.core.LifecycleService
INFO: [192.168.31.105]:5702 [dev] Address[192.168.31.105]:5702 is STARTING
Apr 15, 2014 9:31:43 AM com.hazelcast.nio.SocketConnector
INFO: [192.168.31.105]:5702 [dev] Connecting to /192.168.31.105:5701, timeout: 0, bind-any: true
Apr 15, 2014 9:31:43 AM com.hazelcast.nio.SocketAcceptor
INFO: [192.168.31.105]:5701 [dev] Accepting socket connection from /192.168.31.105:60803
Apr 15, 2014 9:31:43 AM com.hazelcast.nio.TcpIpConnectionManager
INFO: [192.168.31.105]:5702 [dev] 60803 accepted socket connection from /192.168.31.105:5701
Apr 15, 2014 9:31:43 AM com.hazelcast.nio.TcpIpConnectionManager
INFO: [192.168.31.105]:5701 [dev] 5701 accepted socket connection from /192.168.31.105:60803
Apr 15, 2014 9:31:49 AM com.hazelcast.cluster.ClusterService
INFO: [192.168.31.105]:5702 [dev] 

Members [2] {
    Member [192.168.31.105]:5701
    Member [192.168.31.105]:5702 this
}

но запустить с двумя экземплярами на одной машине, я получаю

Apr 15, 2014 9:25:14 AM com.hazelcast.instance.DefaultAddressPicker
INFO: Prefer IPv4 stack is true.
Apr 15, 2014 9:25:14 AM com.hazelcast.instance.DefaultAddressPicker
INFO: Picked Address[192.168.31.105]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
Apr 15, 2014 9:25:15 AM com.hazelcast.system
INFO: [192.168.31.105]:5701 [test3] Hazelcast Community Edition 3.1.2 (20131120) starting at Address[192.168.31.105]:5701
Apr 15, 2014 9:25:15 AM com.hazelcast.system
INFO: [192.168.31.105]:5701 [test3] Copyright (C) 2008-2013 Hazelcast.com
Apr 15, 2014 9:25:15 AM com.hazelcast.instance.Node
INFO: [192.168.31.105]:5701 [test3] Creating MulticastJoiner
Apr 15, 2014 9:25:15 AM com.hazelcast.core.LifecycleService
INFO: [192.168.31.105]:5701 [test3] Address[192.168.31.105]:5701 is STARTING
Apr 15, 2014 9:25:18 AM com.hazelcast.cluster.MulticastJoiner
INFO: [192.168.31.105]:5701 [test3] 


Members [1] {
    Member [192.168.31.105]:5701 this
}

Apr 15, 2014 9:25:18 AM com.hazelcast.instance.HazelcastInstanceImpl
INFO: [192.168.31.105]:5701 [test3] HazelcastInstance waiting for cluster size of 2

с последним сообщением INFO, повторенным до бесконечности.

Таким образом, размер кластера - это количество узлов в кластере, а не количество экземпляров Hazelcast?

Поведение блокировки на одной машине

я использую cfg.setProperty("hazelcast.initial.min.cluster.size","2") поэтому два распределенных экземпляра запускают мой распределенный алгоритм синхронно. Кроме того, это решает проблему, связанную с тем, что некоторые члены Hazelcast не найдены, см. /questions/4758934/kak-programmno-nastroit-hazelcast-dlya-mehanizma-mnogoadresnogo-obnaruzheniya/4758940#4758940.

Так как же избежать обеих проблем при работе на одной машине? Было бы здорово, если бы размер кластера был просто числом запущенных экземпляров Hazelcast. Тогда я мог сохранить свою конфигурацию выше независимо от того, как я разверну свои два экземпляра (на 1 или 2 компьютерах).

Обновить

Я опубликовал вопрос о размере кластера по адресу https://github.com/hazelcast/hazelcast/issues/2292.

3 ответа

Вы можете использовать ту же машину для запуска нескольких экземпляров Hazelcast. Под капотами Hazelcast связывает разные порты для каждого экземпляра.

Далее простой тест с двумя экземплярами:

HazelcastInstance firstInstance = Hazelcast.newHazelcastInstance(new Config());
HazelcastInstance secondInstance = Hazelcast.newHazelcastInstance(new Config());

// Introducing a sample data in a map using the first instance
firstInstance.getMap("TEST_MAP").put("key", "test_value");

// Prints the value using the second instance. The result will be 'test_value'
System.out.println(secondInstance.getMap("TEST_MAP").get("key"));

Когда этот код запускается, консоль выводит:

Members [2] {
    Member [192.168.216.1]:5702
    Member [192.168.216.1]:5703 this
}

Как видите, два экземпляра были зарегистрированы на одном и том же IP, но на разных портах.

Вы должны запускать экземпляры в разных потоках. Смотрите следующий тест:

public static void main(String[] args) throws InterruptedException {
        final Config cfg = new Config();
        cfg.setProperty(GroupProperties.PROP_INITIAL_MIN_CLUSTER_SIZE, "2");

        Runnable runnable = new Runnable() {
            public void run() {
                final HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
                IMap<Object, Object> map = instance.getMap("map");
                for (int i = 0; i < 100; i++) {
                    map.put(i, i);
                    System.out.println("put:" + i);
                }
            }
        };
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);
        thread1.start();
        Thread.sleep(1000);
        thread2.start();
    }

Пожалуйста, смотрите эту ветку для получения дополнительной информации. Основываясь на имеющейся информации, лучше всего:

  1. убедитесь, что вы используете конфигурацию, которая позволяет использовать две машины в кластере на одном компьютере (посмотрите пример файла конфигурации, прикрепленного к этой теме)
  2. Запустите обе машины на одной и той же JVM (вместо того, чтобы запускать две отдельные JVM)
  3. Работаете с довольно свежей версией (3.1.2 должно быть хорошо)

Запуск двух JVM на одной физической машине может иногда работать, если вы убедитесь, что у них нет конфликтующих настроек порта, но вы, скорее всего, столкнетесь с различными проблемами (то есть, держу пари, они не смогут должным образом слушать одно и то же многоадресный порт). Я бы посоветовал против такого подхода.

Другие вопросы по тегам