保证线程安全

zookeeper分布式架构 zookeeper如何实现分布式锁_java

 

 

 

 

ZooKeeper初始化示意图

zookeeper分布式架构 zookeeper如何实现分布式锁_zookeeper分布式架构_02

 

 

 

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

zookeeper分布式架构 zookeeper如何实现分布式锁_java并发编程_03

 

 

 

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位代表递增是不编号

zookeeper分布式架构 zookeeper如何实现分布式锁_java_04