Как программно настроить hazelcast для механизма обнаружения многоадресной рассылки?

как программно настроить hazelcast для механизма обнаружения многоадресной рассылки?


детали:

на документация только предоставляет пример для TCP / IP и устарел: он использует Config.setPort(), который больше не существует.

моя конфигурация выглядит так, но обнаружение не работает (т. е. я получаю вывод "Members: 1":

        Config cfg = new Config();                  
        NetworkConfig network = cfg.getNetworkConfig();
        network.setPort(PORT_NUMBER);

        JoinConfig join = network.getJoin();
        join.getTcpIpConfig().setEnabled(false);
        join.getAwsConfig().setEnabled(false);
        join.getMulticastConfig().setEnabled(true);

        join.getMulticastConfig().setMulticastGroup(MULTICAST_ADDRESS);
        join.getMulticastConfig().setMulticastPort(PORT_NUMBER);
        join.getMulticastConfig().setMulticastTimeoutSeconds(200);

        HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
        System.out.println("Members: "+hazelInst.getCluster().getMembers().size());

Update 1, принимая ответ asimarslan в счет

если я возился с MulticastTimeout, я либо получаю "Members: 1" или

Dec 05, 2013 8:50: 42 PM com.hazelcast.НИО.Предупреждение ReadHandler: [192.168.0.9]:4446 [Дэв] Гц._hzInstance_1_dev.ИО.резьба-в-0 закрытия socket to endpoint Address[192.168.0.7]: 4446, Причина: java.Ио.EOFException: удаленный сокет закрыт! 05 декабря 2013 года 8: 57: 24 PM com.hazelcast.пример.Узел тяжелый: [192.168.0.9]: 4446 [dev] может не присоединяться к кластеру, закрываться! com.hazelcast.ядро.HazelcastException: не удалось присоединиться за 300 секунд!


обновление 2, принимая во внимание ответ pveentjer об использовании tcp/ip

если я изменю конфигурацию на следующую, я все равно получу только 1 член:

Config cfg = new Config();                  
NetworkConfig network = cfg.getNetworkConfig();
network.setPort(PORT_NUMBER);

JoinConfig join = network.getJoin();

join.getMulticastConfig().setEnabled(false);
join.getTcpIpConfig().addMember("192.168.0.1").addMember("192.168.0.2").
addMember("192.168.0.3").addMember("192.168.0.4").
addMember("192.168.0.5").addMember("192.168.0.6").
addMember("192.168.0.7").addMember("192.168.0.8").
addMember("192.168.0.9").addMember("192.168.0.10").
addMember("192.168.0.11").setRequiredMember(null).setEnabled(true);

//this sets the allowed connections to the cluster? necessary for multicast, too?
network.getInterfaces().setEnabled(true).addInterface("192.168.0.*");

HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
System.out.println("debug: joined via "+join+" with "+hazelInst.getCluster()
.getMembers().size()+" members.");

точнее, этот запуск производит выход

debug: присоединен через JoinConfig{multicastConfig=MulticastConfig [enabled=false, multicastGroup=224.2.2.3, multicastPort=54327, multicastTimeToLive=32, multicastTimeoutSeconds=2, trustedInterfaces= []], tcpIpConfig=TcpIpConfig [включено=true, connectionTimeoutSeconds=5, участники=[192.168.0.1, 192.168.0.2, 192.168.0.3, 192.168.0.4, 192.168.0.5, 192.168.0.6, 192.168.0.7, 192.168.0.8, 192.168.0.9, 192.168.0.10, 192.168.0.11], requiredMember=null], awsConfig=AwsConfig{enabled=false, регион= 'us-east-1', securityGroupName= 'null', tagKey= 'null', tagValue= 'null', hostHeader='ec2.amazonaws.com", connectionTimeoutSeconds=5}} с 1 членом.

моя не-hazelcast-реализация использует мультикасты UDP и отлично работает. Так может ли брандмауэр действительно быть проблемой?


обновление 3, принимая во внимание ответ pveentjer о проверке сети

поскольку у меня нет разрешений для iptables или для установки iperf, я использую com.hazelcast.examples.TestApp чтобы проверить, работает ли моя сеть, как описано в Начало Работы С Hazelcast в главе 2, раздел "хвастовство сразу":

я называю java -cp hazelcast-3.1.2.jar com.hazelcast.examples.TestApp на 192.168.0.1 и получить на выходе

...Dec 10, 2013 11:31:21 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Prefer IPv4 stack is true.
Dec 10, 2013 11:31:21 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Picked Address[192.168.0.1]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
Dec 10, 2013 11:31:22 PM com.hazelcast.system
INFO: [192.168.0.1]:5701 [dev] Hazelcast Community Edition 3.1.2 (20131120) starting at Address[192.168.0.1]:5701
Dec 10, 2013 11:31:22 PM com.hazelcast.system
INFO: [192.168.0.1]:5701 [dev] Copyright (C) 2008-2013 Hazelcast.com
Dec 10, 2013 11:31:22 PM com.hazelcast.instance.Node
INFO: [192.168.0.1]:5701 [dev] Creating MulticastJoiner
Dec 10, 2013 11:31:22 PM com.hazelcast.core.LifecycleService
INFO: [192.168.0.1]:5701 [dev] Address[192.168.0.1]:5701 is STARTING
Dec 10, 2013 11:31:24 PM com.hazelcast.cluster.MulticastJoiner
INFO: [192.168.0.1]:5701 [dev] 

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

Dec 10, 2013 11:31:24 PM com.hazelcast.core.LifecycleService
INFO: [192.168.0.1]:5701 [dev] Address[192.168.0.1]:5701 is STARTED

я тогда позвоню java -cp hazelcast-3.1.2.jar com.hazelcast.examples.TestApp на 192.168.0.2 и получить на выходе

...Dec 10, 2013 9:50:22 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Prefer IPv4 stack is true.
Dec 10, 2013 9:50:22 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Picked Address[192.168.0.2]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
Dec 10, 2013 9:50:23 PM com.hazelcast.system
INFO: [192.168.0.2]:5701 [dev] Hazelcast Community Edition 3.1.2 (20131120) starting at Address[192.168.0.2]:5701
Dec 10, 2013 9:50:23 PM com.hazelcast.system
INFO: [192.168.0.2]:5701 [dev] Copyright (C) 2008-2013 Hazelcast.com
Dec 10, 2013 9:50:23 PM com.hazelcast.instance.Node
INFO: [192.168.0.2]:5701 [dev] Creating MulticastJoiner
Dec 10, 2013 9:50:23 PM com.hazelcast.core.LifecycleService
INFO: [192.168.0.2]:5701 [dev] Address[192.168.0.2]:5701 is STARTING
Dec 10, 2013 9:50:23 PM com.hazelcast.nio.SocketConnector
INFO: [192.168.0.2]:5701 [dev] Connecting to /192.168.0.1:5701, timeout: 0, bind-any: true
Dec 10, 2013 9:50:23 PM com.hazelcast.nio.TcpIpConnectionManager
INFO: [192.168.0.2]:5701 [dev] 38476 accepted socket connection from /192.168.0.1:5701
Dec 10, 2013 9:50:28 PM com.hazelcast.cluster.ClusterService
INFO: [192.168.0.2]:5701 [dev] 

Members [2] {
    Member [192.168.0.1]:5701
    Member [192.168.0.2]:5701 this
}

Dec 10, 2013 9:50:30 PM com.hazelcast.core.LifecycleService
INFO: [192.168.0.2]:5701 [dev] Address[192.168.0.2]:5701 is STARTED

таким образом, многоадресное обнаружение обычно работает на моем кластере, верно? Это 5701 также порт для открытия? Is 38476 в последнем выводе ID или порт?

присоединение по-прежнему не работает для моего собственного кода с programmatical конфигурация :(


обновление 4, принимая во внимание ответ pveentjer об использовании конфигурации по умолчанию

измененный TestApp дает выход

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}}

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

myProgram дает выход

joined via JoinConfig{multicastConfig=MulticastConfig [enabled=true, multicastGroup=224.2.2.3, multicastPort=54327, multica
stTimeToLive=32, multicastTimeoutSeconds=2, trustedInterfaces=[]], tcpIpConfig=TcpIpConfig [enabled=false, connectionTimeoutSecond
s=5, members=[], requiredMember=null], awsConfig=AwsConfig{enabled=false, region='us-east-1', securityGroupName='null', tagKey='nu
ll', tagValue='null', hostHeader='ec2.amazonaws.com', connectionTimeoutSeconds=5}} with 1 members.

и не обнаруживает членов в пределах своего время выполнения около 1 минуты (я считаю членов примерно каждые 5 секунд).

но если хотя бы один экземпляр TestApp запускается одновременно в кластере, обнаруживаются все экземпляры TestApp и все экземпляры myProgram, и моя программа работает нормально. Если я запускаю TestApp один раз, а затем myProgram дважды параллельно, TestApp дает следующий вывод:

java -cp ~/CaseStudy/jtorx-1.10.0-beta8/lib/hazelcast-3.1.2.jar:. TestApp
Dec 12, 2013 12:02:15 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Prefer IPv4 stack is true.
Dec 12, 2013 12:02:15 PM com.hazelcast.instance.DefaultAddressPicker
INFO: Picked Address[192.168.180.240]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true
Dec 12, 2013 12:02:15 PM com.hazelcast.system
INFO: [192.168.180.240]:5701 [dev] Hazelcast Community Edition 3.1.2 (20131120) starting at Address[192.168.180.240]:5701
Dec 12, 2013 12:02:15 PM com.hazelcast.system
INFO: [192.168.180.240]:5701 [dev] Copyright (C) 2008-2013 Hazelcast.com
Dec 12, 2013 12:02:15 PM com.hazelcast.instance.Node
INFO: [192.168.180.240]:5701 [dev] Creating MulticastJoiner
Dec 12, 2013 12:02:15 PM com.hazelcast.core.LifecycleService
INFO: [192.168.180.240]:5701 [dev] Address[192.168.180.240]:5701 is STARTING
Dec 12, 2013 12:02:21 PM com.hazelcast.cluster.MulticastJoiner
INFO: [192.168.180.240]:5701 [dev] 


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

Dec 12, 2013 12:02:22 PM com.hazelcast.core.LifecycleService
INFO: [192.168.180.240]:5701 [dev] Address[192.168.180.240]:5701 is STARTED
Dec 12, 2013 12:02:22 PM com.hazelcast.management.ManagementCenterService
INFO: [192.168.180.240]:5701 [dev] Hazelcast will connect to Management Center on address: http://localhost:8080/mancenter-3.1.2/
Join: 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}}
Dec 12, 2013 12:02:22 PM com.hazelcast.partition.PartitionService
INFO: [192.168.180.240]:5701 [dev] Initializing cluster partition table first arrangement...
hazelcast[default] > Dec 12, 2013 12:03:27 PM com.hazelcast.nio.SocketAcceptor
INFO: [192.168.180.240]:5701 [dev] Accepting socket connection from /192.168.0.8:38764
Dec 12, 2013 12:03:27 PM com.hazelcast.nio.TcpIpConnectionManager
INFO: [192.168.180.240]:5701 [dev] 5701 accepted socket connection from /192.168.0.8:38764
Dec 12, 2013 12:03:27 PM com.hazelcast.nio.SocketAcceptor
INFO: [192.168.180.240]:5701 [dev] Accepting socket connection from /192.168.0.7:54436
Dec 12, 2013 12:03:27 PM com.hazelcast.nio.TcpIpConnectionManager
INFO: [192.168.180.240]:5701 [dev] 5701 accepted socket connection from /192.168.0.7:54436
Dec 12, 2013 12:03:32 PM com.hazelcast.partition.PartitionService
INFO: [192.168.180.240]:5701 [dev] Re-partitioning cluster data... Migration queue size: 181
Dec 12, 2013 12:03:32 PM com.hazelcast.cluster.ClusterService
INFO: [192.168.180.240]:5701 [dev] 

Members [3] {
    Member [192.168.180.240]:5701 this
    Member [192.168.0.8]:5701
    Member [192.168.0.7]:5701
}

Dec 12, 2013 12:03:43 PM com.hazelcast.partition.PartitionService
INFO: [192.168.180.240]:5701 [dev] Re-partitioning cluster data... Migration queue size: 181
Dec 12, 2013 12:03:45 PM com.hazelcast.partition.PartitionService
INFO: [192.168.180.240]:5701 [dev] All migration tasks has been completed, queues are empty.
Dec 12, 2013 12:03:46 PM com.hazelcast.nio.TcpIpConnection
INFO: [192.168.180.240]:5701 [dev] Connection [Address[192.168.0.8]:5701] lost. Reason: Socket explicitly closed
Dec 12, 2013 12:03:46 PM com.hazelcast.cluster.ClusterService
INFO: [192.168.180.240]:5701 [dev] Removing Member [192.168.0.8]:5701
Dec 12, 2013 12:03:46 PM com.hazelcast.cluster.ClusterService
INFO: [192.168.180.240]:5701 [dev] 

Members [2] {
    Member [192.168.180.240]:5701 this
    Member [192.168.0.7]:5701
}

Dec 12, 2013 12:03:48 PM com.hazelcast.partition.PartitionService
INFO: [192.168.180.240]:5701 [dev] Partition balance is ok, no need to re-partition cluster data... 
Dec 12, 2013 12:03:48 PM com.hazelcast.nio.TcpIpConnection
INFO: [192.168.180.240]:5701 [dev] Connection [Address[192.168.0.7]:5701] lost. Reason: Socket explicitly closed
Dec 12, 2013 12:03:48 PM com.hazelcast.cluster.ClusterService
INFO: [192.168.180.240]:5701 [dev] Removing Member [192.168.0.7]:5701
Dec 12, 2013 12:03:48 PM com.hazelcast.cluster.ClusterService
INFO: [192.168.180.240]:5701 [dev] 

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

Dec 12, 2013 12:03:48 PM com.hazelcast.partition.PartitionService
INFO: [192.168.180.240]:5701 [dev] Partition balance is ok, no need to re-partition cluster data... 

единственная разница, которую я вижу в конфигурации TestApp, - это

config.getManagementCenterConfig().setEnabled(true);
    config.getManagementCenterConfig().setUrl("http://localhost:8080/mancenter-"+version);

    for(int k=1;k<= LOAD_EXECUTORS_COUNT;k++){
        config.addExecutorConfig(new ExecutorConfig("e"+k).setPoolSize(k));
    }

поэтому я добавил его в отчаянная попытка в myProgram, тоже. Но это не решит проблему - все равно каждый экземпляр обнаруживает себя только как член во время всего эксперимента.


обновление о том, как долго работает myProgram

может быть, программа работает недостаточно долго (как выразился pveentjer)?

мои эксперименты, похоже, подтверждают это: Если время t между Hazelcast.newHazelcastInstance(cfg); и инициализации cleanUp() (т. е. больше не общается через hazelcast и нет более длинная проверка количества участников) - это

  • менее 30 секунд, нет связи и members: 1
  • более 30 секунд: всех участников и общение происходит (что странно, кажется, происходит гораздо дольше, чем t - 30 секунд).

является ли 30 секунд реалистичным промежутком времени, который нужен кластеру hazelcast, или происходит что-то странное? Вот журнал из 4 myPrograms, работающих одновременно (поиск членов hazelcast-перекрывает 30 секунд, например 1 и 3):

instance 1: 2013-12-19T12:39:16.553+0100 LOG 0 (START) engine started 
looking for members between 2013-12-19T12:39:21.973+0100 and 2013-12-19T12:40:27.863+0100  
2013-12-19T12:40:28.205+0100 LOG 35 (Torx-Explorer) Model  SymToSim is about to  exit

instance 2: 2013-12-19T12:39:16.592+0100 LOG 0 (START) engine started 
looking for members between 2013-12-19T12:39:22.192+0100 and 2013-12-19T12:39:28.429+0100 
2013-12-19T12:39:28.711+0100 LOG 52 (Torx-Explorer) Model  SymToSim is about to  exit

instance 3: 2013-12-19T12:39:16.593+0100 LOG 0 (START) engine started 
looking for members between 2013-12-19T12:39:22.145+0100 and 2013-12-19T12:39:52.425+0100  
2013-12-19T12:39:52.639+0100 LOG 54 (Torx-Explorer) Model  SymToSim is about to  exit

INSTANCE 4: 2013-12-19T12:39:16.885+0100 LOG 0 (START) engine started 
looking for members between 2013-12-19T12:39:21.478+0100 and 2013-12-19T12:39:35.980+0100  
2013-12-19T12:39:36.024+0100 LOG 34 (Torx-Explorer) Model  SymToSim is about to  exit

как лучше всего начать свой фактический распределенный алгоритм только после достаточно членов кластера hazelcast? Могу ли я установить hazelcast.initial.min.cluster.size программно? https://groups.google.com/forum/#!тема/hazelcast/СА-lmpEDa6A похоже, это будет блок Hazelcast.newHazelcastInstance(cfg); до первоначального.минута.группа.размер достигнут. Правильно? Как синхронно (в течение какого промежутка времени) будет разные экземпляры разблокировать?

7 ответов


проблема заключается в том, что кластер запускается (и останавливается) и не ждет, пока в кластере будет достаточно членов. Вы можете установить hazelcast.первоначальный.минута.группа.свойство size, чтобы предотвратить это.

вы можете установить 'hazelcast.первоначальный.минута.группа.размер " программно используя:

Config config = new Config(); 
config.setProperty("hazelcast.initial.min.cluster.size","3");

ваша конфигурация верна, но вы установили очень длинный тайм-аут многоадресной рассылки 200 сек, где по умолчанию 2 сек. установка меньшего значения решит эту проблему.

из документа API Java Hazelcast: MulticastConfig.html#setMulticastTimeoutSeconds (int)

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


кажется, вы используете кластеризацию TCP/IP, так что это хорошо. Попробуйте следующее (Из книги hazelcast)

если вы используете iptables, можно добавить следующее правило для разрешения исходящего трафика из портов 33000-31000:

iptables -A OUTPUT -p TCP --dport 33000:31000 -m state --state NEW -j ACCEPT

и контролировать входящий трафик с любого адреса на порт 5701:

iptables -A INPUT -p tcp -d 0/0 -s 0/0 --dport 5701 -j ACCEPT

и разрешить входящий многоадресный трафик:

iptables -A INPUT -m pkttype --pkt-type multicast -j ACCEPT

проверка подключения Если у вас возникли проблемы, потому что машины не присоединиться к кластеру, вы можете проверить сети connectity между 2 машин. Для этого можно использовать инструмент iperf. На одной машине вы выполняете: iperf-s-p 5701 Это означает, что вы слушаете в порт-5701.

на другой машине вы выполняете следующую команду:

iperf -c 192.168.1.107 -d -p 5701

где вы заменяете '192.168.1.107' на ip-адрес вашей первой машины. Если вы запустите команду и получите такой вывод:

------------------------------------------------------------
Server listening on TCP port 5701
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 192.168.1.107, TCP port 5701
TCP window size: 59.4 KByte (default)
------------------------------------------------------------
[  5] local 192.168.1.105 port 40524 connected with 192.168.1.107 port 5701
[  4] local 192.168.1.105 port 5701 connected with 192.168.1.107 port 33641
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.2 sec  55.8 MBytes  45.7 Mbits/sec
[  5]  0.0-10.3 sec  6.25 MBytes  5.07 Mbits/sec

вы знаете 2 машины могут соединяться друг с другом. Однако если вы видите что-то вроде этого:

Server listening on TCP port 5701
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
connect failed: No route to host

тогда вы знаете, что у вас может быть проблема с сетевым подключением на ваших руках.


похоже, что Hazelcast использует многоадресный адрес 224.2.2.3 на UDP-порту 54327 (по умолчанию) для обнаружения, а затем порт 5701 для TCP-связи. Открытие UDP-порта 54327 в брандмауэре исправлено обнаружение для меня. (Я также открыл TCP-порт 5701, но этого было недостаточно.)


можете ли вы сначала попробовать с кластером tcp/ip, чтобы убедиться, что все остальное в порядке? После того, как вы подтвердили, что нет никаких проблем, попробуйте многоадресную рассылку. Это также может быть проблема брандмауэра кстати.


таким образом, кажется, что Многоадресная рассылка работает в вашей сети; что хорошо.

не могли бы вы попробовать его со следующими параметрами:

Config cfg = new Config();                  
NetworkConfig network = cfg.getNetworkConfig();

JoinConfig join = network.getJoin();
join.getTcpIpConfig().setEnabled(false);
join.getAwsConfig().setEnabled(false);
join.getMulticastConfig().setEnabled(true);

HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);

Как вы можете видеть, я удалил все настройки.


можете ли вы попытаться создать свой экземпляр Hazelcast следующим образом:

Config cfg = new Config();                  
HazelcastInstance hz = Hazelcast.newHazelcastInstance(cfg);

материал managementcenter и создание исполнителей не актуальны (я добавил этот код в testapp, поэтому я на 100% уверен в этом).

тогда вы должны иметь точно такую же конфигурацию сети, как и TestApp.