Zookeeper简介 - ZhaoHongnan/Introduction-Of-Zookeeper GitHub Wiki
如有疑问欢迎联系我,邮箱[email protected]
一、介绍
- Zookeeper分布式开源应用,为分布式程序提供服务
- 可以用于同步,配置存储,名称服务等
- 类似于文件系统目录结构的数据模型
二、设计实现
- 允许分布式程序通过共享的层级命名空间互相协调
- znode节点类似于文件系统中的文件夹和文件,操作基于绝对路径
- 数据保存于内存中,同样备份一份于磁盘上
- Zookeeper服务端互相知道彼此存在,并且保存有状态,事务性日志和系统快照,只要大多数服务端节点可用则程序可用
- Zookeeper客户端与服务端通过TCP通信,发送请求、获取回复、监听事件和发送心跳等。客户端只连接一个单独的服务端,如果TCP连接断开,客户端会尝试连接一个不同的服务端
- 对于每一次的更新,都会使用一个唯一的数字标示反应事务的顺序性
- 当读取操作多于写入操作时,Zookeeper执行性能最优
- Znode可以具有子节点,也可以存储数据
三、Znode节点
- Znode具有一份stat结构包括,其包含数据(data)变更、ACL(Access Control List),时间戳的版本号,为了保证内存有效和协调更新。
- 数据(data)的每一次变化,版本号都会增加
- 数据(data)的读写操作都是原子性的,而且读写全部数据。
- ACL(Access Control List)用于权限的控制,限制谁可以操作
- Znode节点类型
- 持久化节点,一旦被创建不会主动消失,除非客户端自动删除
- 顺序节点,顺序增加节点编号
- 临时节点,客户端连接服务端时会创建一个session,一旦断开连接session消失,临时节点会随之消失
- 持久化顺序节点,这种节点会根据当前已存在的节点编号自动加1,并且不会自动消失
- 临时顺序节点,编号会自动增加,但是会随之客户端断开连接而消失
- Znode类型创建时确定,之后不能修改
四、观察(watches)
- 客户端可以监听一个Znode,当Znode改变,监听的客户端会触发事件并且观察被移除
- 如果想继续监听,需要重新设置watch
五、担保保证
- 顺序一致性,来自一个客户端的多个更新请求按照发送顺序被操作。为了保证顺序性,Zookeeper采用递增的事务ID(zxid)标示事务
- 原子性,更新操作要么成功要么失败,没有中间状态
- 唯一系统视图,客户端将看到相同的服务系统视图,换句话说整个系统的状态对所有客户端都是一样的
- 可靠性,一旦更新被执行其状态会一直保存,直到客户端再一次的更新请求
- 及时性,系统视图会在一个时间限制内保证被及时同步
六、简单的API
- Zookeeper API包含操作:
- create创建
- delete删除
- exists存在
- getData获取数据
- setData设置数据
- getChildren获取孩子节点
- sync同步数据
七、实现
- 为了系统故障恢复,更新操作会被写入到磁盘中。写操作在被写入内存前先序列化到磁盘中
- 服务端服务多个客户端;客户端仅连接到一个服务端,并且向其提交请求
- 读操作由服务器的本地缓存提供
- 改变服务状态到请求都由一致性协议保证,作为一致性协议都一部分,所有的写请求必须提交到唯一一台服务端上,这台服务端称为领导者(leader),领导者通过原子广播更新所有跟随者(follower)信息,领导者通过内部选举算法选举产生的
- 除了领导者以外,余下都所有服务端称为跟随者(follower),它们接受来自领导者到消息和完成给客户端消息的传递,在选领导者过程中投票,提供读服务
- Zookeeper消息层负责替换失败的领导者并且同步跟随者与领导者一致。由于消息层是原子性的,Zookeeper可以保证本地副本正确。所谓消息层,就是领导者接受写请求,计算当前系统状态,并将其传递给获取状态的事务,这一系列消息的传递和接受就是由信息层完成。
- 当写数据之后,需要一定时间限制同步本地内存,并且大多数节点写完成即返回给客户端,因此读数据时可能会读不到最新的节点信息,这时应该使用sync命令操作
- Zookeeper广播保证各个服务端之间的同步,实现这个机制的协议称为zab,协议包括同步跟随者信息和选举领导者。
八、应用
- 名字服务,像HDFS将配置信息放置于Zookeeper节点上,各个服务器读取该节点获取信息
- 配置管理,配置信息放置在Zookeeper节点上,其他需要配置信息的服务器监听这个节点,一旦节点发生变化触发监听器及时更新配置
- 互斥锁
- 所有线程同时监听一个临时节点,如果节点消失,开始通过创建临时节点竞争锁,之后重复这个过程直到所有线程执行完成。这种方法会产生惊群效应,就是当一个临时节点消失,所以的线程同时被唤醒抢占锁,极大的消耗系统资源
- 防止惊群效应,每个线程创建临时顺序节点,当前线程监听前一个节点,这样所有线程依次获取锁执行
- 组织管理,在同一目录下每个线程创建一个临时节点,可以通过这个目录了解当前系统中执行的线程状态,或者可以设置屏障,例如当满足一定数量的线程时执行某一个操作