Zookeeper介绍
ZK是一个开放源代码的分布式协调服务,设计目标是将哪些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
ZK是什么
是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列的呢过功能。
ZK可以保证如下分布式一致性特性
顺序一致性
从同一个客户端发起的事务请求,最终会严格的按照其发起顺序被应用到ZK中去
原子性
所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,妖魔整个集群中的所有机器都成功应用了某一个事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,而另外一部分没有应用的情况。
单一视图
无论客户端连接的是哪个ZK服务器,其看到的服务端数据模型都是一致的。
可靠性
一旦服务端成功地应用可一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一致保留下来,除非有另一个事务又对其进行了变更。
实时性
通常人们看到实时性的第一反应是,一旦一个事务被成功应用,那么客户端能够立即从服务端上读取到这个事务变更后的最新数据状态。这里需要注意的是,ZK仅仅保证在一段时间内,客户端最终一定能够从服务端上读取到最新的数据状态。
Zookeeper的特点
-
Zookeeper是一个树状结构(Znode树)
-
树状结构(Znode)的根节点为/
-
Zookeeper的每一个节点称之为是znode节点
-
所有znode节点都是从根节点开始计算的
-
每一个znode节点都必须存储数据
-
每一个持久的znode节点都可以挂载子节点
-
每一个znode节点都可以挂载子节点
-
znode树是维系在内存中的,即每一个znode节点中的数据也是维系在内存中,这样做的目的是方便快速查找
-
不能利用Zookeeper存储海量数据,原因:
1、Znode树维系在内存中,并且多个Zookeeper存储的是相同的数据造成内存浪费;
2、Zookeeper是做分布式的协调服务而不是做存储服务的 -
Zookeeper提供了持久化机制,持久化的目录由zoo.cfg中的dataDir属性来决定
-
Zookeeper会为每一次的事务(增加、删除、更新)提供一个全局的递增事务id
Zookeeper中常用的命令
服务端指令
sh zkServer.sh start 启动服务器端
sh zkServer.sh stop 停止服务器端
sh zkServer.sh restart 重启服务器端
sh zkServer.sh status 查看服务器端的状态
sh zkCli.sh 启动客户端
客户端指令
节点信息
Zookeeper的集群角色
在Zk中,引入了Leader、Follower和Observer三种角色。
Leader:Zk集群中的所有机器通过一个Leader选举过程来选定一台被称为"Leader"的机器,Leader服务器为客户端提供读和写服务。是整个Zk集群工作机制中的核心,其主要工作有:
- 事务请求的唯一调度和矗立着,保证集群事务处理的顺序性
- 集群内部各个服务器的调度者
**Follower:**是Zk集群状态的跟随者,其主要工作有以下三个
- 处理客户端非事务请求,转发事务请求给Leader服务器
- 参与事务请求Proposal的投票
- 参与Leader选举投票
**Observer:**是Zookeeper自3.3.0版本开始引入的一个全新的服务器角色,从字面意思看该服务器充当了一个观察者的角色—其观察Zk集群的最新状态变化并将这些状态变更同步过来,Observer服务器在工作原理和Follower基本是一致的,对于非事务请求都可以进行独立的处理,对于事务请求,则转发给Leader服务器进行处理,和Follower唯一的区别在于,Observer不参与任何形式的投票,包括事务请求建议Proposal的投票和Leader选举投票。Observer服务器只提供非事务服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力