最近项目中采用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的比较。
分享到:
相关推荐
zookeeper的分布式全局锁纯代码解决方案,特点:易上手,可二次开发和封装。
zookeeper安装和选举说明
zookeeper做分布式锁
zookeeper选举机制图,内讲述了zookeeper是如何选举出leader、fllower的
C#基于zookeeper分布式锁的实现源码,参考网上代码,做过一些小调整,目前在项目使用中,运行良好。
基于zookeeper的分布式锁简单实现,包含测试代码,实用工具类
基于zookeeper的分布式锁实现demo,可以直接用在生产环境
#资源达人分享计划#
本文来自于技术世界,本文结合实例演示了使用Zookeeper实现分布式锁与领导选举的原理与具体实现方法。如上文《Zookeeper架构及FastLeaderElection机制》所述,Zookeeper提供了一个类似于Linux文件系统的树形结构。该...
4.1zookeeper 分布式锁简单练习
zookeeper 分布式锁的实现1
zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是集群的管理者。提供了文件系统和通知机制。...在开发项目的过程中,很多大型项目都是分布式部署的,那么我们现在使用zookeeper实现一个分布式锁。
C# 关于zookeeper主从选举的源码,有需要的同学修改一下可以用
zookeeper客户端。分布式锁。 demo。。
在分布式高并发的情况下,多个访问之间拥有唯一的一个订单编号,多次提交的订单不会出现重复的,只能是唯一的,ZooKeeper就很好的解决了唯一性
利用springboot集成zookeeper,并利用zookeeper实现分布式锁,避免羊群效应
基于zookeeper的不可重入锁Shared Lock 举例,可重入锁Shared Reentrant Lock 举例,可重入读写锁Shared Reentrant ReadWriteLock 举例
3、zookeeper的选举----经验证符合事实,网上很多都是错误的 网址:https://blog.csdn.net/chenwewi520feng/article/details/130287503 Leader 选举是保证分布式数据一致性的关键所在。 Leader 选举分为 Zookeeper ...
在程序开发过程中不得不考虑的就是并发问题。在java中对于同一个jvm而言,jdk已经提供了lock和同步等。但是在分布式情况下,往往存在多个进程对一些资源产生竞争...分布式锁顾明思议就是可以满足分布式情况下的并发锁。
改代码主要功能能是完成通过zookeeper同步mysql数据,具体的介绍可以参考博文zookeeperMaster选举以及数据同步