Hazelcast - 客户端模式拓扑/分布式地图锁定问题

时间:2018-02-19 10:44:58

标签: java locking hazelcast hazelcast-imap

以下是我们在生产中遇到的问题的描述。请注意,我无法在测试或本地环境中重现该问题,因此无法为您提供测试代码。

我们有一个带有两个成员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)获取的锁似乎在重新启动操作后被删除。

目前这个问题似乎已经消失,但我们不确定它是否会再次发生。

您对可能的原因有什么建议,更重要的是您有任何建议吗?

在此问题案例中,启用客户端重做操作是否有帮助?

当我试图解释客户端似乎恢复了问题,但密钥仍然锁定在群集中,这对我的应用程序是致命的。

由于

1 个答案:

答案 0 :(得分:0)

看起来客户端因为与集群断开连接而失去了锁的所有权。您可以在遇到的情况下使用IMap#forceUnlock API。无论锁拥有者如何,它都会释放锁定,并且它始终成功解锁,永不阻止,并立即返回。