`
carver
  • 浏览: 50479 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ZooKeeper全局锁WriteLock选举的BUG

    博客分类:
  • Java
 
阅读更多

最近项目中采用ZK去选择分布式集群的Master/Slave,生产环境运行一段时间中,经常出现同时存在多个Master的问题,然后去阅读了一下ZK扩展包的源码,发现两个BUG:

 

BUG:多机器同时获取WriteLock全局锁时有可能会有多个机器成为Leader。

原因分析:WriteLock创建临时自增节点是采用x-session_id-sequece_no的方式,在选举Leader时,通过TreeSet对节点进行排序,最小的节点就会被选为Leader,其它的会被选为Follower。由于ZNodeName的compareTo方法的实现问题,WriteLock获取的锁时并不是按sequence_no最小的来选择,而是先根据session_id的字符串进行比较,再比较sequence_no,如果WriteLock后创建的节点的session_id比前面的小(可能性比较大),这种比较方式就有可能导致产生多个Leader。如:

机器1创建了:x-231622919316419832-0000000183

机器2创建了:x-231622919316419833-0000000184

机器3创建了:x-87556941509467773-0000000185

机器4创建了:x-159565318739768636-0000000186

由于机器1最先启动,只有一个节点生成,所以理所当然成为Leader,但由于ZNodeName的compareTo方法的问题,机器4启动后发现session_id值比当前Leader的值要小,所以机器4也被认为是Leader,这样就同时存在了两个Leader。

另外,不仅在机器启动和重启的时候发生,ZK会话超时重连,而会出现此情况。

如何改造:

去除ZNodeName的compareTo方法对session_id的比较,仅保留对sequece_no的比较。

 

0
0
分享到:
评论
4 楼 comedsh 2016-11-15  
这个问题其实是需要在你的代码(选主的代码)中去控制的;任何时候,选主只能出现一个,如果当选主成功之后,后续有符合标准的节点,必须等待“主节点”(之前选主成功的节点)退出,挂掉,或者主动退出以后,才能成为下一个主节点。所以,这个本身不是 WriteLock 的问题。另外 WriteLock 之所以使用 session_id 作为 lock 的名称,是有非常重要的考虑的,是为了实现在分布式环境下的“幂等性”~,所以建议不要轻易去改变它的内部实现逻辑。
3 楼 weiboxie 2014-04-17  
session_id 应该是一直增加的,所以后启动的机器4 的session_id 不可能小于之前leader 的 session_id
2 楼 carver 2012-06-28  
这个不是ZK正式发行包里面的,是扩展包,官方没有修复,我自己改了一下代码。
1 楼 roki 2012-06-28  
哪个版本上的bug啊? 新版修复了吗?

相关推荐

    zookeeper的分布式全局锁纯代码解决方案

    在这个"zookeeper的分布式全局锁纯代码解决方案"中,我们将探讨如何利用Zookeeper来构建一套易于理解和扩展的分布式锁。 首先,Zookeeper的特性使其成为实现分布式锁的理想选择。Zookeeper提供了原子性的读写操作、...

    zookeeper安装和选举说明

    接下来,我们谈谈Zookeeper的选举机制: Zookeeper使用一种叫做Zab(Zookeeper Atomic Broadcast)的协议来实现分布式一致性。在Zookeeper集群中,当一个新的节点加入或某个节点失效时,需要进行领导者选举以确定新...

    使用ZooKeeper实现分布式锁

    这里,我们将深入探讨如何利用ZooKeeper这一强大的分布式协调服务来实现分布式锁,以解决订单编号的唯一性问题。 ZooKeeper是由Apache Hadoop项目孵化的开源项目,它提供了一个高可用、高性能的分布式协调服务。其...

    基于zookeeper的分布式锁简单实现

    Zookeeper由Apache基金会开发,它提供了一种可靠的分布式一致性服务,包括命名服务、配置管理、集群同步、领导者选举等功能。Zookeeper基于ZAB协议(Zookeeper Atomic Broadcast),保证了数据的强一致性和最终一致...

    基于zookeeper的分布式锁实现demo

    1. **顺序一致性:** Zookeeper中的节点被创建顺序是全局唯一的,这有助于实现锁的唯一性。 2. **原子性:** 创建和删除节点的操作在Zookeeper中都是原子性的,这保证了分布式锁操作的原子性。 3. **排他性:** 一个...

    C# 关于zookeeper主从选举的源码

    - ZooKeeper提供了一种树型的数据结构,它支持数据的发布/订阅、配置管理、命名服务、分布式锁和组服务等多种功能。 2. **主从选举**: - 在Zookeeper中,每个节点(称为Server)都可以成为领导者或跟随者。选举...

    zookeeper做分布式锁

    分布式锁是解决多节点系统中同步问题的一种常见技术,ZooKeeper,由Apache基金会开发的分布式协调服务,常被用于实现高效可靠的分布式锁。本文将深入探讨如何利用ZooKeeper来构建分布式锁,并讨论其背后的关键概念和...

    zookeeper-3.4.6_zookeeper_

    5. **命名服务**:Zookeeper可以作为分布式环境中的全局命名服务,通过路径来标识和查找服务。 6. **配置管理**:在分布式系统中,配置的更新和同步是常见的需求。Zookeeper可以作为集中式的配置中心,确保所有节点...

    zookeeper-3.4.6中zkfuse的bug修复

    在分布式系统领域,Zookeeper作为一款强大的协调服务,广泛应用于配置管理、命名服务、分布式锁等场景。其中,ZkFuse是Zookeeper的一个重要组件,它允许用户通过文件系统接口与Zookeeper进行交互。然而,在Zookeeper...

    zookeeper选举机制图

    zookeeper选举机制图,内讲述了zookeeper是如何选举出leader、fllower的

    C#基于zookeeper分布式锁的实现源码

    在C#开发环境中,我们可以借助外部协调服务,如Apache ZooKeeper,来实现分布式锁。ZooKeeper是一个高可用的分布式协调服务,它提供了诸如命名服务、配置管理、分布式同步、组服务等功能。本篇将深入探讨如何在C#中...

    面试官:说一说Zookeeper中Leader选举机制.doc

    Zookeeper 中 Leader 选举机制 在分布式系统中,Leader 选举机制是非常重要的一环,Zookeeper 作为一个广泛应用于分布式系统的协调服务,自然也有自己的 Leader 选举机制。下面,我们将通过一个有趣的面试对话来...

    zookeeperMaster选举以及数据同步代码

    在分布式系统中,Zookeeper是一个至关重要的组件,它主要用于实现分布式服务管理,提供诸如配置管理、命名服务、集群同步、 leader选举等核心功能。在这个"zookeeperMaster选举以及数据同步代码"项目中,我们将深入...

    Zookeeper分布式锁的4种异常状态分析.pdf

    #资源达人分享计划#

    zookeeper分布式锁实现和客户端简单实现

    Zookeeper默认提供的是非公平锁,但可以通过设计实现公平锁。 **Zookeeper客户端实现分布式锁** 1. **连接Zookeeper**: 客户端首先需要与Zookeeper服务器建立连接,获取会话。 2. **创建临时顺序节点**: 在指定的...

    深入浅出Zookeeper(二)基于Zookeeper的分布式锁与领导选举

    本文来自于技术世界,本文结合实例演示了使用Zookeeper实现分布式锁与领导选举的原理与具体实现方法。如上文《Zookeeper架构及FastLeaderElection机制》所述,Zookeeper提供了一个类似于Linux文件系统的树形结构。该...

    zookeeper分布式锁实例源码

    在这个场景下,我们将关注ZooKeeper如何实现分布式锁,特别是不可重入锁、可重入锁以及可重入读写锁的概念与实践。 首先,我们要理解什么是分布式锁。在多节点并发访问共享资源时,分布式锁能确保同一时刻只有一个...

    03-05-07-zookeeper原理之Leader选举源码分析1

    Zookeeper 的这种一致性模型在实践中是非常实用的,因为它允许在可用性和一致性之间做出权衡,同时保持了基本的顺序一致性保证,这对于分布式锁和其他需要全局顺序的服务来说已经足够。在 Zookeeper 的官方文档中,...

    4.1zookeeper 分布式锁简单练习

    4.1zookeeper 分布式锁简单练习

    基于zookeeper实现的分布式读写锁

    本文将深入探讨基于Zookeeper实现的分布式读写锁,并利用Zkclient客户端进行操作。Zookeeper是一个分布式服务协调框架,它提供了一种简单且高效的方式来实现分布式锁。 **一、Zookeeper简介** Zookeeper是由Apache...

Global site tag (gtag.js) - Google Analytics