Hazelcast异常将布尔值放入地图中

问题描述 投票:0回答:1

几个月前,我们开始使用Hazelcast。我们最近开始在生产环境中对其进行测试,现在大约每周一次会看到此异常:

2020-02-11 12:10:00,084com.hazelcast.partition.NoDataMemberInClusterException:目标找不到调用!分区所有者为空,但分区无法分配,因为集群中的所有节点都是精简成员。在com.hazelcast.spi.impl.operationservice.impl.PartitionInvocation.newTargetNullException(PartitionInvocation.java:90)在com.hazelcast.spi.impl.operationservice.impl.Invocation.initInvocationTarget(Invocation.java:269)在com.hazelcast.spi.impl.operationservice.impl.Invocation.doInvoke(Invocation.java:556)在com.hazelcast.spi.impl.operationservice.impl.Invocation.invoke0(Invocation.java:534)在com.hazelcast.spi.impl.operationservice.impl.Invocation.invoke(Invocation.java:236)在com.hazelcast.spi.impl.operationservice.impl.InvocationBuilderImpl.invoke(InvocationBuilderImpl.java:59)在com.hazelcast.map.impl.proxy.MapProxySupport.invokeOperation(MapProxySupport.java:467)在com.hazelcast.map.impl.proxy.MapProxySupport.putInternal(MapProxySupport.java:406)在com.hazelcast.map.impl.proxy.MapProxyImpl.put(MapProxyImpl.java:121)com.hazelcast.map.impl.proxy.MapProxyImpl.put(MapProxyImpl.java:111)

这是从Hazelcast 4.0 GA发布于2/4/20。运行3.12.x版本的我们也遇到了这种情况。我们希望每次升级到较新版本时,异常都会消失。

我们的设置非常简单。 Hazelcast在具有大量可用内存和Java 8的单个服务器上运行。我们所要做的就是将一个true / false值放入一个仅包含一个零值的整数键的映射中。真的,这就像可能的最小地图!服务器可以正常运行许多天,但最终该异常从map.put(0,bool)抛出。

我们代码的其他部分大量使用了Hazelcast的执行程序。到目前为止,我们还没有遇到任何麻烦。

我们像这样配置Hazelcast:

config.setInstanceName(name);        

config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
config.getNetworkConfig().getJoin().getAwsConfig().setEnabled(false);
config.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true);
config.getNetworkConfig().setPortAutoIncrement(true);
config.getNetworkConfig().setPort(5701);
config.getNetworkConfig().getJoin().getTcpIpConfig().addMember(AppConfig.getConfigSetting("/config/server/ip_address"));

hazelcastInstance = Hazelcast.newHazelcastInstance(config);

除此以外,我找不到有关此异常的任何信息:https://docs.hazelcast.org/docs/latest/javadoc/com/hazelcast/partition/NoDataMemberInClusterException.html

希望有人可以帮助您解决此问题。我们期望Hazelcast的地图在单个服务器上是防弹的。

hazelcast
1个回答
0
投票

请参见https://github.com/hazelcast/hazelcast/issues/16651

该问题显然是由于在Amazon EC2实例上运行Hazelcast。我们需要对我们使用的配置设置进行调整以定义出站端口范围。我们最终的工作配置设置如下:

com.hazelcast.config.Config config = new com.hazelcast.config.Config();

config.setProperty("hazelcast.logging.type", "log4j");

String name = AppCluster.isWorkerServer ? "worker "+AppHTTP.getSystemDomainAndContext() : "master"; 

config.setInstanceName(name);        

config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
config.getNetworkConfig().getJoin().getAwsConfig().setEnabled(false);
config.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true);
config.getNetworkConfig().setPort(5701);
config.getNetworkConfig().setPortAutoIncrement(false);
config.setProperty("hazelcast.socket.bind.any", "false");

// The next line is a suggested workaround for running on Amazon AWS to avoid periodic hazelcast crashes
// https://github.com/hazelcast/hazelcast/issues/16651
config.getNetworkConfig().addOutboundPortDefinition("30000-60000");

// Default value to use when a single server
String hazelcastIP = "127.0.0.1";
if (AppCluster.isWorkerServer || AppCluster.totalServers > 1)
{
    if (AppConfig.getConfigSetting("/config/server/ec2_private_ip").length() > 0)
    {
        // If clustered and in Amazon AWS, use the server's private IP address
        hazelcastIP = AppConfig.getConfigSetting("/config/server/ec2_private_ip");
    }
    else
    {
        // If clustered and not in Amazon AWS, use the server's public IP address
        hazelcastIP = AppConfig.getConfigSetting("/config/server/ip_address");
    }
}

config.getNetworkConfig().setPublicAddress(hazelcastIP);
config.setProperty("hazelcast.local.localAddress", hazelcastIP);

hazelcastInstance = Hazelcast.newHazelcastInstance(config);
© www.soinside.com 2019 - 2024. All rights reserved.