文章目录
1. ZooKeeper是什么
Apache ZooKeeper是由Apache Hadoop的子项目发展而来,如今已是Apache的顶级项目。ZooKeeper为分布式应用提供了诸多如统一命名服务、配置管理、分布式锁等分布式的基础服务。在解决分布式数据一致性方面,ZooKeeper并没有直接采用Paxos算法,而是采用了一种被称为ZAB(ZooKeeper Atomic Broadcast,ZooKeeper原子广播协议)的一致性协议。
ZooKeeper是一个开放源代码的分布式协调服务,由雅虎创建。ZooKeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
2. ZooKeeper能干什么
ZooKeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸多如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁、分布式队列等功能。ZooKeeper可以保证如下分布式特性:
- 顺序一致性:从同一个客户端发起的事务请求,最终会严格的按照其发起顺序被应用到ZooKeeper中去
- 原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,即所有的机器都成功应用了该事务,不会出现一部分没有,而另一部分有的情况。
- 单一视图:无论客户端连接的是哪个ZooKeeper服务器,其看到的服务端数据模型都是一样的
- 可靠性:一旦服务端成功应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务器状态变更将会一直保留下来,除非有另一个事务又对其进行了变更。
- 实时性:ZooKeeper仅仅保证在一定的时间内,客户端一定能从服务端读取到最新的数据状态。
ZooKeeper集群的特点:
- ZooKeeper集群是由一个领导者(Leader)、多个追随者(Follower)组成的集群;
- 集群中只要有半数以上的节点存活,ZooKeeper集群就能正常服务;
- 全局数据一致:每个Server保存着一份相同的数据副本,Client无论连接到哪个Server,数据是一致的;
- 更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行;
- 数据更新原子性:一次数据更新要么成功、要么失败;
- 实时性:在一定时间范围内,Client能读到最新数据。
3. ZooKeeper的数据结构
ZooKeeper数据模型的结构与Unix文件系统类似,整体上可以看做是一棵树,每个节点称作一个 ZNode
。每一个ZNode 默认能够存储 1MB
的数据,每个ZNode都可以通过其路径唯一标识。
4. ZooKeeper下载安装使用
第一步:下载并安装(略)
第二步:将D:\zookeeper-3.4.14\conf
目录下的zoo_sample.cfg
复制一份到此文件夹下,命名为zoo.cfg
,原来的内容如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
需要修改的地方:dataDir=/tmp/zookeeper
,此处默认是Linux的安装目录,改为windows的目录,需要做以下修改:
- 在
D:\zookeeper-3.4.14
的安装目录下新建一个data
文件夹,将zoo.cfg
文件中的dataDir=/tmp/zookeeper
改为dataDir=D:\\zookeeper-3.4.14\\data
或dataDir=../data
,最后保存。
第三步:双击/bin
目录下的zkServer.cmd
启动ZooKeeper(也可通过命令行启动),最后如果输出以下内容则表明启动成功:
binding to port 0.0.0.0/0.0.0.0:2181
注:2181是ZooKeeper的默认端口(clientPort=2181
),不用做修改。
第四步:启动zkCli.cmd
和zkServer
建立连接进行会话,然后就可以进行其他操作了。。。
5. ZooKeeper应用场景
ZooKeeper提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
统一命名服务:在分布式环境下,通常需要对应用、服务进行统一命名,便于识别。例如:IP不容易记住,而域名容易记住。
统一配置管理:分布式环境下,配置文件同步非常常见。
- 一般要求一个集群中,所有节点的配置信息是一致的,比如Kafka集群。
- 对配置文件修改后,希望能够快速同步到各个节点上。
配置管理可交由ZooKeeper实现- 可将配置信息写入ZooKeeper上的一个Znode。
- 各个客户端服务监听这个Znode。
- 一旦Znode中的数据被修改,ZooKeeper将通知各个客户端服务器。
统一集群管理:分布式环境下,实时掌握每个节点的状态是必要的。
- 可根据节点实时状态做出一些调整;
ZooKeeper可以实现实时监控节点状态变化;- 可将节点信息写入ZooKeeper上的一个ZNode;
- 监听这个ZNode可获取它的实时状态变化;
服务器动态上下线:客户端能实时洞察到服务器上下线的变化。
软负载均衡:在ZooKeeper中记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求。
6. ZooKeeper相关概念
Session(会话)
Session是指客户端会话,在ZooKeeper中,一个客户端会话是指客户端和服务器之间的一个TCP长连接。ZooKeeper对外的服务端口默认是2181,客户端启动的时候,首先会与服务器建立一个TCP连接,从第一次会话开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向ZooKeeper服务器发送请求并接受响应,同时还能够通过该连接接受来自服务器的Watch事件通知。Session的sessionTimeout值用来设置一个客户端会话的超时时间。
数据节点(Znode)
在分布式系统中,通常说的“节点”是指组成集群的每一台机器。但是在ZooKeeper中,“节点”分为两类,第一类同样是指构成集群的机器,第二类则是数据模型中的数据单元(Znode)。ZooKeeper将所有数据存储在内存中,数据模型是一棵树(Znode Tree),由斜杠(/)进行分割的路径,就是一个Znode,例如/foo/path1,每个Znode上都会保存自己的数据内容,同时还会保存一系列属性信息。
在ZooKeeper中,Znode可以分为持久节点和临时节点两类。持久节点:一旦这个Znode被创建,除非主动进行Znode的移除操作,否则这个Znode将一直保存在ZooKeeper上。而临时节点则不一样,它的生命周期和客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除(实现分布式锁)。
版本
ZooKeeper的每个Znode上都会存储数据,ZooKeeper会为其维护一个叫做Stat的数据结构,Stat中记录了这个Znode的三个数据版本,分别是version(当前Znode的版本)、cversion(当前Znode子节点的版本)、aversion(当前Znode的ACL版本)。
Watcher(事件监听器)
Watcher(事件监听器)是ZooKeeper的一个很重要的特性。ZooKeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去,这是ZooKeeper实现分布式协调服务的重要特性。
ACL(访问控制列表)
ZooKeeper采用ACL(Access Control Lists,访问控制列表)策略来进行权限控制,类似于UNIX文件系统的权限控制。ZooKeeper定义了以下五种权限:
- CREATE:创建子节点的权限
- READ:获取节点数据和子节点列表的权限
- WRITE:更新节点数据的权限
- DELETE:删除子节点的权限
- ADMIN:设置节点ACL的权限