Zookeeper是一个典型的分布式数据一致性的结局方案,分布式应用程序可以基于它实现注入数据发布、订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能,
Zookeeper可以保证如下分布式一致性特性:
-
顺序一致性
从同一个客户端发起的事务请求,最终将会严格地按照其发起顺序被应用到Zookeeper中去 -
原子性
所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群所有机器都成功应用了某一个事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,而另外一部分没有应用的情况 -
单一视图
无论客户端连接的是那个Zookeeper服务器,其看到的服务端数据模型都是一致的 -
可靠性
一但服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一直保留下来,除非有另外一个事务又对其进行了变更。 -
实时性
Zookeeper仅仅保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态
Zookeeper基本概念
三种角色:Leader Follower Observer三种角色。Leader提供读写服务,Follower和Observer都能提供读服务,Obserever不参与选举。
会话Session:Session是指的客户端会话,在Zookeeper中,一个客户端连接指的是客户端和服务端之间的一个TCP长连接,ZooKeeper对外的服务端端口默认是2181,客户端启动的时候首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也就开始了。通过这个连接,客户端能够通过心跳检测与服务器保持有效的绘画,也能够接受服务器的Wacher事件通知。
数据节点(Znode)
在Zookeeper中,Znode可以分为持久节点和临时节点两类,持久节点创建之后除非进行移除操作,会一直存在。临时节点跟生命周期和客户端会话绑定,一旦客户端会话失效,这个客户端创建的所有临时节点都会被移除。
版本
Zookeeper上的Znode都会维护一个Stat的数据结构,包含三个数据版本 version(当前Znode的版本)、cversion(当前Znode子节点的版本)和avesion(当前Znode的ACL版本)
Watcher
Watcher事件监听器,是Zookeeper中的一个很重要的特性,Zookeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,Zookeeper服务端会将时间通知到感兴趣的客户端上。
ACL
Zookeeper采用ACL策略进行权限控制,定义下边5种权限:
- Create 创建子节点的权限
- Read 获取节点数据和子节点列表的权限
- Write 更新节点数据的权限
- Delete 删除子节点的权限
- Admin 设计节点ACL的权限
ZooKeeper的ZAB协议
ZAB是Zookeeper设计的崩溃客可恢复的原子消息广播算法。
Zookeeper使用一个单一的主进程来接受并处理客户端的所有请求,并采用ZAB的原子广播协议,将服务数据的状态变更以事务Proposal的形式广播到所有的副本进程上去。