本文向您展示了Zookeeper的基本知识,简洁易懂。它一定会让你的眼睛发光。希望通过这篇文章的详细介绍,你能有所收获。
简介
Apache ZooKeeper是一个分布式、开源的分布式应用协调服务,由Client和Server组成。服务器提供一致的复制和存储服务。客户端包含一个简单的原语集,基于这个原语集,分布式应用程序可以实现同步服务、配置维护和命名服务等。ZooKeeper的设计非常容易编程。ZooKeeper维护了一个分层的名称空间,它采用了类似于树的数据结构,类似于标准的文件系统。因为从头开始实现一个分布式的协同服务是非常困难的。最常见的问题是竞争条件和死锁。Apache ZooKeeper的目标是封装复杂易错的关键服务,为用户提供易于使用的高性能稳定功能的接口和系统。
Zookeepr的数据存储在内存中(更新后的数据会持久化到磁盘上),所以它的吞吐量会很高,延迟会很低。ZooKeeper的实现更加注重高性能、高可用和严格有序的访问。Zookeeper的性能使其能够在大规模分布式系统中使用,高可用性可以避免单点故障,严格有序的访问可以使Client实现复杂的同步原语。
Zookeeper系统模型
上图中的哪些服务器组成了Zookeeper服务,每个服务器都知道对方的存在。这些服务器在内存中保存状态的镜像,并通过事务日志和快照保存到硬盘上。只要集群中的大多数服务器都可以访问,ZooKeeper服务就可以使用。
客户端将连接到动物园管理员服务器。客户机和服务器保持一个长的TCP连接。通过这种TCP长连接,客户端可以发送请求、获取响应、获取观察事件和发送心跳(客户端和服务器通过心跳保持连接,即会话)。如果与服务器的长TCP连接断开,则客户端将连接到另一台服务器。
Zookeeper是有序的:的动物园管理员使用邮票作为所有交易的顺序。
Zookeeper是非常快的:特别是在面向读取的情况下,Zookeeper应用可以在数千台机器上运行,读写比为1033601时性能最好。
Zookeeper数据模型
ZooKeeper数据模型的结构与Unix文件系统非常相似,可以看作是一个整体的树,每个节点称为一个ZNode。每个ZNode可以存储少量数据(默认为1M,可以通过配置修改,一般不建议在ZNode上存储大量数据)。以下是动物园管理员的一些重要概念:
1、Znode
1.Zookeeper节点称为Znode,每个节点都有一个唯一的路径标记。氧化锌有两种类型:1 .普通Znode2、短暂的(暂时的)节点
2.Znode维护stat结构,其中包含数据、ACL更改的版本号和时间戳,以允许缓存验证和协调更新。当znode的数据发生变化时,版本号会增加。
3.Znode可以有子节点,Znode可以存储数据,但是短暂(临时)的Znode不能有子节点。
4.Znode数据可以有多个版本,客户端可以根据版本获取该节点的数据。
5.如果创建临时节点的客户端和服务器之间的连接丢失,零节点将被自动删除。
6、Znode可以自动编号。
7.可以在Znode中添加watch,用于监控该节点中存储的数据是否被修改,以及子节点目录的变化等。一旦发生更改,就可以通知监控客户端。
8.Znode的读写操作是原子的,每个Znode都有一个访问控制列表(ACL)来控制谁可以做什么操作。
第二,会议
客户端和动物园管理员之间的通信需要创建一个会话,该会话将会超时。因为Zookeeper集群将保存客户端的会话信息,所以在会话到期之前,客户端和Zookeeper服务器之间的连接可以在ZooKeeper服务器之间透明地移动。
在实际应用中,如果客户机和服务器之间的通信足够频繁,会话的维护就不需要其他额外的消息。否则,如果客户机2T/3毫秒不发送心跳信号,动物园管理员客户机将每T/3毫秒向服务器发送一次心跳信号
收到来自Server的心跳回应,就会换到一个新的ZooKeeper Server上。这里T是用户配置的Session的超时时间。
三,Watcher
ZooKeeper支持一种Watch操作,Client可以在某个ZNode上设置一个Watcher,来Watch该ZNode上的变化。如果该ZNode上有相应的变化,就会触发这个Watcher,把相应的事件通知给设置Watcher的Client。需要注意的是,ZooKeeper中的Watcher是一次性的,即触发一次就会被取消,如果想继续Watch的话,需要客户端重新设置Watcher。
四,事务日志和快照
dataDir目录指定了Zookeeper的数据目录,用于存储Zookeeper的快照文件(snapshot)。
dataLogDir定义了Zookeeper的事务日志目录,目录存放Zookeeper的事务日志,正常情况下,所有的更新操作在返回客户端更新成功前,Zookeeper肯定已经将本次更新操作写入到事务日志了(即磁盘中)。事务日志的文件名是log.,zxid是写入这个文件的第一个事务id。在完成若干次事务后会一次数据快照,将当前Server上所有节点的状态以快照文件的形式dump到磁盘上去,即snapshot文件。
Zookeeper角色
Zookeepr角色分可以分为四类:
角色 |
描述 |
Leader |
领导者负责进行投票的发起和决议,更新系统状态 |
Follower |
1,Follower负责接收Client请求,并向客户端返回结果 2,在选Leader的过程中参与投票 |
Observer |
ObServer可以接收客户端的连接,将写请求转发到Leader节点,但是ObServer不参与投票和选举,仅仅接收投票和选举的结果。它的作用主要是用来扩展系统,提高读取的速度。ObServer是zookeeper-3.3.0新加的角色。 |
Client |
请求发起方 |
Server的状态可以分为如下四种:
leading:当前Server为Leader。
following:当前Server为Follower。
observing:当前Server为Observer。
looking:当前Server不知道leader是谁,正在搜寻。
Zookeeper特性
顺序一致性:按照客户端发送请求的顺序更新数据。Zookeeper是不属于强一致性,因为watcher没办法扑捉到每次的变化。
原子性:更新要么成功,要么失败,不会出现部分更新。
单一系统映像 :无论客户端连接哪个server,都会看到同一个视图。
可靠性:具有简单、健壮、良好的性能,如果消息被到一台服务器接受,那么它将被所有的服务器接受。
时效性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新数据,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
ZooKeeper原理
Zookeeper的核心是原子广播,通过Zab协议保证各个Server之间数据的同步。Zab协议有两种模式,分别是恢复模式(选举Leader)和广播模式(同步)。服务启动或者Leader崩溃后,Zab就会进入了恢复模式,当Leader被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了Leader和Server具有相同的系统状态。
为了保证事务的顺序一致性,Zookeeper采用了递增的事务id号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识leader关系是否改变,每次一个leader被选出来,它都会有一个新的epoch,标识当前属于那个leader的统治时期。低32位用于递增计数。
每个Server在工作过程中有四种状态:
LOOKING:当前Server不知道leader是谁,正在搜寻。
LEADING:当前Server即为选举出来的leader。
FOLLOWING:leader已经选举出来,当前Server与之同步。
OBSERVING:不选举,只从Leader同步状态。
Zookeeper API
Zookeeper的一个设计目标是提供简单的编程接口,仅仅支持如下操作:
create:创建一个Znode。path是其路径,data是要存储在该Znode上的数据,createMode包括:PERSISTEN,PERSISTENT_SEQUENTAIL,EPHEMERAL,EPHEMERAL_SEQUENTAIL。
delete:删除一个Znode。可以删除指定版本的Znode,如果version设置为-1的话,就删除所有的版本。
exists:判断Znode是否存在,设置是否Watch这个Znode。
get data:读取指定Znode上的数据,并设置是否watch这个Znode。
set data:更新指定Znode的数据,并设置是否Watch这个Znode。
get children:更新指定ZNode的数据,并设置是否Watch这个Znode。
sync:把sync之前的更新操作都同步过来。
set acl:设置指定ZNode的Acl信息
get acl:获取指定ZNode的Acl信息
其他
读、写(更新)模式:
Zookeeper集群中,客户端可以从任意一个ZooKeeper服务器读取,这一特点保证了ZooKeeper有比较好的读性能;
写的请求会先Forwarder到Leader,然后由Leader来通过ZooKeeper中的原子广播协议,将请求广播给所有的Follower,Leader收到一半以上的写成功的Ack后,就认为该写成功了,就会将该写进行持久化,并告诉客户端写成功了。
WAL(Write-Ahead-Log)和Snapshot:
ZooKeeper也有WAL,每一个更新操作,ZooKeeper都会先写WAL,然后再对内存中的数据做更新,最后向Client通知更新结果。
ZooKeeper还会定期将内存中的目录树进行Snapshot,落地到磁盘上。其实跟HDFS中的fsimage和edits log是类似的。这么做的主要目的,一当然是数据的持久化,二是加快重启之后的恢复速度,如果全部通过Replay WAL的形式恢复的话,会比较慢。
FIFO:
对于每一个ZooKeeper客户端而言,所有的操作都是遵循FIFO顺序的,这一特性是由下面两个基本特性来保证的:
一是ZooKeeper Client与Server之间的网络通信是基于TCP,TCP保证了Client/Server之间传输包的顺序;
二是ZooKeeper Server执行客户端请求也是严格按照FIFO顺序的。
线性化:
ZooKeeper包括全局有序和偏序两种:
全局有序是针对服务器端。例如:在一台服务器上消息A在消息B前发布,那么所有服务器上的消息A都将在消息B前被发布;
偏序是针对客户端。例如:在同一个客户端发送消息B在消息A后发布,那么执行的顺序必将是先执行消息A然后在是消息B;
所有的更新操作都有严格的偏序关系,更新操作都是串行执行的,这一点是保证ZooKeeper功能正确性的关键。
使用场景
1,数据发布与订阅
2,名空间服务
3,分布式通知/协调
4,分布式锁
5,集群管理
上述内容就是Zookeeper的基础知识是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/86832.html