【发布时间】:2018-02-19 10:44:57
【问题描述】:
以下是我们在生产中遇到的问题的描述。请注意,我无法在测试或本地环境中重现该问题,因此无法为您提供测试代码。
我们有一个 hazelcast 集群,其中有两个成员 M1、M2 和三个客户端 C1、C2、C3。 Hazelcast 版本是 3.9。
客户端使用 IMap.tryLock() 方法,超时时间为 10 秒。获得锁后,执行关键和长时间运行的操作,最后使用 IMap.unlock() 方法释放锁。
生产中出现的问题如下:
在某个时刻 t,我们第一次看到客户端 C2 的 M2 心跳失败。之后com.hazelcast.spi.exception.TargetDisconnectedException导致获取分区表出错:
[hz.client_0.internal-2 ] WARN [] HeartbeatManager - hz.client_0 [mygroup] [3.9] HeartbeatManager failed to connection: .....
[hz.client_0.internal-3 ] WARN [] ClientPartitionService - hz.client_0 [mygroup] [3.9] Error while fetching cluster partition table!
java.util.concurrent.ExecutionException: com.hazelcast.spi.exception.TargetDisconnectedException: Heartbeat timed out to owner connection ClientConnection{alive=true, connectionId=1, ......
在初始心跳失败后大约 250 毫秒,客户端断开连接,然后在 20 毫秒内重新连接。
[hz.client_0.cluster- ] INFO [] LifecycleService - hz.client_0 [mygroup] [3.9] HazelcastClient 3.9 (20171023 - b29f549) is CLIENT_DISCONNETED
[hz.client_0.cluster- ] INFO [] LifecycleService - hz.client_0 [mygroup] [3.9] HazelcastClient 3.9 (20171023 - b29f549) is CLIENT_CONNECTED
我们遇到的问题是,对于一些以前被 C2 获取的键,C1 和 C3 无法获取锁,即使它似乎被 C2 释放了。 C2 可以获得锁,但这会造成无法接受的延迟 到应用程序并且是不可接受的..自从锁被释放后所有客户端都应该得到......
我们在收到投诉后被告知该问题,然后重新启动了客户端应用程序 C2。
如http://docs.hazelcast.org/docs/latest-development/manual/html/Distributed_Data_Structures/Lock.html 中所述,重新启动的成员(在我的情况下为 C2)获取的锁似乎在重新启动操作后被删除。
目前问题似乎已经消失,但我们不确定它是否会再次出现。
您对可能的原因有什么建议吗?更重要的是,您有什么建议吗?
是否会在此问题案例的客户端帮助中启用重做操作?
正如我试图解释的那样,客户端似乎恢复了问题,但密钥仍然锁定在集群中,这对我的应用程序来说是致命的。
谢谢
【问题讨论】:
-
嗨,关于根本原因的任何建议?
标签: java locking hazelcast hazelcast-imap