ZooKeeper 基本概念
ZooKeeper是一个开源的分布式协调服务,由知名互联网公司雅虎创建,是Google Chubby的开源实现。它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
原语: 操作系统或计算机网络用语范畴。是由若干条指令组成的,用于完成一定功能的一个过程。具有不可分割性·即原语的执行必须是连续的,在执行过程中不允许被中断。
特点
ZooKeeper可以保证如下分布式一致性特性:
- 顺序一致性:从同一客户端发起的事务请求,最终将会严格地按照顺序被应用到 ZooKeeper 中去。
- 原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群中所有的机器都成功应用了某一个事务,要么都没有应用。
- 单一视图:无论客户端连到哪一个 ZooKeeper 服务器上,其看到的服务端数据模型都是一致的。
- 可靠性:一旦一次更改请求被应用,更改的结果就会被持久化,直到被下一次更改覆盖。
- 实时性:ZooKeeper保证在一定时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。
设计目标
ZooKeeper致力于实现一个高性能、高可用,具有严格顺序访问控制能力(主要是写操作的严格顺序性)的分布式协调服务。高性能使得ZooKeeper能够应用于那些对系统吞吐有明确要求的大型分布式系统,高可用使得分布式的单点问题得到了很好的解决,而严格的顺序访问控制使得客户端能够基于ZooKeeper实现一些复杂的同步原语。
针对以上需求,ZooKeeper的四个设计目标如下:
-
简单的数据模型:ZooKeeper使用一个共享的、树形结构的命名空间来协调分布式程序。其数据模型类似一个文件系统,不过与传统的文件系统不同,ZooKeeper将全量数据存储在内存中,以此来实现提高服务器吞吐、减少延迟的目的。
-
可以构建集群:一个ZooKeeper集群通常由一组机器组成,组成ZooKeeper集群的每台机器都会在内存中维护当前服务器状态,并且每台机器之间都互相保持通信。只要集群中存在半数以上的机器能够正常工作,整个集群就可以正常对外提供服务。
-
顺序访问:对于来自客户端的每个更新请求,ZooKeeper都会分配一个全局唯一的递增编号,这个编号反映了所有事务操作的先后顺序,可以根据这个特性来实现更高层次的同步原语。
-
高性能:由于ZooKeeper将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,因此它尤其适用于以读操作为主的应用场景。
应用场景
ZooKeeper是一个典型的分布式数据一致性的解决方案,通常用于以下这些场景:
- 数据发布/订阅
- 负载均衡
- 命名服务
- 分布式协调/通知
- 集群管理
- Master选举
- 分布式锁
- 分布式队列