Hazelcast - OperationTimeoutException

Posted

技术标签:

【中文标题】Hazelcast - OperationTimeoutException【英文标题】: 【发布时间】:2015-02-17 20:32:38 【问题描述】:

我正在使用 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。中止调用! BasicInvocationFutureinvocation=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 阻止 map-get 操作 120 秒? 我很确定这与网络无关,因为同一服务器上的其他服务运行良好。 另请注意,服务器大多处于空闲状态 (~70%)。

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

【问题讨论】:

这里有什么新信息吗?我也有同样的问题。 据我们了解,由于处理远程请求的节点上的高延迟导致的问题。我们做了两件事来解决这个问题: 1. 摆脱 Hazelcast 映射并使用本地映射来减少序列化延迟(实现我们自己的持久性)。 2. 使用 Hazelcast API 实现了一个非阻塞的“executeOnKeyOwner”操作。 我也面临类似的情况,这可能与github.com/hazelcast/hazelcast/issues/2051有关 【参考方案1】:

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

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

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

【讨论】:

以上是关于Hazelcast - OperationTimeoutException的主要内容,如果未能解决你的问题,请参考以下文章

Hazelcast分布式计算的demo

Hazelcast是什么

使用 SmartFoxServer 实现 Hazelcast

Hazelcast 正在使用大量 JVM 线程

hazelcast.xml的默认配置文件

Hazelcast 集群:序列化和复制问题