核心:
文件系统(目录树)/通知机制(观察者模式)
集群
SID
服务器标识和myId一致
ZXID
事务ID,用来标识一次服务器状态的变更
EPOCH
每个leader任期内的代号
写入数据
- leader收到请求
- leader自己写入
- leader向follower中写入,follower写完后发送ack
- 超过半数的节点写完成后就leader就向client响应,然后接着写入其他follower
- follower收到请求
- 向leader转发write请求
- 同leader①②
- 超过半数节点写入完成后leader就向转发请求的follower发送ack,然后由该节点响应client,然后leader接着写入剩余节点
分布式锁
利用临时顺序节点的特性
- 需要获取锁的client会在zk中创建一个临时顺序节点
- 判断当前节点序号是否是当前最小的序号
- 是最小序号则获得锁,否则利用 【get -w】命令监听上前一个节点的变化直到当前节点的序号成为最小则获得锁
- client 在执行完相关逻辑后主动删除创建的节点(发生异常时也会删除因为创建的的是临时节点),此时zk会通知后一个节点获取到锁(击鼓传花)
选举机制
第一次启动时
- 启动前需要为每个节点但指定myid且不重复
- 节点启动时会先投自己一票,然后和其他节点交换选票,当节点收到其他节点的选票且当前节点的myId更大则票数增加,否则票数不变
- 当节点收到的选票大于半数节点是就被选为leader节点
- leader节点一旦确定就不会改变(启动时),后续节点在启动时会直接成为follower
leader挂掉时
- EPOCH大的直接胜出(避免此前失联的节点被选举)
- EPOCH相同,ZXID大的胜出(保证当前被选举的节点中数据是最新的)
- ZXID相同,SID大的胜出
节点类型
持久节点(断开连接后节点不删除)
- 持久化目录节点
客户端断开连接后节点依然存在
- 持久化顺序编号目录节点
创建节点后给节点名称后顺序编号(单调递增由父节点维护), 分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序。
临时节点(断开连接后创建的节点自己删除)
- 临时目录节点
断开时节点自动删除
- 临时顺序编号目录节点
节点名称后会进行顺序编号
监听器
监听对应路径上节点数据的变化、节点数量的变化
网友评论