`
kavy
  • 浏览: 888486 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ZooKeeper分布式锁及改进

 
阅读更多
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nileader.blog.51cto.com/1381108/961809

 

转载请注明 @ni掌柜 nileader@gmail.com

   本文主要讲述在使用ZooKeeper进行分布式锁的实现过程中,如何有效的避免“羊群效应( herd effect)”的出现。

一般的分布式锁实现

   这里简单的讲下一般的分布式锁如何实现。具体的代码实现可以在这里看到: https://svn.apache.org/repos/asf/zookeeper/trunk/src/recipes/lock/

   在之前的《ZooKeepe数据模型》一文中提到过,zookeeper中节点的创建类型有4类,这里我们重点关注下临时顺序节点。这种类型的节点有几下几个特性:

1. 节点的生命周期和客户端会话绑定,即创建节点的客户端会话一旦失效,那么这个节点也会被清除。

2. 每个父节点都会负责维护其子节点创建的先后顺序,并且如果创建的是顺序节点(SEQUENTIAL)的话,父节点会自动为这个节点分配一个整形数值,以后缀的形式自动追加到节点名中,作为这个节点最终的节点名。

利用上面这两个特性,我们来看下获取实现分布式锁的基本逻辑:

1. 客户端调用create()方法创建名为“_locknode_/guid-lock-”的节点,需要注意的是,这里节点的创建类型需要设置为EPHEMERAL_SEQUENTIAL。

2. 客户端调用getChildren(“_locknode_”)方法来获取所有已经创建的子节点,同时在这个节点上注册上子节点变更通知的Watcher。

3. 客户端获取到所有子节点path之后,如果发现自己在步骤1中创建的节点是所有节点中序号最小的,那么就认为这个客户端获得了锁。

4. 如果在步骤3中发现自己并非是所有子节点中最小的,说明自己还没有获取到锁,就开始等待,直到下次子节点变更通知的时候,再进行子节点的获取,判断是否获取锁。

释放锁的过程相对比较简单,就是删除自己创建的那个子节点即可。

问题所在

   上面这个分布式锁的实现中,大体能够满足了一般的分布式集群竞争锁的需求。这里说的一般性场景是指集群规模不大,一般在10台机器以内。

   不过,细想上面的实现逻辑,我们很容易会发现一个问题,步骤4,“即获取所有的子点,判断自己创建的节点是否已经是序号最小的节点”,这个过程,在整个分布式锁的竞争过程中,大量重复运行,并且绝大多数的运行结果都是判断出自己并非是序号最小的节点,从而继续等待下一次通知——这个显然看起来不怎么科学。客户端无端的接受到过多的和自己不相关的事件通知,这如果在集群规模大的时候,会对Server造成很大的性能影响,并且如果一旦同一时间有多个节点的客户端断开连接,这个时候,服务器就会像其余客户端发送大量的事件通知——这就是所谓的羊群效应。而这个问题的根源在于,没有找准客户端真正的关注点。

   我们再来回顾一下上面的分布式锁竞争过程,它的核心逻辑在于:判断自己是否是所有节点中序号最小的。于是,很容易可以联想的到的是,每个节点的创建者只需要关注比自己序号小的那个节点。

改进后的分布式锁实现

   下面是改进后的分布式锁实现,和之前的实现方式唯一不同之处在于,这里设计成每个锁竞争者,只需要关注”_locknode_”节点下序号比自己小的那个节点是否存在即可。实现如下:

1. 客户端调用create()方法创建名为“_locknode_/guid-lock-”的节点,需要注意的是,这里节点的创建类型需要设置为EPHEMERAL_SEQUENTIAL。

2. 客户端调用getChildren(“_locknode_”)方法来获取所有已经创建的子节点,注意,这里不注册任何Watcher。 

3. 客户端获取到所有子节点path之后,如果发现自己在步骤1中创建的节点序号最小,那么就认为这个客户端获得了锁。

4. 如果在步骤3中发现自己并非所有子节点中最小的,说明自己还没有获取到锁。此时客户端需要找到比自己小的那个节点,然后对其调用exist()方法,同时注册事件监听。

5. 之后当这个被关注的节点被移除了,客户端会收到相应的通知。这个时候客户端需要再次调用getChildren(“_locknode_”)方法来获取所有已经创建的子节点,确保自己确实是最小的节点了,然后进入步骤3。 

结论

上次两个分布锁实现,都是可行的。具体选择哪个,取决于你的集群规模。

 

本文出自 “ni掌柜的笔记” 博客,请务必保留此出处http://nileader.blog.51cto.com/1381108/961809

分享到:
评论

相关推荐

    redis和zookeeper实现分布式锁的区别

    **Zookeeper分布式锁** Zookeeper是一个高可用的分布式协调服务,它维护了一致的命名空间和分布式事件通知。Zookeeper中的分布式锁通常通过创建临时节点(ephemeral nodes)来实现。当客户端创建一个临时节点并持有...

    从Paxos到Zookeeper分布式一致性原理与实践(高清完整版 带标签)

    《从Paxos到Zookeeper分布式一致性原理与实践》是一本深入探讨分布式系统一致性问题的著作,涵盖了Paxos协议和Zookeeper两个重要的主题。在分布式计算领域,一致性是保证系统可靠性和正确性的核心概念,它涉及到多个...

    Zookeeper_DistributeLock_Demo.zip

    改进版的Zookeeper分布式锁通常会解决基础版本中的一些问题,例如死锁、竞争状态的处理等。可能的改进包括: 1. **防止死锁**:在基础版本中,如果客户端在获取锁后意外崩溃,可能导致死锁。改进版可以通过设置超时...

    ZooKeeper分布式系统协调 v3.6.3.gz

    **ZooKeeper分布式系统协调详解** ZooKeeper是一款开源的分布式协调服务,它是由雅虎创建并贡献给Apache Software Foundation的项目。在分布式系统中,ZooKeeper扮演着至关重要的角色,它提供了一种可靠的方式来...

    ZooKeeper分布式系统协调 v3.8.0.gz

    12. **案例研究**:通过分析和使用ZooKeeper v3.8.0,可以了解如何在实际项目中应用这些理论知识,如如何设置和管理分布式锁,如何实现服务注册与发现等。 13. **社区支持**:Apache ZooKeeper有一个活跃的社区,...

    Redids和Zookepeer分布式锁实现源代码

    **ZooKeeper分布式锁** ZooKeeper是一个高可用的分布式协调服务,它提供了一致的命名服务、配置管理、分布式同步等功能。在ZooKeeper中,分布式锁通常通过创建临时节点和监视器来实现。 1. **创建临时节点**: 每个...

    分布式锁通用解决方案.docx

    #### 四、基于Zookeeper的分布式锁实现 **1. 实现原理** - Zookeeper是一个高度可用的协调服务,提供了强大的一致性服务功能。 - 在Zookeeper上为每个需要加锁的方法创建一个目录节点,客户端获取锁时在该目录下...

    从Paxos到Zookeeper:分布式一致性原理与实践

    4. Zookeeper的应用场景:讨论如何在实际项目中利用Zookeeper实现服务注册与发现、分布式锁、分布式队列、配置中心等功能,并分析其在Hadoop、HBase等大数据组件中的角色。 5. 高可用与容错性:探讨Zookeeper的集群...

    zookeeper3.5.1.rar

    七、Zookeeper分布式锁 Zookeeper还提供了分布式锁实现,通过创建临时节点和监听机制,可以解决分布式环境中的并发控制问题,如读写锁、公平锁等。 总结,Zookeeper 3.5.1在Linux环境中的应用,不仅简化了分布式...

    (源码)基于gRPC和Zookeeper的GirafKV分布式键值存储系统.zip

    它采用中心管理主从架构,通过Zookeeper进行服务注册、发现、心跳监测、主从选举和分布式锁服务。GirafKV支持数据分区和可扩展性,具备数据恢复和迁移能力,并实现了基于改进型一致性哈希的Partition和启发自原子...

    zookeeper3.36

    2. 分布式锁:Zookeeper的原子操作使得它可以实现分布式锁,避免并发问题。 3. 服务注册与发现:例如Spring Cloud、Dubbo等微服务框架,利用Zookeeper实现服务的注册和发现。 4. 领导者选举:如Kafka、HBase等分布式...

    apache-zookeeper-3.7.0

    - ZooKeeper 支持创建临时和顺序节点,这使得它可以实现分布式锁。临时节点在客户端断开连接时自动删除,而顺序节点则可以用于实现公平的锁策略。 5. **集群管理**: - ZooKeeper 可以作为集群的元数据中心,存储...

    zookeeper.rar

    5. **分布式锁**:Zookeeper可以实现分布式锁,包括读锁和写锁。这在多线程或分布式环境下的并发控制中非常有用,保证了操作的顺序性和互斥性。 6. **分桶路由**:通过Zookeeper,分布式应用可以实现负载均衡和分桶...

    zookeeper-3.4.14.rar

    ZooKeeper,一个在分布式系统中广泛使用的开源组件,是Apache Hadoop项目的一部分,主要用于实现分布式环境中的命名服务、配置管理、集群同步以及分布式锁等功能。本文将深入探讨ZooKeeper 3.4.14版本的关键特性和...

    zookeeper3.4.8

    2. 分布式锁:通过创建临时节点,Zookeeper可以实现分布式锁,确保在分布式环境中资源的互斥访问。 3. 集群管理:Zookeeper可以作为集群的注册中心,记录各个节点的状态,帮助节点间进行发现和服务定位。 4. 名称...

    zookeeper3.4.13

    Zookeeper的主要功能包括命名服务、配置管理、集群同步、分布式锁等。 2. **Zookeeper架构** Zookeeper由服务器(Server)和客户端(Client)两部分组成。服务器之间通过Zab协议实现数据同步,确保全局一致性。...

    apache-zookeeper-3.5.6-bin.tar

    1. 分布式锁:通过创建临时节点来实现锁服务,确保同一时刻只有一个客户端能获取到锁。 2. 配置管理:集中存储和管理分布式系统的配置信息,便于动态更新。 3. 名称服务:为分布式系统中的组件分配唯一的标识。 4. ...

    zookeeper-3.4.10.tar.gz

    3. 分布式锁:通过创建和删除临时顺序节点,ZooKeeper 可以实现分布式锁,保证了分布式环境中的并发控制。 4. 集群管理:ZooKeeper 可用于集群的监控和管理,如检测节点的加入、退出、故障等状态。 5. 分布式同步...

    zookeeper3.4.5.rar

    3. 分布式锁:通过创建临时节点,实现跨进程的锁服务,避免并发问题。 4. 名称服务:为分布式组件提供唯一的全局ID。 5. 分区和路由:在分布式系统中,Zookeeper可以用来管理分区和路由信息。 六、Zookeeper 3.4.5...

    zookeeper-3.4.10 linux版本

    ZooKeeper基于Chubby(Google的分布式锁服务)的概念,但设计为更轻量级且易于部署。 Zookeeper-3.4.10是该软件的一个稳定版本,包含了前几个版本的改进和修复。在这个版本中,开发者可能已经解决了之前版本中的...

Global site tag (gtag.js) - Google Analytics