ZooKeeper 学习笔记
2024-08-06 18:59:19 2 举报
AI智能生成
ZooKeeper 是一个开源的分布式应用程序协调服务,它提供了一种高度可靠的数据存储、管理、控制和监控服务。学习笔记主要涵盖了ZooKeeper的核心概念、安装和配置、Java编程API的使用、数据模型和操作、watcher机制和分布式锁实现等内容。它适合于需要了解ZooKeeper底层实现和实际应用的开发者。
作者其他创作
大纲/内容
概述
分布式数据一致性的解决方案
使用ZAB一致性协议解决分布式数据一致性
ZAB协议
恢复模式(选主)
广播模式(同步)
特性
1.最终一致性:client不论连接到哪个server,展示给它都是同一个视图,这是ZK最重要的性能
2.可靠性:具有简单、健壮、良好的性能,如果消息m被一台服务器接受,那么它将被所有的服务器接受
3.实时性:ZK保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,ZK不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口
4.等待无关:慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待
5.原子性:更新只能成功或者失败,没有中间状态
6.顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面
设计目标
简单的数据模型
以ZNode为单位的树形结构
可以构建集群
顺序访问
对客户端的请求分配一个全局唯一的递增编号
高性能
全量数据存储在内存
基本概念
集群角色
Leader(领导者):为客户端提供读和写服务
事务请求的唯一调试和处理者,保证集群事务处理的顺序性
集群内部各服务器的调试者
Follower(跟随者):提供读服务,参与Leader选举
处理客户端非事务请求,转发事务请求给Leader服务器
参与事务请求Proposal的投票
参与Leader选举投票
Observer(观察者):提供读服务,不参与Leader选举
处理客户端非事务请求,转发事务请求给Leader服务器
通常用在不影响集群事务处理能力的前提下提升集群的非事务处理能力
注意点
只允许唯一的一个Leader服务器来处理事务请求,其他的节点(Follower)接收到写请求后会转发给Leader处理
在选举过程中,超过一半Follower投票完成选举(毫秒级)
集群中除非有一半以上的zk节点挂了,zk service才不可用
会话(Session)
TCP长连接
状态
connecting
connected
reconnecting
reconnected
close
数据节点(ZNode)
以斜杠(/)分割路径
分类
临时节点:与客户端会话绑定,会话失效(非TCP连接断开),节点自动被移除(是叶子节点)
临时顺序节点:自动在节点名后面追加一个整形数字,由父节点维护处增
持久节点:创建后一直存在于ZooKeeper服务器上,直到有删除操作主动清除
持久顺序节点:自动在节点名后面追加一个整形数字,由父节点维护处增
使用Jute作为序列化组件
版本(version):保证分布式数据原子性操作
Stat
version:当前ZNode版本
cversion:当前ZNode子节点版本
aversion:当前Znode的ACL版本
用来实现乐观锁机制中的”写入校验“
Watcher(事件监听器)
允许用户在节点上注册Watcher
事件触发时,ZooKeeper服务器端主动将事件通知到客户端
是实现分布式协调服务的重要特性
只通知客户端节点的节点的事件变化,没有相应的数据推送,需要客户端自己读取
客户端需要反复注册Watcher:服务器推送一次,该Watcher就会失效
客户端并不能获取每一次服务器端的推送
ACL(权限控制)
权限模式:Scheme
IP:通过IP地址粒度控制
Digest:通过”username:password“形式配置
World:开放式权限控制,几乎没有控制作用
Super:一种特殊的Disgest,可以操作任意节点
授权对象:ID
权限:Permission
create:创建子节点的权限
read:获取节点数据和子节点列表的权限
write:更新节点数据的权限
delete:删除子节点的权限
admin:设置节点ACL的权限
官方客户端API
创建会话:new ZooKeeper(...)
创建会话是一个异步过程
也就是new ZooKeeper()之后还没有建立真正会话,此时会话处于"connecting"状态
创建节点:ZooKeeper.create(...)
不支持递归创建
创建一个已经存在的节点发抛出异常
节点内容只支持字节数组
删除节点:ZooKeeper.delete(...)
只能删除叶子节点
不能删除包含子节点的节点
读取数据
getChildren:获取所有子节点
getData:获取节点数据
更新数据:ZooKeeper.setData(...)
检查节点是否存在:ZooKeeper.exists(...)
权限控制:ZooKeeper.addAuthInfo(...)
ZkClient客户端API
优点
创建的会话是同步的
自带对对象序列化的支持(API方法可以直接操作对象)
引入Listener来实现对节点的监听,更符合开发习惯
创建会话:new ZkClient(...)
创建节点
create
createEphemeral
createEphemeralSequential
createPersistent
createPersistentSequential
特性:支持递归创建节点
删除节点
delete
deleteRecursive:删除带有子节点的节点
读取数据
getChildren
readData
更新数据
writeData
检测节点是否存在
exists
应用场景
数据发布/订阅
配置中心:基于客户端注册节点的Watcher事件
负载均衡
命名服务
分布式协调/通知
集群管理
集群中的机器数
集群中每台机器的运行状态数据采集
对集群中的机器进行上下线操作
Master选举
基于ZooKeeper不能重复创建已经存在节点的机制
分布式锁
基于ZooKeeper不能重复创建已经存在节点的机制
排他锁
概念
实现
获取锁
1.所有客户端同时create一个临时节点:/app/lock
2.创建成功的客户端获取到锁
3.创建失败的客户端没有获取到锁,在/app/lock节点上注册Watcher事件
释放锁
1.释放方法
获取锁的客户端异常,lock节点自动被删除
执行完正常业务,客户端主动删除lock节点
2.通知所有注册了lock节点事件变更的客户端,进入重新获取锁动作
共享锁
概念
实现
获取锁
1.所有客户端都到/app/lock下创建临时顺序节点
2.读请求创建IP-R-00001
3.写请求创建IP-W-00001
判断读写顺序
羊群效应问题
改进
流程
释放锁
1.释放方法
获取锁的客户端异常,lock节点自动被删除
执行完正常业务,客户端主动删除lock节点
2.通知所有注册了lock节点事件变更的客户端,进入重新获取锁动作
分布式自增长主键
基于持久顺序节点机制实现
分布式队列
0 条评论
下一页