【问题标题】:Behavior of initial.min.cluster.sizeinitial.min.cluster.size 的行为
【发布时间】:2015-09-14 08:45:38
【问题描述】:

如果没有达到initial.min.cluster.size,Hazelcast 是否总是阻塞?如果不是,在哪些情况下不是?


详情: 我使用以下代码来初始化 hazelcast:

Config cfg = new Config();  
cfg.setProperty("hazelcast.initial.min.cluster.size",Integer.
    toString(minimumInitialMembersInHazelCluster));  //2 in this case
cfg.getGroupConfig().setName(clusterName);

NetworkConfig network = cfg.getNetworkConfig();
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").setRequiredMember(null).setEnabled(true);  
network.getInterfaces().setEnabled(true).addInterface("192.168.0.*");
join.getMulticastConfig().setMulticastTimeoutSeconds(MCSOCK_TIMEOUT/100);           
hazelInst = Hazelcast.newHazelcastInstance(cfg);
distrDischargedTTGs = hazelInst.getList(clusterName);

并获得类似的日志消息

调试:从 Hazelcluster 启动 Hazel pullExternal,有 1 个成员。

这是否意味着已经有另一个成员加入并离开了?从另一个实例的日志文件来看,情况并非如此。因此,我想知道是否存在hazelInst = Hazelcast.newHazelcastInstance(cfg); 不会阻塞的情况,即使它是 hazelcast 集群中的唯一实例。

【问题讨论】:

标签: distributed distributed-computing hazelcast


【解决方案1】:

newHazelcastInstance 阻塞,直到集群拥有所需数量的成员。

如何实现请看下面的代码:

private static void awaitMinimalClusterSize(HazelcastInstanceImpl hazelcastInstance, Node node, boolean firstMember)
        throws InterruptedException {

    final int initialMinClusterSize = node.groupProperties.INITIAL_MIN_CLUSTER_SIZE.getInteger();
    while (node.getClusterService().getSize() < initialMinClusterSize) {
        try {
            hazelcastInstance.logger.info("HazelcastInstance waiting for cluster size of " + initialMinClusterSize);
            //noinspection BusyWait
            Thread.sleep(TimeUnit.SECONDS.toMillis(1));
        } catch (InterruptedException ignored) {
        }
    }
    if (initialMinClusterSize > 1) {
        if (firstMember) {
            node.partitionService.firstArrangement();
        } else {
            Thread.sleep(TimeUnit.SECONDS.toMillis(3));
        }
        hazelcastInstance.logger.info("HazelcastInstance starting after waiting for cluster size of "
                + initialMinClusterSize);
    }
}

如果您将日志记录设置为调试,那么也许您可以更好地看到正在发生的事情。成员加入和离开应该已经在信息下可见。

【讨论】:

  • 感谢 pveentjer 的快速而良好的回答。一如既往:)我想知道你的最后一句话,但是:newHazelcastInstance 调用awaitMinimalClusterSize,它会等待至少 initialMinClusterSize 实例出现!? (但 Thread.sleep 可能不会阻塞!?)
  • 我不知道 newHazelcastInstance 的调用是否会阻塞,或者以后与集群的交互是否会阻塞。我刚刚验证过;调用 newHazelcastInstance 直到集群具有所需的大小。
  • 非常感谢,pveentjer :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2020-04-08
  • 2011-08-31
  • 2012-11-08
  • 2011-09-15
  • 2013-04-05
相关资源
最近更新 更多