ZooKeeper学习二

ZooKeeper的java客户端

zk自带zkclient及Apache开源的Curator

Chubby是google的,完全实现paxos算法,不开源,ZooKeeper是chubby的开源实现,使用zab协议,paxos算法的变种。

ZooKeeper常用命令: Is get set create delete

ZAB和Paxos算法的联系和区别

相同点:

1、两者都存在一个类似于Leader进程的角色,由其负责协调多个Follower的运行

2、Leader进程都会等待超过半数的Follower做出正确的反馈后,才会将一个提案进行提交

3、ZAB协议中,每个Proposal中包含一个epoch值来代表当前的Leader周期,Paxos中名字为Ballot

不同点:

ZAB用来构建高可用的分部署数据主备系统,Paxos是用来构建分布式一致性状态机系统

ZooKeeper应用场景

ZooKeeper是一个典型的发布、订阅模式的分布式数据管理与协调框架,开发人员可以使用它来进行分布式数据的发布和订阅

通过对ZooKeeper中丰富的数据节点进行交叉使用,配合Watcher事件通知机制,可以非常方便的构建一系列分布式应用中都会涉及的核心功能,如下:

1、数据发布、订阅

数据发布/订阅系统,即所谓的配置中心,顾名思义就是发布者发布数据供订阅者

进行数据订阅。

复制代码
目的:
动态获取数据(配置信息)
实现数据(配置信息)的集中式管理和数据的动态更新

设计模式:
push模式、pull模式

数据配置信息特性
1、数据量通常比较小
2、数据内容在运行时会发生动态更新
3、集群中各机器共享,配置一致

基于ZooKeeper的实现方式
数据存储:将数据配置信息存储到ZooKeeper上的一个数据节点
数据获取:应用在启动初始化节点从ZooKeeper数据节点读取数据,并在该节点上注册一个数据变更Watcher
数据变更:当变更数据时,更新ZooKeeper对应节点数据,ZooKeeper会将数据变更通知发到各客户端,客户端街道通知后重新读取变更后的数据即可	

2、负载均衡

3、命名服务
Zk的命名服务
    命名服务是指通过指定的名字来获取资源或者服务的地址,利用zk创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务地址
    
4、分布式协调、通知
对于系统调度来说:操作人员发送通知实际是通过控制台改变某个节点的状态,
然后 zk 将这些变化发送给注册了这个节点的 watcher 的所有客户端。
对于执行情况汇报:每个工作进程都在某个目录下创建一个临时节点。并携带工
作的进度数据,这样汇总的进程可以监控目录子节点的变化获得工作进度的实时
的全局情况。

5、集群管理
所谓集群管理无在乎两点:是否有机器退出和加入、选举 master。
对于第一点,所有机器约定在父目录下创建临时目录节点,然后监听父目录节点
的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper 的连接断开,其所创
建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于
是,所有人都知道:它上船了。
新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount 又有了,
对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选
取编号最小的机器作为 master 就好。

6、Master选举
7、分布式锁
有了 zookeeper 的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,
一个是保持独占,另一个是控制时序。
对于第一类,我们将 zookeeper 上的一个 znode 看作是一把锁,通过 createznode
的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那
个客户端也即拥有了这把锁。用完删除掉自己创建的 distribute_lock 节点就释放
出锁。
对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺
序编号目录节点,和选 master 一样,编号最小的获得锁,用完删除,依次方便。

8、分布式队列
	两种类型的队列:
1、同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有
成员到达。
2、队列按照 FIFO 方式进行入队和出队操作。
第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按
编号。在特定的目录下创建 PERSISTENT_SEQUENTIAL 节点,创建成功时
Watcher 通知等待的队列,队列删除序列号最小的节点用以消费。此场景下
Zookeeper 的 znode 用于消息存储,znode 存储的数据就是消息队列中的消息内
容,SEQUENTIAL 序列号就是消息的编号,按序取出即可。由于创建的节点是持
久化的,所以不必担心队列消息的丢失问题。
相关推荐
小智老师PMP5 分钟前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN9 分钟前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
会周易的程序员2 小时前
5Draft(五帝)测试报告
服务器·c++·分布式·raft·共识算法·共识·算力服务器
UIU1142 小时前
scanf与cout的误区:探究其内部的机制
c++·学习·c#·scanf
zyf1044167 小时前
暑期实践日志 Day48:复盘大纲与知识点对照表,系统汇总整理成果
学习·计算机网络·剪辑·暑期实践·课题任务
m4Rk_8 小时前
【论文阅读】Agent 记忆机制(61):CFGM——用粗到细的记忆落地贯通经验采集、知识蒸馏与在线纠错
论文阅读·人工智能·学习·开源·github
边境悍匪8 小时前
蜗牛学苑 Java 智能体学习 Day33|AOP 面向切面编程、日志技术思维导图复盘
学习
我是你的开心果7788 小时前
ai全栈软件开发day21(第四阶段喽)
人工智能·学习
想要打 Acm 的小周同学呀8 小时前
Kafka消息队列出现挤压如何解决?
分布式·kafka
网络工程小王9 小时前
【LLM开发实验】FastAPI 学习笔记
数据库·笔记·学习·mysql·fastapi