保证线程安全
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位代表递增是不编号