4

如何配置 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 成员找不到的问题,请参阅https://stackoverflow.com/a/20716919/750378

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

更新

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

4

3 回答 3

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 但不同的端口。

于 2014-04-10T13:37:12.643 回答
2

请参阅此线程以获取更多信息。根据那里的信息,您最好的选择是:

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

如果您确保它们没有冲突的端口设置,在同一台物理机器上启动两个 JVM有时可能会起作用,但您可能会遇到各种问题(即,我敢打赌他们将无法正确收听相同的多播端口)。我建议不要使用这种方法。

于 2014-04-22T00:33:06.160 回答
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();
    }
于 2014-04-15T09:09:45.287 回答