【问题标题】:Hazelcast OperationTimeoutException on remote executionHazelcast OperationTimeoutException 远程执行
【发布时间】:2019-11-15 05:22:20
【问题描述】:

我在 AWS 中运行版本为 3.6.6 的 5 节点 Hazelcast 集群。 我将它用作工作负载分发器,并且我正在使用

IExecutorService
<T> void submit(Runnable  task,
              MemberSelector memberSelector,
              ExecutionCallback<T> callback)

在我选择的成员上执行任务的 API。我不使用基于分区的平衡,因为不同的分区会有不同的权重。

在我启动集群后,它运行了好几天,然后提交成员开始收到 OperationTimeoutException。一旦开始,所有成员都开始收到此超时,并且它偶尔会发生,可能会在短时间内一切顺利,然后此异常再次开始发生。目标成员确实会在不到一秒的时间内收到任务并正确执行。 异常本身如下所示:

世界标准时间 2019 年 7 月 3 日 10:54:01:

560000 毫秒无响应。中止调用! 调用{serviceName='hz:impl:executorService', op=com.hazelcast.executor.impl.operations.MemberCallableTaskOperation{identityHash=1179024466, serviceName='hz:impl:executorService',partitionId=-1,replicaIndex=0, callId=684145,invocationTime=1562150679963(世界标准时间 7 月 3 日星期三 10:44:39 2019), waitTimeout=-1, callTimeout=500000, name=exec_service_3}, partitionId=-1,replicaIndex=0,tryCount=250,tryPauseMillis=500, 调用计数=1,调用超时=500000, 目标=地址[x.x.x.x]:5701,备份预期=0, 备份完成=0,连接=连接 [/x.x.x.x:5701 -> /x.x.x.x:35360],端点=地址[x.x.x.x]:5701, alive=true, type=MEMBER} 没有收到回复! 备份预期:0 备份完成:0,执行时间:3445 毫秒

堆栈跟踪:

at com.hazelcast.spi.impl.operationservice.impl.Invocation.newOperationTimeoutException(Invocation.java:536) ~[anodot-arnorld-1.0-SNAPSHOT.jar:na]
    at com.hazelcast.spi.impl.operationservice.impl.IsStillRunningService$IsOperationStillRunningCallback.setOperationTimeout(IsStillRunningService.java:241)
    at com.hazelcast.spi.impl.operationservice.impl.IsStillRunningService$IsOperationStillRunningCallback.onResponse(IsStillRunningService.java:229)
    at com.hazelcast.spi.impl.operationservice.impl.InvocationFuture$1.run(InvocationFuture.java:127)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_121]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:76) [anodot-arnorld-1.0-SNAPSHOT.jar:na]
    at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:92)
    at ------ End remote and begin local stack-trace ------.(Unknown Source) ~[na:na]
    ... 8 frames truncated

异常发生的时机相当诡异:

July 3rd 2019, 10:53:57.956 - task submitted for execution by sending instance
July 3rd 2019, 10:53:58.024 - execution starts on target instance
July 3rd 2019, 10:54:01.391 - the sending instance receives the exception

在我的日志中,我看到超时发生在提交任务后不久,并且“执行已执行:”部分异常非常精确,实际上在引用的情况下,自任务发送到执行以来经过的时间是约 3.5 秒。另一方面,引用案例中的“invocationTime”(Wed Jul 03 10:44:39 UTC 2019)大约是过去 10 分钟,即使在作业实际提交执行之前(UTC 时间 2019 年 7 月 3 日 10:53:57)

我已经看到这个异常归因于长时间的 GC 暂停,但由于我一直在监控 GC,我很确定情况并非如此。此外,集群成员之间的网络看起来很活跃,延迟很低。

从我在 Hazelcast 代码中看到的内容来看,“invocationTime”取自“clusterClock”而不是直接取自系统时间,这表明由于某种原因集群时钟关闭了 10 分钟,但我不能弄清楚为什么会这样。集群非常繁忙,但当此异常开始发生时,我没有看到任何异常的负载激增。 当我取下整个集群然后重新启动它时,问题就消失了。 我计划在 clusterTime 上添加监控以查看它何时开始漂移,但它仍然无法解释为什么会发生这种情况。 有什么想法吗?

更新: 简而言之,集群时间从系统时间随时间漂移,一旦差距足够大,任务就会开始失败并出现超时异常。 详情:https://github.com/hazelcast/hazelcast/issues/15339

【问题讨论】:

  • 您有机会在更高版本之一上试用此功能吗?如果我没记错的话,我记得在系统时钟上看到了一些错误修复,您可能刚刚遇到了这个问题。再一次 - 最好是通过使用更新的版本进行测试来验证,3.6 已经很旧了。
  • 感谢您的建议,我可能会遵循它。同时我在HZ github上提交了一个问题,也许他们可以验证该错误是否为已知错误以及是否已修复最新版本
  • 您找到解决此问题的方法或解决了升级问题吗?在第二种情况下,您是否设法进行滚动升级?
  • 我权衡了几个选项来解决这个问题,包括更换集群时钟的内部实现,但最后我最终监控了这个时间漂移并不时重启集群。然而,长期的解决方案是将集群升级到更新的版本。幸运的是,我可以一次完全重启这个集群。您是否遇到滚动升级的问题?

标签: timeout hazelcast execution


【解决方案1】:

最后,通过将 Hazelcast 版本升级到 3.12.11(4.x.x 破坏了太多东西)解决了这个问题,看起来集群时间的管理方式对 GC 暂停不敏感。一些 API 被破坏了,需要对代码进行调整,没什么太严重的。警告说明,3.6.6 与 3.12.11 不兼容,因此无法进行滚动集群升级。我们做了一个完整的集群重启,幸运的是,这是可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2012-07-05
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多