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连接之后会删除当前的临时节点)

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

  • 相关阅读:
    PAT (Advanced Level) Practice 1054 The Dominant Color (20 分)
    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) (排序)
    hdu 5114 Collision
    hdu4365 Palindrome graph
    单链表查找最大值、两个递增的链表合并并且去重
    蓝桥杯-最短路 (SPFA算法学习)
    蓝桥杯-最大最小公倍数
    Codeforces-470 div2 C题
    蓝桥杯-地宫取宝
  • 原文地址:https://www.cnblogs.com/cuiyiming/p/6938088.html
Copyright © 2011-2022 走看看