我使用的是hazelcast v3.6(客户端 - 服务器模式)。客户端和服务器配置的相关部分将在下面复制。当我调用IMap.size()时,我得到了已插入测试集群(2节点)的完整数据集的计数。但是,当我得到keySet或entrySet时,我只得到一半键/对象的设置。我尝试从客户端运行localKeySet,但会引发以下异常:
Exception in thread "main" java.lang.UnsupportedOperationException: Locality is ambiguous for client!!!
at com.hazelcast.client.proxy.ClientMapProxy.localKeySet(ClientMapProxy.java:1172)
我认为localKeySet在客户端上不可用,但也需要再次确认。
客户端配置 - 相关部分,而非完整配置:
<hazelcast-client xsi:schemaLocation="http://www.hazelcast.com/schema/client-config hazelcast-client-config-3.6.xsd"
xmlns="http://www.hazelcast.com/schema/client-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<properties>
<property name="hazelcast.client.shuffle.member.list">true</property>
<property name="hazelcast.client.heartbeat.timeout">60000</property>
<property name="hazelcast.client.heartbeat.interval">5000</property>
<property name="hazelcast.client.event.thread.count">5</property>
<property name="hazelcast.client.event.queue.capacity">1000000</property>
<property name="hazelcast.client.invocation.timeout.seconds">120</property>
</properties>
<network>
<cluster-members>
<!-- ip addresses replaced -->
<address>101.102.103.104</address>
<address>101.102.103.105</address>
</cluster-members>
<smart-routing>true</smart-routing>
<redo-operation>true</redo-operation>
<connection-timeout>60000</connection-timeout>
<connection-attempt-period>3000</connection-attempt-period>
<connection-attempt-limit>2</connection-attempt-limit>
<socket-options>
<tcp-no-delay>false</tcp-no-delay>
<keep-alive>true</keep-alive>
<reuse-address>true</reuse-address>
<linger-seconds>3</linger-seconds>
<timeout>-1</timeout>
<buffer-size>32</buffer-size>
</socket-options>
</network>
服务器配置 - 相关部分
<network>
<port auto-increment="true" port-count="100">5701</port>
<outbound-ports>
<ports>0-5900</ports>
</outbound-ports>
<join>
<multicast enabled="false">
</multicast>
<tcp-ip enabled="true">
<member>101.102.103.104</member>
<member>101.102.103.105</member>
</tcp-ip>
</join>
<interfaces enabled="true">
<interface>101.102.103.104</interface> <!-- this is modified for the second server node -->
</interfaces>
<ssl enabled="false" />
<socket-interceptor enabled="false" />
<symmetric-encryption enabled="false">
<algorithm>PBEWithMD5AndDES</algorithm>
<!-- salt value to use when generating the secret key -->
<salt>test</salt>
<!-- pass phrase to use when generating the secret key -->
<password>testpass</password>
<!-- iteration count to use when generating the secret key -->
<iteration-count>19</iteration-count>
</symmetric-encryption>
</network>
有关可能导致问题的原因及解决方法的想法吗?
更新: 我已经尝试在另一个两个节点集群上复制设置但是无法重现相同的问题。当我在新集群上调用keySet时,我获得了全套密钥,而不是一半(与原始集群不同)。我知道我可以使用Predicates而不是获取整个keySet。
更新 我将在不久的将来尝试这样做 - 我必须深入研究日志。当我关闭一个节点而第二个节点成为所有数据的主要节点时,问题得到了解决(它是一个双节点测试集群,异步复制因子为1)。之后,当我再次启动第二个节点时,数据再次分发,我没有看到两个节点集群有任何问题。所以看起来在集群启动之后发生的事情导致了hazelcast客户端从两个节点获取映射值,但是对键集/条目集的任何调用只是从一个节点获取键/值。我尝试在hazelcast客户端(xml文件)中切换订单,以查看是否会更改客户端正在接收但未解决问题的密钥集/条目。