I. 简介
ZooKeeper是一个分布式的,提供分布式应用程序协调服务的一个项目。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
工作机制
ZooKeeper从设计模式角度理解:是基于观察者模式的分布式服务管理框架,它负责存储和管理所有节点都关心的数据,然后接受观察者的注册,一旦这些数据发生变化,ZooKeeper就会通知已经注册了的观察者,观察者可以相应的做出反应。
ZooKeeper=文件系统+通知机制
所以大多数利用ZooKeeper实现的相关功能,都是基于其存储数据的机制加上数据监听的机制。比如利用ZooKeeper给集群中机器进行编号,服务器的动态上下线,分布式锁等等。
特点
ZooKeeper集群中包含四种角色:
- Leader:Leader负责进行投票的发起和决议,既能读也能写。
- Follower:Follower用于接收客户端请求并向客户端返回结果,只能提供读服务,写请求需转发给Leader节点;同时在选主过程中参与投票。
- Observer:Observer不参与投票过程,也不参与写操作的“过半写成功”策略,只同步Leader的状态。Observer的目的是为了扩展系统,提高读取速度。
- Client:客户端,连接ZooKeeper服务器,请求发起方。
如下是一个ZooKeeper集群示意图,共有7个服务器,其中1个Leader,4个Follower,2个Observer。
集群有如下特点:
- ZooKeeper集群中只有一个Leader,其他的均为Learner,包括Follower和Observer;
- 集群中只要有半数以上的节点存活,ZooKeeper就可以正常服务。半数以上特性使得往往集群节点个数为奇数;
- 全局数据一致。每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的;
- 更新请求顺序执行。来自同一个Client的更新请求按其发送次序顺序执行;
- 数据更新原子性。一次数据更新要么成功,要么失败,事务特点。
- 实时性。在一定时间范围内,客户端能够读到最新数据,因为数据量小,同步快。
数据结构
ZooKeeper的数据模型的结构与Unix文件系统很类似,整体上可以看做是一棵树,每个节点可以称作一个ZNode,每一个ZNode默认可以存储1MB的数据,每个ZNode都可以通过其路径唯一标识。
应用场景
统一命名服务
分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别和记住。例如:www.baidu.com域名对应的服务器ip地址有很多,域名很容易被识记,ip则很难。那么可以在ZooKeeper服务器上创建一个www.baidu,com的节点,该节点下可以创建所有ip地址名称的子节点,这样就可以统一命名,根据域名得到所有ip。
统一配置管理
分布式环境下,配置文件的同步往往非常常见。一般情况下,对配置文件的修改希望对集群中的每一个节点都生效。所以可以将配置文件上传到ZooKeeper的一个节点中,所有的节点去监听该节点内容变化,当节点内容变