Zookeeper选举机制和Zookeeper实现分布式锁

Zookeeper

zookeeper文件目录

bin

conf

zoo.cfg配置文件

myzkData

myid身份标志

…等等

选举机制

出现以下情况会进入leader选举

  • 服务器初始化启动
  • 服务器运行期间无法和Leader保持连接

每个zookeeper服务器都具有的东西
在这里插入图片描述在这里插入图片描述

1)服务器初始化启动

选票都给myid最大的那个,选出了leader后,后面进来的zookeeper只能成为follower

2)服务器运行期间无法和Leader保持连接

当服务器运行期间无法与Leader保持连接后,无论是当前服务器出错了还是leader出错了,当前服务器都会认为是leader出错而发起选举。这个时候就会出现两种情况

  • 集群中本来就已经存在一个Leader

    机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和Leader机器建立连接,并进行状态同步即可。

  • 集群中确实不存在Leader

    选举Leader规则: ①EPOCH大的直接胜出 ②EPOCH相同,事务id大的胜出 ③事务id相同,服务器id大的胜出

大的直接胜出 ②EPOCH相同,事务id大的胜出 ③事务id相同,服务器id大的胜出

监听器原理

分为zk客户端和服务端

1、zk客户端main()线程

2、创建zkclient

  • listener
  • connect

3、zkclient用getChildren("/",true)获取监听

4、当zk集群中"/"发生节点变化时反应给zkclient->listener

5、zkclient调用watcher中process()做出反应

利用Zookeeper实现分布式锁

在这里插入图片描述

在zookeeper集群中创建locks节点
当上锁时:
{
   
	在locks创建带序号的非永久节点

	判断创建节点的序号{
   
        如果序号小于0,数据错误
        序号大于0,利用zookeeper watcher对节点删除进行监听,如果删除了节点且为当前序号前一位则继续
        序号等于0,立刻获取锁
    }			
}
释放锁:{
   
    删除对应创建的非永久节点
}
/**
 * 基于Zookeeper的分布式锁
 */
public class DistributedLock {
   

    private final ZooKeeper zooKeeper;
    private final CountDownLatch connect = new CountDownLatch(1);
    private final CountDownLatch wake = new CountDownLatch(1);
    private String preNode;
    private String currentNode;


    public DistributedLock() throws IOException, InterruptedException, KeeperException {
   
        //创建zookeeper客户端
        String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181"<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值