分布式锁服务[关闭]

Posted

技术标签:

【中文标题】分布式锁服务[关闭]【英文标题】:Distributed Lock Service [closed] 【发布时间】:2010-11-06 18:31:06 【问题描述】:

你会使用哪种分布式锁服务?

要求是:

    可以从不同进程/机器看到的互斥(锁) 锁定...释放语义 一定超时后自动释放锁 - 如果锁持有者死亡,它将在 X 秒后自动释放 Java 实现 很高兴拥有:.Net 实现 如果它是免费的:死锁检测/缓解 易于部署,请参见下面的说明。

我对“可以通过数据库完成”或“可以通过 JavaSpaces 完成”之类的答案不感兴趣——我知道。我对现成的、开箱即用的、经过验证的实施很感兴趣。

【问题讨论】:

将死锁协商添加到您的列表中:P 出于我的目的,它不是必需的。我会添加一个不错的。 您可能对this NuGet package 感兴趣,它可以轻松将SqlServer 内置的应用锁功能用作分布式锁服务器。 【参考方案1】:

街区里的一个新孩子是hazelcast。我一直在使用它,它的使用和配置非常简单。

据我所知,Gigaspaces 和 hazelcast 之间不应该有任何冲突,因为 hazelcast 没有任何依赖关系,即没有 jgroups.jar 等

榛树

    互斥(锁定),是的java.util.concurrency.locks.Lock 的实现 在特定超时后自动释放锁,是的,如果成员离开集群,所有锁都会被释放 Java 实现,是的 很高兴拥有:.Net 实现,不是纯 java 解决方案,可能可以移植到 j# 如果它是免费的:死锁检测/缓解,不,我的 Hazelcast 没有努力处理这个问题 易于部署,它是带有单个配置文件的单个 jar,作为应用程序的一部分进行部署,无需其他流程

【讨论】:

任何部署工作?我会细化我的问题 - 不需要进一步部署并且可以使用 mysql、JavaSpaces/GigaSpaces 或 NetApp 的解决方案是(非常)可取的。 我还没有真正部署 Hazelcast,但我正在积极考虑将它用于分布式锁定。部署似乎几乎是微不足道的,因为没有外部进程,集群中的所有 JVM 都只是想知道要做什么 看起来很可疑。他们至少需要以某种方式了解彼此的存在......无论如何,我更喜欢(并坚持)基于我们正在使用的现有技术的解决方案 - 我认为在我们已经工作时引入另一个集群框架是不明智的与 GigaSpaces。有没有可能不存在基于MySql的解决方案??? 是的,hazelcast 使用多播自动发现它的成员,如果多播不合适,也可以硬连线集群。如果你想使用 MySql 锁定东西,那真的很容易,不是吗?只需执行 'SELECT ID FROM LOCK_TABLE WHERE ID = sharedname FOR UPDATE' 对于#2,它似乎并不能完全满足某人的需求。如果您在一台机器上有多个工作线程并且其中一个变得流氓或卡住而没有返回锁,那么您可能仍然希望在一定时间后使该锁过期。您可能不会得到完整的服务器故障,只是在释放锁之前发生线程故障。反正有这个问题吗?【参考方案2】:

查看 Apache 的 Zookeeper(一个 Hadoop 子项目)——它提供分布式同步。文档不是很好,但其中的内容使它看起来是一个有趣的产品 - 查看食谱以获取有关如何使用 Zookeeper 的想法。

它的级别比您可能想要的要低,而且它确实需要额外的部署,因为它建议使用专用服务器。

您可以对不同的锁定策略进行建模,它确实为锁持有者死亡(临时节点)提供了解决方案。

【讨论】:

