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(领导者):为客户端提供读和写服务
处理客户端非事务请求,转发事务请求给Leader服务器
参与事务请求Proposal的投票
参与Leader选举投票
Follower(跟随者):提供读服务,参与Leader选举
通常用在不影响集群事务处理能力的前提下提升集群的非事务处理能力
Observer(观察者):提供读服务,不参与Leader选举
只允许唯一的一个Leader服务器来处理事务请求,其他的节点(Follower)接收到写请求后会转发给Leader处理
在选举过程中,超过一半Follower投票完成选举(毫秒级)
集群中除非有一半以上的zk节点挂了,zk service才不可用
注意点
集群角色
TCP长连接
connecting
connected
reconnecting
reconnected
close
状态
会话(Session)
以斜杠(/)分割路径
临时节点:与客户端会话绑定,会话失效(非TCP连接断开),节点自动被移除(是叶子节点)
临时顺序节点:自动在节点名后面追加一个整形数字,由父节点维护处增
持久节点:创建后一直存在于ZooKeeper服务器上,直到有删除操作主动清除
持久顺序节点:自动在节点名后面追加一个整形数字,由父节点维护处增
分类
使用Jute作为序列化组件
数据节点(ZNode)
version:当前ZNode版本
cversion:当前ZNode子节点版本
aversion:当前Znode的ACL版本
Stat
用来实现乐观锁机制中的”写入校验“
版本(version):保证分布式数据原子性操作
允许用户在节点上注册Watcher
事件触发时,ZooKeeper服务器端主动将事件通知到客户端
是实现分布式协调服务的重要特性
只通知客户端节点的节点的事件变化,没有相应的数据推送,需要客户端自己读取
客户端需要反复注册Watcher:服务器推送一次,该Watcher就会失效
客户端并不能获取每一次服务器端的推送
Watcher(事件监听器)
IP:通过IP地址粒度控制
Digest:通过”username:password“形式配置
World:开放式权限控制,几乎没有控制作用
Super:一种特殊的Disgest,可以操作任意节点
权限模式:Scheme
授权对象:ID
create:创建子节点的权限
read:获取节点数据和子节点列表的权限
write:更新节点数据的权限
delete:删除子节点的权限
admin:设置节点ACL的权限
权限:Permission
ACL(权限控制)
基本概念
创建会话是一个异步过程
也就是new ZooKeeper()之后还没有建立真正会话,此时会话处于\"connecting\"状态
创建会话:new ZooKeeper(...)
不支持递归创建
创建一个已经存在的节点发抛出异常
节点内容只支持字节数组
创建节点:ZooKeeper.create(...)
只能删除叶子节点
不能删除包含子节点的节点
删除节点:ZooKeeper.delete(...)
getChildren:获取所有子节点
getData:获取节点数据
读取数据
更新数据:ZooKeeper.setData(...)
检查节点是否存在:ZooKeeper.exists(...)
权限控制:ZooKeeper.addAuthInfo(...)
官方客户端API
创建的会话是同步的
自带对对象序列化的支持(API方法可以直接操作对象)
引入Listener来实现对节点的监听,更符合开发习惯
优点
创建会话:new ZkClient(...)
create
createEphemeral
createEphemeralSequential
createPersistent
createPersistentSequential
特性:支持递归创建节点
创建节点
delete
deleteRecursive:删除带有子节点的节点
删除节点
getChildren
readData
writeData
更新数据
exists
检测节点是否存在
ZkClient客户端API
配置中心:基于客户端注册节点的Watcher事件
数据发布/订阅
负载均衡
命名服务
分布式协调/通知
集群中的机器数
集群中每台机器的运行状态数据采集
对集群中的机器进行上下线操作
集群管理
基于ZooKeeper不能重复创建已经存在节点的机制
Master选举
概念
1.所有客户端同时create一个临时节点:/app/lock
2.创建成功的客户端获取到锁
3.创建失败的客户端没有获取到锁,在/app/lock节点上注册Watcher事件
获取锁
获取锁的客户端异常,lock节点自动被删除
执行完正常业务,客户端主动删除lock节点
1.释放方法
2.通知所有注册了lock节点事件变更的客户端,进入重新获取锁动作
释放锁
实现
排他锁
1.所有客户端都到/app/lock下创建临时顺序节点
2.读请求创建IP-R-00001
3.写请求创建IP-W-00001
改进
流程
羊群效应问题
判断读写顺序
共享锁
分布式锁
基于持久顺序节点机制实现
分布式自增长主键
分布式队列
应用场景
ZooKeeper 学习笔记
0 条评论
下一页