概念
1. Zookeeper是根据谷歌的论文《The Chubby Lock Service for Loosely Couple Distribute System 》所做的开源实现
2. Zookeeper是Apache Hadoop的子组件之一,但是不仅仅支持Hadoop,还支持绝大部分的分布式集群
Zookeeper是一个分布式的协调服务框架,用于解决分布式环境下的一些常见问题:集群管理、统一命名服务,信息配置管理,分布式锁等等
分布式存在的问题
1. 死锁:至少有一个线程把持了资源,但是由于线程之间的相互等待,所以线程不耗费CPU
2. 活锁:所有的线程都没有把持资源而导致资源产生了浪费。而且由于线程之间一直在调度,导致CPU一直处于被占用状态。
3. 分布式环境下,需要引入监控和管理节点来保证服务器之间的任务调度
4. 为了防止单一监控节点带来单点问题,所以需要引入多个监控节点
5. 为了防止多个监控节点之间的任务调度不同,需要在其中选举出一个主监控节点
6. 确定一套选举算法
7. 为了防止主节点宕机而导致所有数据丢失,需要将监控节点的数据进行统一
监控节点以及服务节点的统一配置
特点
1. Zookeeper是一个树状结构(Znode树)
2. 树状结构(Znode树)的根节点为 /
3. Zookeeper的每一个节点称之为是znode节点
4. 所有的znode节点都是从根节点开始计算
5. 每一个znode节点都必须存储数据
6. 每一个持久的znode节点都可以挂载子节点
7. 每一个znode节点的路径都是唯一的。所以基于这一个特点,可以做集群的统一命名服务
8. Znode树是维系在内存中的,即每一个znode节点中的数据也是维系在内存中,这样做的目的是方便快速查找
9. 不能利用Zookeeper存储海量数据,原因:
a. Znode树维系在内存中,并且多个Zookeeper存储的是相同的数据造成内存的浪费;
b. Zookeeper是做分布式的协调服务而不是做存储服务
10. Zookeeper提供了持久化机制,持久化的目录由zoo.cfg中的dataDir属性来决定
11. Zookeeper会为每一次的事务(增加、删除、更新)提供一个全局的递增的事务id
节点类型
类型 | 解释 |
PERSISTENT | 持久节点 |
EPHEMERAL | 临时节点 |
PERSISTENT_SEQUENTIAL | 持久顺序节点 |
EPHEMERAL_SEQUENTIAL | 临时顺序节点 |
特性总结
1. 数据一致性:客户端不论连接到哪个Zookeeper节点上,展示给它都是同一个视图,即查询的数据都是一样的。这是Zookeeper最重要的性能
2. 原子性:对于事务决议的更新,只能是成功或者失败两种可能,没有中间状态。 要么都更新成功,要么都不更新。即,要么整个集群中所有机器都成功应用了某一事务,要么都没有应用,一定不会出现集群中部分机器应用了改事务,另外一部分没有应用的情况。
3. 可靠性:一旦Zookeeper服务端成功的应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会一直保留下来,除非有另一个事务又对其进行了改变。
4. 实时性:Zookeeper保证客户端将在非常短的时间间隔范围内获得服务器的更新信息,或者服务器失效的信息,或者指定监听事件的变化信息。(前提条件是:网络状况良好)
5. 顺序性:如果在一台服务器上消息a在消息b前发布,则在所有服务器上消息a都将在消息b前被发布。客户端在发起请求时,都会跟一个递增的命令号,根据这个机制,Zookeeper会确保客户端执行的顺序性。底层指的是Zxid。可以通过事务log来看。
6. 过半性:Zookeeper集群必须有半数以上的机器存活才能正常工作。因为只有满足过半性,才能满足选举机制选出leader。因为只有过半,在做事务决议时,事务才能更新。所以一般来说,zookeeper集群的数量最好是奇数个