2

我正在使用 Hazelcast 3.3.1 版。
我有一个使用 c3.2xlarge 服务器在 aws 上运行的 9 节点集群。
我正在使用分布式执行器服务和分布式地图。
分布式执行器服务使用单线程。分布式映射配置为无复制和无近缓存,并使用 Kryo 序列化程序存储大约 100 万个大小为 1-2kb 的对象。
我的用例如下:

  • 所有 9 个节点不断在分布式执行器服务上执行同步远程操作,每秒产生约 20k 次命中(每个节点约 ~2k)。
  • 使用 Hazelcast API 执行调用:com.hazelcast.core.IExecutorService#executeOnKeyOwner。
  • 每个操作访问拥有分区的节点上的分布式映射,使用存储的对象进行一些计算并将对象存储到映射中。(为此,我使用 IMap 对象的 get 和 set API)。

每隔一段时间,Hazelcast 就会遇到超时异常,例如:
com.hazelcast.core.OperationTimeoutException: No response for 120000 ms。中止调用!BasicInvocationFuture{invocation=BasicInvocation{ serviceName='hz:impl:mapService', op=GetOperation{}, partitionId=212, replicaIndex=0, tryCount=250, tryPauseMillis=500, invokeCount=1, callTimeout=60000, target=Address[ 172.31.44.2]:5701, backupsExpected=0, backupsCompleted=0}, response=null, done=false} 没有收到响应!备份预期:0 备份完成:0

在某些情况下,我看到地图分区开始迁移,这让事情变得更糟,节点不断地离开并重新加入集群,我可以克服这个问题的唯一方法是重新启动整个集群。

我想知道是什么可能导致 Hazelcast 阻止地图获取操作 120 秒?
我很确定这与网络无关,因为同一服务器上的其他服务运行良好。另请注意,服务器大多处于空闲状态(~70%)。

对我的用例的任何反馈将不胜感激。

4

1 回答 1

0

为什么不使用入口处理器?这也会发送到拥有分区的正确机器,并且加载、修改、存储是自动和原子地完成的。所以没有种族问题。由于涉及的远程处理较少,因此它可能会大大优于当前的方法。

map.get 没有返回 120 秒的事实确实非常令人困惑。如果您切换到 Hazelcast 3.5,我们使用慢操作检测器(执行端)和慢速调用检测器(调用方)为此添加了一些日志记录/调试内容,并且应该让您了解正在发生的事情。

您是否看到正在打印任何运行状况监视器日志?

于 2015-10-26T14:00:35.223 回答