我正在使用 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%)。
对我的用例的任何反馈将不胜感激。