一、基本点
Zookeeper算是现在互联网公司中软件开发中最常接触的“软件”之一了。它的设计目标就是将那些复杂且容易出错的分布式一致性服务封装起来,然后构成一个高效可靠的原语集,然后提供一系列简单易用的接口给用户。其实比如一些RPC框架、Kafka等消息队列机制,内部都是依赖了Zookeeper来进行分布式调度,Hadoop、storm、HBase、Solr等都把Zookeeper作为核心组件。分布式应用可以利用zk提供的诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。
ZK最早起源于雅虎研究院,zookeeper的来源也是因为雅虎众多项目都是以动物来命名,作为他们服务的管理和协调者,zookeeper的名字也就因此而来了。
ZK的几个基本概念:
1、集群角色。zk没有沿用传统的Master/Slave的概念,而是引入了Leader、Follower和Observer角色。Leader服务器为客户端提供读写;Follower和Observer都可以提供读服务器,区别在于,Observer服务器不参与Leader选举过程,也不参与写操作的“过半写成功”策略。
2、会话(Session)。客户端和服务器端的tcp长链接。
3、数据节点(Znode)。Zk的所有数据存在内存中,数据模型是一棵树,由斜杠进行分割路径,例如:/foo/path1.Zk中,ZNode分为持久节点和临时节点两类。临时节点生命周期是会话级别的,持久几点就是用久了。
4、版本。Znode中会有zk特殊维护的Stat的数据结构,Stat中记录了这个ZNode的三个数据版本,version(当前版本)、cversion(当前ZNode子节点的版本)、aversion(当前ZNode的ACL版本)。
5、Watcher,事件监听器。 ZK允许用户在指定节点上面注册一些Watcher,在一些事件发生的时候,zk会将事件通知到感兴趣的客户端上面去。
6、ACL(Access Control Lists),利用ACL策略来进行权限控制。
二、ZAB协议
ZooKeeper采用一种称为ZAB协议(zookeeper atomic broadcast zk原子消息广播协议)作为一致性的核心算法:
所有事务请求必须由一个全局唯一的服务器来协调处理,这样子的服务器被称为Leader服务器,而余下的服务器则称为Follower服务器。Leader服务器负责将一个客户端的请求转换成一个事务Proposal,并将该Proposal分发给集群中的所有的Follower服务器。之后的Leader服务器需要等待所有的Follower服务器的反馈,一旦超过半数的Follower服务器进行了正确了反馈后,那么Leader就会再次向所有的Follower服务器分发Commit消息,要求其将一个Proposal进行提交。