zoukankan      html  css  js  c++  java
  • ZooKeeper分布式锁浅谈(一)

    一.概述
      清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的弊端,所以才痛定思痛潜心研究Zookeeper;自己装了三台Centos虚拟机,搭建了ZooKeeper集群。
    二.ZooKeeper基本概念
    1.前言
      ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现。分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
    2.ZooKeeper角色
      在 ZooKeeper 中,有三种角色:
      Leader
      Follower
      Observer
      一个 ZooKeeper 集群同一时刻只会有一个 Leader,其他都是 Follower 或 Observer。当Leader奔溃后会从Follower重新选举一个出来,读者可以自行参考Zab协议。
    3.节点介绍
      1、PERSISTENT-持久化目录节点
      客户端与Zookeeper断开连接后,该节点依旧存在
      2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
      客户端与Zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
      3、EPHEMERAL-临时目录节点
      客户端与Zookeeper断开连接后,该节点被删除
      4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
      客户端与Zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
    三.Zookeeper分布式锁的实现
      Zookeeper实现分布式锁是通过节点和临时顺序节点来实现的:主要有一下步骤:
      1. 在构造函数里面启动的时候建立一个节点,假如命名为:lock。节点类型为持久节点(PERSISTENT)【ZooKeeper里面的znode节点会自动同步的,而且是强一致性,创建一个节点后只有ZooKeeper集群同步完成后算成功】
      2. 每当进程需要访问共享资源时,会在lock节点下面建立响应的顺序子节点,节点类型为临时顺序节点(EPHEMERAL_SEQUENTIAL)
      3. 在建立子节点之后,判断刚刚建立的子节点顺序号是否为最小节点,如果是最小节点,则可以获得该锁对资源进行访问。(临时子节点建立会自动生成一个序号的)
      4. 如果不是该节点,就获得该节点的上一顺序节点,并给该节点是否存在注册监听事件。同时在这里阻塞。等待监听事件的发生。获得控制权(实现watch接口,并且重写process方法,在process里面实现监听)
      5. 当完成之后,关闭ZooKeeper连接,进而可以应发监听事件,释放该锁(客户端关闭ZooKeeper连接之后会删除当前的临时节点)

    下一篇将贴上代码基于代码进行详细介绍。

  • 相关阅读:
    postman接口测试01_下载安装
    Jenkins持续集成_05_参数化构建
    IntelliJ 中设置与Eclipse中 Ctrl+1 功能类似的快捷键
    JAVA 内部类
    Adobe Air 现在可支持X86的移动设备
    开发一些自动编写代码的工具可以增加效率吗?
    制作 Flex 悬停提示帮助文档(转)
    没什么好说的
    JDK,Tomcat,Maven,Mysql环境变量配置
    神器三、Android端神器东皇钟:天界之门
  • 原文地址:https://www.cnblogs.com/cuiyiming/p/6938088.html
Copyright © 2011-2022 走看看