AFAIU,ZooKeeper 在每次获取锁时都会写入磁盘。太贵了。 写入预写日志是为了可恢复性。并且由于锁服务是分布式的,如果锁没有被缓存,锁获取将导致网络旅行。与网络旅行相比,追加到磁盘并不是很昂贵。 Zookeepr 用于许多分布式系统,例如 HBase。它的性能很好。 Zookeeper 是低级的,但有curator.apache.org/getting-started.html 解决了这个问题。【参考方案3】:

Teracotta,包括开源版本,通过使用 synchronizedjava.util.concurrent.ReentrantReadWriteLock 具有分布式锁定语义 - 后者显然符合您的要求。


更新

既然问题现在添加了与 GigaSpaces '混合'的要求,我想说不要混合它们。它只会增加您的技术堆栈的复杂性,并且需要付出以下努力:

在代码和基础架构方面进行集成; 管理它们之间的同步; 学习/调整/调试 Teracotta。

将更好地用于创建或实施基于 GigaSpaces 的锁定解决方案。

【讨论】:

假设我们已经在使用 GigaSpaces,你会添加 Terracotta 吗?两人配合得好吗? 这就是我目前要去的方向。准备好后会发布。【参考方案4】:

我建议使用Redisson,它是基于内存数据网格的Redis。它实现了熟悉的 Java 数据结构,包括分布式 java.util.Lockjava.util.concurrent.ReentrantReadWriteLock 对象。包括设置租约时间的能力。 Lock用法示例:

Redisson redisson = Redisson.create(config);

Lock lock = redisson.getLock("anyLock");
try 
   // unlock automatically after 10 seconds of hold
   lock.lock(10, TimeUnit.SECONDS);

 finally 
   lock.unlock();


...

redisson.shutdown();

支持 Azure 和 AWS 等云供应商。

【讨论】:

这是否涵盖了问题的所有用例?我看了看,没有看到锁上有自动过期超时功能。 @Scott 我修正了我的答案,在 Redisson 1.1.4 版本中添加了设置锁定释放超时的新功能【参考方案5】:

ZooKeeper 在Apache Curator 框架的帮助下成为分布式锁定的事实标准。查看recipes 中的锁以获取更多信息。

【讨论】:

虽然我不同意你的观点,但我仍然想知道关于“ZooKeeper 成为事实”的相关信息,你是如何衡量的?【参考方案6】:

Oracle Coherence 非常稳定和成熟,包括互斥支持:

  cache.lock(key, -1);
    try 
      // .. add your critical code here
     finally 
      cache.unlock(key);
    

锁在服务器故障、滚动重启等情况下仍然存在。

为了全面披露,我在 Oracle 工作。这篇文章中表达的观点和观点是我自己的,并不一定反映我雇主的观点或观点。

【讨论】:

我不明白你的说法,部分是因为它在语法上不正确,部分是因为它似乎是一个无效的声明。我不再使用 Oracle,但 Oracle Coherence 是 2001 年首次发布的分布式系统,自 2001 年发布 1.0 以来一直支持分布式锁定。该软件已被亚马逊等公司和大多数其他在线公司用于构建分布式系统零售商、纽约证券交易所和大多数其他证券交易所、世界上所有主要银行、大多数航空公司等等。 你能分享一些我可以探索的链接吗? 它是 Oracle 产品:twitter.com/taotetek/status/1142031107640188928 ... 这意味着除非您已经是 Oracle 客户,否则它可能很难使用,因为 Oracle 主要与大公司合作并以巨大的价格销售它们捆绑的谁知道什么(称为“企业许可协议”)。但是您可以轻松下载 Coherence 的评估副本:oracle.com/technetwork/middleware/coherence/downloads/… ... 和 doc docs.oracle.com/middleware/12213/coherence/index.html

以上是关于分布式锁服务[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

分布式锁服务设计01设计方案

Redis分布式锁

Redis分布式锁服务

在 Java 中利用 redis 实现一个分布式锁服务

定时任务部署多少台服务器,怎么确保只有一台服务器执行--redis 分布式锁

zookeeper怎么实现分布式锁