zookeeper zookeeper原理

你。 提交于 2020-01-28 01:50:15

zookeeper原理

角色划分

客户端(client)
服务端(server):领导者(leader,可读可写可监听)+追随者(follower,可读可监听)+观察者(observer,不参与选举投票和提议投票,可读可监听)
zookeeper server状态

  • LOOKING:正在选举leader
  • LEADING:当前节点就是leader
  • FOLLOWING:当前节点是follower
  • OBSERVING:当前节点是observer

leader发送给follower消息类型

  • PING:心跳消息
  • PROPOSAL:发起提议消息
  • COMMIT:提交提议消息

follower发送给leader消息类型

  • PING:心跳消息
  • REQUEST:请求消息(转发写请求)
  • ACK:确认提议消息
znode

znode大小限制:1MB
znode删除限制:如果znode有子节点,则无法删除它
znode类型

  • PERSISTENT:持久化目录节点
  • PERSISTENT_SEQUENTIAL:持久化顺序目录节点
  • EPHEMERAL:临时目录节点
  • EPHEMERAL_SEQUENTIAL:临时顺序目录节点

zab协议

zab协议包含恢复模式和广播模式。
集群启动、leader崩溃、leader重启或leader失去多数follower时进入恢复模式,恢复模式完成后进入广播模式。

恢复模式

恢复模式包含集群选举和数据同步两个过程。
集群选举时每个节点会将自己的sid和zxid发送给其他节点,并接收其他节点发送的sid和zxid。
规则:先比较zxid,大的胜出;zxid相同,再比较sid,大的胜出。
集群启动时
场景:server A(sid01,zxid00) B(sid02,zxid00) C(sid03,zxid00)

  1. server A启动完成,发现其他节点都未启动,只能等着
  2. server B启动完成,与server A开始选举
  3. server A投自己(sid01,zxid00),server B也投自己(sid02,zxid00)
  4. 由于zxid相同,server B sid大于server A sid,因此server A改投server B
  5. 此时server B支持数过半,成为leader,等待follower连接;server A成为follower
  6. server C启动完成,也投自己(sid03,zxid00)
  7. server C被告知已经有leader,因此拿leader信息,并与leader建立连接,server C成为follower
  8. follower连接后发送各自的zxid给leader
  9. leader选zxid最大的节点成为同步点开始同步状态
  10. leader同步状态后发送UPTODATE状态给所有follower
  11. follower开始同步状态
  12. 超过半数follower同步状态完成,进入广播模式

leader崩溃或重启时
leader崩溃或重启时选举情况基本同上,zxid越大当选几率越大;zxid相同,sid越大当选几率越大。
leader失去多数follower时
任何节点支持率都不会超过半数,因此集群停止对外提供服务,需要人工干预。

广播模式

client向leader发送读请求
leader直接返回结果给client
client向follower/observer发送读请求
follower/observer直接返回结果给client
client向leader发送写请求

  1. client发送请求给follower
  2. leader接收请求,发送PROPOSAL消息给所有follower
  3. follower接收PROPOSAL,发送ACK消息给leader
  4. leader接收ACK并计数,超过集群半数(不包含observer),视为通过
  5. leader执行写操作,写操作成功后发送COMMIT消息给follower
  6. follower接收COMMIT,执行写操作后返回结果给client

client向follower/observer发送写请求

  1. client发送请求给follower
  2. follower接收请求,发送REQUEST消息给leader(其实就多了这步)
  3. leader接收REQUEST,发送PROPOSAL消息给所有follower
  4. follower接收PROPOSAL,发送ACK消息给leader
  5. leader接收ACK并计数,超过集群半数(不包含observer),视为通过
  6. leader执行写操作,写操作成功后发送COMMIT消息给follower
  7. follower接收COMMIT,执行写操作后返回结果给client

Paxos协议 & zab协议

Paxos协议与zab协议相同点
集群中由一个leader负责协调工作
leader在执行写操作之前需要得到半数以上follower的认可
提议中包含一个唯一编号
Paxos协议与zab协议不同点
Paxos协议为状态机复制系统设计;zab协议为主备系统设计(zookeeper)
Paxos协议规定原leader宕机,新leader可以将未提交的请求处理顺序随意重排
zab协议规定原leader宕机,新leader必须按照原定的唯一编号顺序处理请求

事务

zookeeper client发送的请求分为事务请求(写请求)和非事务请求(读请求、watcher请求)
每个事务请求都由leader调度处理,所有提议都会加上唯一编号zxid作为事务ID,超过半数follower能够执行,leader才会执行。
zxid:高32位epoch,记录leader周期;低32位递增计数,记录事务ID。

watcher机制

watcher机制分为三个步骤

  1. 客户端注册watcher
  2. 服务端处理watcher
  3. 客户端回调watcher

watcher机制特性

  • 一次性:服务端watcher处理前会删除;客户端watcher回调后会删除
  • 服务端向客户端发送通知事件是异步的,客户端回调watcher过程是同步的
  • 轻量级:服务端只告诉客户端发生了什么事件
  • 在哪个节点注册watcher,就由哪个节点处理watcher

名词解释
ServerCnxn:实现了process接口,可以理解成一个watcher对象
WatchTable:键值对,key:数据节点路径,value:ServerCnxn对象
WatchedEvent:通知状态+事件类型+节点路径

客户端注册watcher
  1. 客户端发送请求:客户端调用getData()/getChildren()/exist()方法,传入watcher对象
  2. 服务端接收请求:服务端判断是否需要注册watcher,需要的话将节点路径和ServerCnxn,以键值对方式注册到ZKWatcherManager.WatchTable
  3. 服务端返回注册成功
服务端处理watcher
  1. 服务端执行写操作后
  2. 服务端封装WatchedEvent
  3. 根据节点路径去ZKWatcherManager.WatchTable查找
  4. 没有,不处理;有,取出并删除
  5. 调用ServerCnxn.process方法发送事件通知客户端
客户端回调watcher
  1. SendThread接收事件通知,交给EventThread线程回调watcher
  2. 触发后删除该watcher

watcher丢失的情况
客户端注册watcher
服务端接收到请求,注册watcher并返回成功
因网络抖动客户端没有收到成功
服务端监听znode发生变化,发送事件通知给客户端,此时客户端是收不到的
watcher丢失的情况二
客户端在server A注册watcher成功
因网络抖动客户端与server A断开连接
此时watcher的节点路径文件发生变化,客户端是收不到事件通知的
客户端与server B建立连接,并要重新注册watcher

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!