以下是我们在生产中遇到的问题的描述。请注意,我无法在测试或本地环境中重现该问题,因此无法为您提供测试代码。
我们有一个带有两个成员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)获取的锁似乎在重新启动操作后被删除。
目前这个问题似乎已经消失,但我们不确定它是否会再次发生。
您对可能的原因有什么建议,更重要的是您有任何建议吗?
在此问题案例中,启用客户端重做操作是否有帮助?
当我试图解释客户端似乎恢复了问题,但密钥仍然锁定在群集中,这对我的应用程序是致命的。
由于
答案 0 :(得分:0)
看起来客户端因为与集群断开连接而失去了锁的所有权。您可以在遇到的情况下使用IMap#forceUnlock
API。无论锁拥有者如何,它都会释放锁定,并且它始终成功解锁,永不阻止,并立即返回。