当前位置: 首页 > 知识库问答 >
问题:

Hazelcast-客户端模式拓扑/分布式映射锁问题

范楚
2023-03-14

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

我们有一个hazelcast集群,有两个成员M1、M2和三个客户端C1、C2、C3。Hazelcast版本为3.9。

客户端使用IMap。tryLock()方法,超时10秒。获得锁后,将执行关键和长时间运行的操作,最后使用IMap释放锁。unlock()方法。

生产中出现的问题如下:

在某个时间的瞬间t,我们首先在客户端C2看到M2的心跳失败。之后,com导致在获取分区表时出错。哈泽尔卡斯特。spi。例外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个答案

齐成和
2023-03-14

看起来客户端因为与集群断开连接而失去了锁的所有权。您可以在遇到的情况下使用IMap#forceUnlockAPI。无论锁所有者是谁,它都会释放锁,并且总是成功解锁,从不阻塞,并立即返回。

 类似资料:
  • 我在我的API(如MemTable)中使用Hazelcast作为嵌入式分布式映射,在将其发送到另一个存储之前积累条目。我的问题是: 我可以使用为IMap提供的LocalMapStats对象控制堆大小吗? 我正在阅读关于该对象的信息,我认为getHeapSize()或getOwnedEntryMemoryCost()加上getBackupEntryMemoryCost()等方法可能会给我提供内存成本

  • 我正在尝试测试我的分布式锁实现,但是我仍然没有找到使它工作的方法。我用两个简单的方法部署了一个REST服务,如下所示: distributedService对象实现getDistributedLock()方法: 在黑兹尔卡斯特。xml文件,我启用了TCP-IP连接,并禁用了其他所有功能: 我在这两台机器上部署了应用程序,IP地址与。xml文件(192.168.0.01和192.168.0.02),

  • 现在我使用的是瘦客户机的ignite ClientCache,我没有找到ClientCache的分布式锁,如果要使用分布式锁,必须使用ignition.start()

  • 本系统中的分布式锁设计用于Storm多个线程实例抢占Redis缓存资源时出现的事务性问题,这个事务性问题是由客户端本身业务逻辑需求产生的,无法在服务端进行有效处理,需给出一个分布式资源同步的方案,此处我们采用了分布式锁来完成这项设计。 锁是编程中非常常见的概念。在维基百科上对锁有个相当精确的定义:在计算机科学中,锁是一种在多线程环境中用于强行限制资源访问的同步机制。锁被设计用于执行一个互斥的并发控

  • 我读了很多和Storm有关的网站。但我仍然无法将拓扑结构完美地映射到Storm集群中。 请帮助我理解这一点。 在Storm集群中有这样的术语 null null null 所有这些都要用Storm集群来映射。我已经在一个项目里工作了。所以我知道拓扑结构。

  • 上一章中我们谈论了如何在Vim中映射按键。我们使用的命令map在normal模式下工作。 如果阅读本章之前你自己已经折腾了,可能会注意到这个映射在visual模式一样工作。 你可以使用nmap、vmap和imap命令分别指定映射仅在normal、visual、insert模式有效。 执行如下命令: :::vim :nmap \ dd 在normal模式下,按下\。Vim会删除当前行。 现在进入V