目录
1 简介
- Zookeeper是根据谷歌的论文《The Chubby Lock Service for Loosely Couple Distribute System 》所做的开源实现
- Zookeeper是Apache Hadoop的子组件之一,但是不仅仅支持Hadoop,还支持绝大部分的分布式集群
- Zookeeper是一个分布式的协调服务框架,用于解决分布式环境下的一些常见问题:集群管理、统一命名服务,信息配置管理,分布式锁等等
2 概念
2.1 zookeeper特点
- Zookeeper是一个树状结构(Znode树)
- 树状结构(Znode树)的根节点为 /
- Zookeeper的每一个节点称之为是znode节点
- 所有的znode节点都是从根节点开始计算
- 每一个znode节点都必须存储数据
- 每一个持久的znode节点都可以挂载子节点
- 每一个znode节点的路径都是唯一的。所以基于这一个特点,可以做集群的统一命名服务
- Znode树是维系在内存中的,即每一个znode节点中的数据也是维系在内存中,这样做的目的是方便快速查找
- 不能利用Zookeeper存储海量数据,原因:
- a. Znode树维系在内存中,并且多个Zookeeper存储的是相同的数据造成内存的浪费;
- b. Zookeeper是做分布式的协调服务而不是做存储服务
- Zookeeper提供了持久化机制,持久化的目录由zoo.cfg中的dataDir属性来决定
- Zookeeper会为每一次的事务(增加、删除、更新)提供一个全局的递增的事务id
2.2 zookeeper的角色
领导者(leader),负责进行投票的发起和决议,更新系统状态
» 学习者(learner),包括跟随者(follower)和观察者(observer),follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票
» Observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度
» 客户端(client),请求发起方
3 特性总结
3.1 数据一致性
客户端不论连接到哪个Zookeeper节点上,展示给它都是同一个视图,即查询的数据都是一样的。这是Zookeeper最重要的性能
3.2 原子性
对于事务决议的更新,只能是成功或者失败两种可能,没有中间状态。 要么都更新成功,要么都不更新。即,要么整个集群中所有机器都成功应用了某一事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,另外一部分没有应用的情况。
3.3 可靠性
一旦Zookeeper服务端成功的应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会一直保留下来,除非有另一个事务又对其进行了改变。
3.4 实时性
Zookeeper保证客户端将在非常短的时间间隔范围内获得服务器的更新信息,或者服务器失效的信息,或者指定监听事件的变化信息。(前提条件是:网络状况良好)
3.5 顺序性
如果在一台服务器上消息a在消息b前发布,则在所有服务器上消息a都将在消息b前被发布。客户端在发起请求时,都会跟一个递增的命令号,根据这个机制,Zookeeper会确保客户端执行的顺序