web-dev-qa-db-ja.com

マルチキャスト検出メカニズム用にプログラムでhazelcastをどのように構成しますか?

マルチキャスト検出メカニズム用にプログラムでhazelcastをどのように構成しますか?


詳細:

documentation は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());
_

アップデート1、asimarslanの回答を考慮

MulticastTimeoutをいじったら、_"Members: 1"_を取得するか、

2013年12月5日8:50:42 PM com.hazelcast.nio.ReadHandler警告:[192.168.0.9]:4446 [dev] hz._hzInstance_1_dev.IO.thread-in-0終了エンドポイントAddress [192.168.0.7]:4446へのソケット、原因:Java.io.EOFException:リモートソケットが閉じられました!Dec 05、2013 8:57:24 PM com.hazelcast.instance.Node重大:[192.168.0.9]:4446 [dev]クラスターに参加できず、シャットダウンしました!com.hazelcast.core.HazelcastException:300秒以内に参加できませんでした!


アップデート2、tcp/ipの使用に関するpveentjerの回答を考慮

構成を次のように変更しても、メンバーは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.");
_

より正確には、この実行は出力を生成します

デバッグ:JoinConfig {multicastConfig = MulticastConfig [enabled = false、multicastGroup = 224.2.2.3、multicastPort = 54327、multicastTimeToLive = 32、multicastTimeoutSeconds = 2、trustedInterfaces = []]、tcpIpConfig = TcpIpConfig [enabled = true、connectionTimeoutSeconds = 5、 members = [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'、connectionTimeoutSeconds = 5}}メンバー1人。

私の非ヘイゼルキャスト実装はUDPマルチキャストを使用しており、正常に動作します。ファイアウォールが本当に問題になるのでしょうか?


アップデート3、ネットワークのチェックに関するpveentjerの回答を考慮

Iptablesまたはiperfをインストールする権限がないため、 Getting Started With Hazelcast で説明されているように、_com.hazelcast.examples.TestApp_を使用してネットワークが機能しているかどうかを確認しています。第2章「すぐに見せびらかす」セクション:

192.168.0.1で_Java -cp hazelcast-3.1.2.jar com.hazelcast.examples.TestApp_を呼び出し、出力を取得します

_...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
_

次に、192.168.0.2で_Java -cp hazelcast-3.1.2.jar com.hazelcast.examples.TestApp_を呼び出して出力を取得します

_...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も検出用のポートですか?最後の出力の_38476_はIDまたはポートですか?

プログラムの構成では、自分のコードではまだ参加できません:(


アップデート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の少なくとも1つのインスタンスが同時に実行されている場合、すべてのTestAppインスタンスとすべてのmyProgramインスタンスが検出され、プログラムは正常に動作します。 TestAppを1回、次にmyProgramを2回並行して起動した場合、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が言ったように)?

私の実験はこれを確認するようです:Hazelcast.newHazelcastInstance(cfg);cleanUp()の初期化の間の時間t hazelcastを介して通信し、メンバーの数をチェックしなくなりました)

  • 30秒未満、通信なし、_members: 1_
  • 30秒以上:すべてのメンバーが見つかり、通信が行われます(奇妙なことにt-30秒よりはるかに長い間行われているようです)。

30秒は、hazelcastクラスターが必要とする現実的な時間範囲ですか、それとも何か奇妙なことが起こっていますか?同時に実行されている4つのmyProgramsのログを次に示します(hazelcast-membersを探すと、インスタンス1とインスタンス3で30秒重複します)。

_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/#!topic/hazelcast/sa-lmpEDa6A このように聞こえると、最初までHazelcast.newHazelcastInstance(cfg);がブロックされます.min.cluster.sizeに達しました。正しい?さまざまなインスタンスがブロック解除されるのはどのくらいの期間(どの期間内)ですか?

21
DaveFar

問題は、クラスターが開始(および停止)し、十分なメンバーがクラスターに追加されるまで待機しないことです。 hazelcast.initial.min.cluster.sizeプロパティーを設定して、これが起こらないようにすることができます。

次を使用して、プログラムで「hazelcast.initial.min.cluster.size」を設定できます。

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

設定は正しいですが、200秒の非常に長いマルチキャストタイムアウトを設定しました。デフォルトは2秒です。より小さな値を設定すると解決します。

HazelcastからJava API Doc: MulticastConfig.html#setMulticastTimeoutSeconds(int)

ノードがネットワーク内で実行されている別のノードからの有効なマルチキャスト応答を待機してから、自分自身をマスターノードとして宣言し、独自のクラスターを作成する時間を秒単位で指定します。これは、マスターがまだ割り当てられていないノードの起動にのみ適用されます。高い値を指定した場合、例えば60秒。これは、マスターが選択されるまで、各ノードは続行する前に60秒待機することを意味します。したがって、高い値を指定する場合は注意してください。値が低すぎると、ノードが早くあきらめ、独自のクラスターを作成する可能性があります。

6
asimarslan

TCP/IPクラスタリングを使用しているようですので、それは良いことです。以下を試してください(hazelcast bookから)

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

接続テストマシンがクラスターに参加しないために問題が発生している場合、2台のマシン間のネットワーク接続を確認できます。そのためには、iperfというツールを使用できます。 1台のマシンで次を実行します。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

そうすれば、手元にネットワーク接続の問題があるかもしれないことがわかります。

4
pveentjer

Hazelcastは、発見のためにUDPポート54327(デフォルト)でマルチキャストアドレス224.2.2.3を使用し、TCP通信。UDPポート54327を開くと、発見が修正されます。 (TCPポート5701も開いていましたが、それでは十分ではありませんでした。)

3
Ted Goddard

最初にtcp/ipクラスターを試して、他のすべてが正常であることを確認できますか?問題がないことを確認したら、マルチキャストを試してください。また、ファイアウォールの問題かもしれません。

2
pveentjer

そのため、マルチキャストはネットワークで機能しているようです。どっちがいい。

次の設定で試してみてください:

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

ご覧のとおり、すべてのカスタマイズを削除しました。

2
pveentjer