欢迎来到窥视未来的博客

Fork me on GitHub

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

 

posted on   窥视未来  阅读(370)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示