Comment programmer hazelcast pour le mécanisme de découverte multicast?
comment programmer hazelcast pour le mécanisme de découverte multicast?
Détails:
documentation fournit seulement un exemple pour TCP / IP et est périmé: il utilise Config.setPort(), qui n'existe plus.
ma configuration ressemble à ça, mais discovery ne fonctionne pas (i.e. j'obtiens la sortie "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());
mise à jour 1, prise asimarslan's réponse dans le compte
si j'ai échoué avec le MulticastTimeout, j'obtiens soit "Members: 1"
ou
Dec 05, 2013 8:50: 42 PM com.hazelcast.nio.Avertissement ReadHandler: [192.168.0.9]: 4446 [dev] hz._hzInstance_1_dev.IO.fermeture filetage-en-0 adresse socket to endpoint[192.168.0.7]: 4446, Cause: java.io.EOFException: la prise distante est fermée! 05 décembre 2013 8:57: 24 PM com.hazelcast.instance.Noeud sévère: [192.168.0.9]: 4446 [dev] pourrait pas rejoindre cluster, fermer! COM.hazelcast.core.HazelcastException: pas réussi à rejoindre en 300 secondes!
mise à jour 2, en tenant compte de la réponse de pveentjer sur l'utilisation de tcp/ip
si je change la configuration à la suivante, je n'obtiens qu'un seul membre:
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.");
plus précisément, cette exécution produit la sortie
debug: joint via JoinConfig{multicastConfig=MulticastConfig [enabled= false, multicastGroup=224.2.2.3, multicastPort = 54327, multicastTimeToLive=32, multicasttimeoutsecondes=2, trustedInterfaces= []], tcpIpConfig=TcpIpConfig [enabled=true, connectionTimeoutSeconds=5, les membres de l'=[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, region= 'us-east-1', securityGroupName= 'null', tagKey= 'null', tagValue= 'null', hostHeader='ec2.amazonaws.com", connectiontimeoutsecondes=5}} avec 1 Membres.
mon implémentation non-hazelcast-utilise UDP multicasts et fonctionne très bien. Si un pare-feu peut vraiment être le problème?
mise à jour 3, en tenant compte de la réponse de pveentjer sur la vérification du réseau
comme je n'ai pas les permissions pour iptables ou pour installer iperf, j'utilise com.hazelcast.examples.TestApp
pour vérifier si mon réseau fonctionne, comme décrit dans Mise En Route Avec Hazelcast dans le Chapitre 2, Section "Montrer tout de suite":
j'appelle java -cp hazelcast-3.1.2.jar com.hazelcast.examples.TestApp
sur 192.168.0.1 et obtenir la sortie
...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
j'ai ensuite appeler java -cp hazelcast-3.1.2.jar com.hazelcast.examples.TestApp
sur 192.168.0.2 et obtenir la sortie
...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
donc multicast discovery fonctionne généralement sur mon cluster, non? Est-ce que 5701 est aussi le port de découverte? 38476
dans la dernière sortie un ID ou un port?
rejoindre still ne fonctionne pas pour mon propre code avec programmatic configuration: (
mise à jour 4, en prenant en compte la réponse de pveentjer sur l'utilisation de la configuration par défaut
the modified Testampp gives the output
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}}
et détecte d'autres membres après quelques secondes (après chaque instance une fois ne s'affiche qu'elle-même en tant que membre si tous sont lancés en même temps), alors que
myProgram donne la sortie
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.
et ne détecte pas les membres à l'intérieur de son temps de fonctionnement est d'environ 1 minute (je compte les membres environ toutes les 5 secondes).
mais si au moins une instance de Testampp tourne simultanément sur le cluster, toutes les instances de Testampp et toutes les instances de myProgram sont détectées et mon programme fonctionne très bien. Dans le cas où je lance Testampp une fois et puis myProgram deux fois en parallèle, Testampp donne la sortie suivante:
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...
la seule différence que je vois dans la configuration de testaments est
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));
}
alors je l'ai ajouté dans une tentative désespérée dans myProgram, trop. Mais il ne résout pas le problème - encore chaque instance se détecte seulement comme membre pendant toute la course.
mise à Jour au sujet de combien de temps myProgram fonctionne
se Pourrait-il que le programme ne fonctionne pas assez longtemps (comme pveentjer mettre)?
Mes expériences semblent confirmer cette:
Si le temps t entre Hazelcast.newHazelcastInstance(cfg);
et initialisation cleanUp()
(c'est-à-dire ne plus communiquer par hazelcast et ne vérifiant plus le nombre de membres) est
- moins de 30 secondes, pas de communication et
members: 1
- plus de 30 secondes: tous les membres sont trouvés et la communication se produit (ce qui, bizarrement, semble se produire bien plus longtemps que t - 30 secondes).
est-ce que 30 secondes est une durée réaliste dont un cluster hazelcast a besoin, ou y a-t-il quelque chose d'étrange qui se passe? Voici un log de 4 myPrograms exécution simultanée (à la recherche de hazelcast-members chevauche 30 secondes par exemple 1 et 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
Comment puis-je commencer mon algorithme distribué réel seulement après que suffisamment de membres sont présents dans le cluster hazelcast? Puis-je définir hazelcast.initial.min.cluster.size
par programmation? https://groups.google.com/forum/#!topic / hazelcast/sa-lmpEDa6A on dirait que cela bloquerait Hazelcast.newHazelcastInstance(cfg);
jusqu'à l'initiale.min.cluster.la taille est atteint. - Il Correct? Comment synchrone (dans lequel durée) les différentes instances seront-elles débloquées?
7 réponses
le problème semble être que le cluster commence (et s'arrête) et n'attend pas qu'il y ait assez de membres dans le cluster. Tu peux mettre le hazelcast.initial.min.cluster.la taille de la propriété, pour empêcher que cela se produise.
Vous pouvez mettre ' hazelcast.initial.min.cluster.taille' par programmation à l'aide de:
Config config = new Config();
config.setProperty("hazelcast.initial.min.cluster.size","3");
votre configuration est correcte mais vous avez paramétré un très long délai de multidiffusion de 200 secondes où le délai par défaut est de 2 secondes. définir une valeur plus petite résoudra le problème.
from Hazelcast Java API Doc: MulticastConfig.html#setmulticasttimeoutsecondes (int)
spécifie le temps en secondes qu'un noeud doit attendre une réponse multicast valide d'un autre noeud tournant dans le réseau avant de se déclarer comme noeud maître et de créer son propre cluster. Cela s'applique uniquement au démarrage de nœuds où aucun maître n'a encore été attribuée. Si vous spécifiez une valeur élevée, par exemple 60 secondes, cela signifie que jusqu'à ce qu'un maître soit sélectionné, chaque noeud va attendre 60 secondes avant de continuer,donc être prudent avec une haute valeur. Si la valeur est définie trop bas, il se peut que les noeuds abandonnent trop tôt et vont créer leur propre cluster.
il semble que vous utilisez TCP / IP clustering, donc c'est bien. Essayez ce qui suit (tiré du livre hazelcast)
si vous utilisez iptables, la règle suivante peut être ajoutée pour permettre le trafic sortant des ports 33000-31000:
iptables -A OUTPUT -p TCP --dport 33000:31000 -m state --state NEW -j ACCEPT
et pour contrôler le trafic entrant de n'importe quelle adresse au port 5701:
iptables -A INPUT -p tcp -d 0/0 -s 0/0 --dport 5701 -j ACCEPT
et pour permettre la réception de trafic de multidiffusion:
iptables -A INPUT -m pkttype --pkt-type multicast -j ACCEPT
test de connectivité Si vous avez des problèmes parce que les machines si vous ne Rejoignez pas un cluster, vous pouvez vérifier la connexion réseau entre les 2 machines. Vous pouvez utiliser un outil appelé iperf pour cela. Sur une machine vous exécutez: iperf-s-P 5701 Cela signifie que vous écoutez au port 5701.
À l'autre machine, vous exécutez la commande suivante:
iperf -c 192.168.1.107 -d -p 5701
Où vous remplacez '192.168.1.107" par l'adresse ip de votre première machine. Si vous exécutez la commande et vous obtenez un résultat comme ceci:
------------------------------------------------------------
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
Vous connaissez le 2 les machines peuvent se connecter entre elles. Toutefois, si vous voyez quelque chose comme ceci:
Server listening on TCP port 5701
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
connect failed: No route to host
Alors vous savez que vous pourriez avoir un problème de connexion réseau sur vos mains.
il semble que Hazelcast utilise l'adresse multicast 224.2.2.3 sur le port UDP 54327 (par défaut) pour discovery, puis le port 5701 pour TCP communication. L'ouverture du port UDP 54327 dans le pare-feu a corrigé discovery pour moi. (J'avais également ouvert le port TCP 5701 mais cela n'était pas suffisant.)
pouvez-vous essayer avec tcp/ip cluster en premier pour vous assurer que tout le reste est parfait? Une fois que vous avez confirmé qu'il n'y a pas de problème, essayez de multidiffusion. Il pourrait aussi s'agir d'un problème de pare-feu btw.
il semble donc que Multicast fonctionne sur votre réseau, ce qui est bien.
Pourriez-vous essayer avec les paramètres suivants:
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);
comme vous pouvez le voir, j'ai supprimé toute la personnalisation.
pouvez-vous essayer de créer votre instance Hazelcast comme ceci:
Config cfg = new Config();
HazelcastInstance hz = Hazelcast.newHazelcastInstance(cfg);
les trucs de managementcenter et la création des exécuteurs ne sont pas pertinents (j'ai ajouté ce code dans le testaments, donc j'en suis sûr à 100%).
alors vous devriez avoir exactement la même configuration réseau que le Testampp.