文章目录
目录
前言
一、定义
- 基于强一致性CP实现的分布式文件系统,用于统一的资源管理,可以提供命名服务、配置管理、集群管理和分布式锁,可以用作注册中心,通过watch机制可以实现对znode节点的监听
二、功能
- 命名服务
- 每一个注册到zookeeper服务器的客户端或者服务器都对应着一个znode节点,有着全局唯一的路径,这个路径就是唯一的名字
- 配置管理
- 将配置信息保存在zookeeper的znode节点里,每当配置信息发生改变znode节点也就发生改变,通过watch机制zookeeper服务器会感知到该znode节点的变化,然后通知客户端进行相应的处理
- 集群管理
- 通过watch机制,zookeeper服务器可以对注册到zookeeper上的所有znode节点进行监听,感知其上\下线,一旦有一个节点发送变化,zk会感知到并且通知其他的节点,实现节点的统一管理
- 分布式锁
- 不同进程里的共享资源无法通过sychroniziation或者reentrantLock解决,必须通过分布式锁来解决
- zk通过临时顺序节点和watcher机制实现该功能,每台服务器只有创建的是最小的节点时才可以拿到锁,每当一个服务器节点删除,zk会告诉其他线程最小节点已经删除,然后其他节点再检查,如果发现自己是此时的最小节点则可以获得锁
三、注册中心
- 每一个服务提供者准备好后,会将自己的服务注册到zk的某个路径上,产生一个znode节点,当客户端调用服务时,会获取zk的服务端列表找到对应的znode节点,通过该节点找到服务的相关信息,并且缓存到本地,同时客户端会watch该服务端节点
- 通过watch机制感知服务的注册,当某个路径的服务节点更新时,zk将感知到,并且通知客户端,同时将新的服务节点信息推送给客户端,缓存在客户端本地
- 通过心跳检测机制zk可以感知服务的下线,每隔一段时间发送一个ping,如果长时间没有回应pong就代表服务器宕机,znode节点会消失,提供watch机制,zk会通知客户端该服务已下线,并且提供一个新的服务节点信息
- zk底层采用NIO,多线程模型性能也比较高
四、Watcher机制
- 客户端请求
- 客户端在构造方法里传递watcher参数,可以实现在服务器上某一节点的数据或者状态发生改变时收到相应的通知,这个传入的watcher会一直保存在zkwatchmanager里
- 服务端注册watcher
- 服务端对客户端发来的请求解析,如果有watch,则将该事件注册到服务端的watchmanager
- 服务端触发watch
- 当节点状态或者数据发生改变时,向客户端发送通知,并且删除watchmanager里的该watch
- 客户端处理watch
- 客户端收到服务端的通知后,先将zkwatchmanager中的watch删除,然后对该watch事件进行处理
五、ZAB
- 是zk的一种支持崩溃恢复的原子广播协议,用于实现分布式事务的最终一致性
- 三阶段
- 领导者选举阶段
崩溃恢复阶段- 网络出现崩溃的时候,ZAB进入崩溃恢复阶段,选取出一个唯一的Leader服务器来处理客户端的所有写请求
- 数据同步阶段
- 集群中的所有节点数据与Leader节点保持一直,如果不一致要进行同步,当半数机器都一致后,ZAB退出恢复模式,进入请求广播阶段
- 请求广播阶段
- Leader节点接收到请求消息,通过两阶段提交来广播该写请求,使得写请求向事务一样在其他节点上执行,达到数据的实时一致性
- 领导者选举阶段