在一台计算机上同步启动2个hazelcast实例(使用hazelcast.initial.min.cluster.size = 2)

时间:2014-04-09 10:36:42

标签: java configuration hazelcast distributed-algorithm

如何配置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"),因此两个分布式实例同步启动我的分布式算法。此外,它解决了找不到一些淡褐色成员的问题,请参阅https://stackoverflow.com/a/20716919/750378

那么在单台机器上运行时如何避免这两个问题呢?如果群集大小简单地是运行的hazelcast实例的数量,那将是很好的。然后,无论我如何部署我的两个实例(在1或2台机器上),我都可以保持我的配置。

更新

我已在https://github.com/hazelcast/hazelcast/issues/2292发布了有关群集大小的问题。

3 个答案:

答案 0 :(得分:5)

您可以使用同一台计算机运行多个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但不同的端口中注册。

答案 1 :(得分:2)

您应该在不同的线程中启动实例。 见以下测试:

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

答案 2 :(得分:2)

有关详细信息,请参阅this thread。根据那里的信息,你最好的选择是:

  1. 确保您使用的配置允许群集中的两台计算机位于同一台计算机上(请查看附加到该主题的示例配置文件)
  2. 在同一个JVM上运行两台计算机(而不是启动两个单独的JVM)
  3. 正在运行一个相当新的版本(3.1.2应该没问题)

  4. 在同一台物理计算机上启动两个JVM 可能有时可以确保它们没有冲突的端口设置,但是您可能会遇到各种问题(例如,我打赌他们不能正确地听同一个多播端口)。我建议反对这种做法。