zoukankan      html  css  js  c++  java
  • zookeeper 分布式锁的实现及原理

    保证线程安全

    ZooKeeper初始化示意图

    InterProcessMutex

     1 public static void main(String[] args) {
     2         CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
     3                 // 客户端连接任意zk 节点都行,也可以指定集群
     4                 .connectString(CommonConstants.CONNECT_URL)
     5                 .sessionTimeoutMs(5000)
     6                 // 重试策略
     7                 .retryPolicy(new ExponentialBackoffRetry(1000, 3))
     8                 .connectionTimeoutMs(4000).build();
     9         // 表示启动
    10         curatorFramework.start();
    11         /**
    12          * locks表示命名空间
    13          *
    14          * 锁的获取逻辑是放在zookeeper上
    15          * 当前锁是跨进程可见
    16          */
    17         InterProcessMutex lock = new InterProcessMutex(curatorFramework, "/locks");
    18         for (int i = 0; i < 10; i++) {
    19             new Thread(()->{
    20                 System.out.println(Thread.currentThread().getName() + "->" + "尝试抢占锁");
    21                 try {
    22                     // 抢占锁,没有抢占到,则阻塞
    23                     lock.acquire();
    24                     System.out.println(Thread.currentThread().getName() + "->" + "获取锁成功");
    25                 } catch (Exception e) {
    26                     e.printStackTrace();
    27                 }
    28                 // 释放锁
    29                 try {
    30                     Thread.sleep(4000);
    31                     lock.release();
    32                     System.out.println(Thread.currentThread().getName() + "->" + "释放锁成功");
    33                 } catch (Exception e) {
    34                     e.printStackTrace();
    35                 }
    36             },"t-"+i).start();
    37         }
    38 
    39     }

    zookeeper leader 选举

    kafka -> master/slave | kafka+zookeeper

    Leader latch

      利用临时有序节点

    Leader selector

    利用 -> curator.recepis 中锁的实现

    • dubbo + zookeeper 注册中心,注册服务

    • dubbo + zookeeper 配置中心,元数据管理

    • 实现分布式锁(Curator)

    • leader 选举(定时任务的互斥执行)

      • leader latch

      • leader selector(释放leader权限知乎,仍然可以继续参与选举)

    zookeeper实际应用以及原理分析

      Zookeeper的基本原理

    数据模型

    • 弱一致性模型

    • 2 PC协议(原子性)

    • 过半提交

    ZABZAB(zookeeper atomic Broadcast)

     

    • leader选举

    • 数据同步

    • 崩溃恢复 (looking)

    • 原子广播

    •  

    消息广播

    • Zxid(64)

    • observer(不参与投票和ack,只和leader保持数据 同步)

    崩溃恢复

    • 选举出新leader(选举谁作为leader)

    • 数据同步

    Zxid(*)

    • 已经被处理的消息不能丢失

    • 被丢弃的消息不能再次出现

    如何实现?(leader)

     

    • zxid最大(和leader选举有关系?)

    • Epoch ->term(raft).zxid()

    Zxid(事务id)

    • 64位

    • 高32位是epoch、低32位代表递增是不编号

  • 相关阅读:
    Ural 2040 Palindromes and Super Abilities 2
    BZOJ3676: [Apio2014]回文串
    HDU3068 最长回文
    [USACO06DEC] Milk Patterns
    hdu 6200 mustedge mustedge mustedge(dfs序+树状数组+并查集)
    hdu 4511 小明系列故事——女友的考验(AC自动机+dp)
    hdu 5129 Yong Zheng's Death(AC自动机fail树的应用)
    poj 1991 Turning in Homework(贪心+区间dp)
    hdu 4776 Ants(trie+优先队列)
    hdu 4775 Infinite Go(并查集模拟)
  • 原文地址:https://www.cnblogs.com/lwx57280/p/13791511.html
Copyright © 2011-2022 走看看