ZooKeeper学习(一)—Zookeeper基础介绍

Scroll Down

ZooKeeper学习(一)—Zookeeper基础介绍

ZooKeeper是一个开放源代码的分布式协调服务,由知名互联网公司雅虎创建,是Google Chubby的开源实现。ZooKeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

Zookeeper是什么?

ZooKeeper 是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

Zookeeper保证一致性特性

  • 顺序一致性
    从同一个客户端发起的事务请求,最终将会严格地按照其发起顺序被应用到ZooKeeper中去。
  • 原子性
    所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群所有机器都成功应用了某一个事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,而另外一部分没有应用的情况。
  • 单一视图(Single System Image)
    无论客户端连接的是哪个ZooKeeper服务器,其看到的服务端数据模型都是一致的。
  • 可靠性
    一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一直保留下来,除非有另一个事务又对其进行了变更。
  • 实时性
    通常人们看到实时性的第一反应是,一旦一个事务被成功应用,那么客户端能够立即从服务端上读取到这个事务变更后的最新数据状态。这里需要注意的是,ZooKeeper仅仅保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。

Zookeeper四大设计目标

目标一:简单的数据模型

  • zookeeper通过一个共享的、树形结构的名字空间来进行相互协调,zookeeper的数据是由一系列称为ZNode的数据节点组成的,zookeeper的存储就类似与文件系统,是一个上下级层级关系,而且zookeeper将数据内容存储在内存中,因此可以提高服务器的吞吐与减少延迟。

    image-20200707124958539

目标二:可以构建集群

  • zookeeper只需要3-5台机器就可以组成一个可用的集群,组成集群的zookeeper会在内存中维护当前服务器的状态,并且每台机器上面都会互相保持着通信,集群中只要有一半以上的机器能够正常工作,那么整个zookeeper就能正常对外提供服务

    image-20200707125334649

目标三:顺序访问

  • zookeeper针对每个事物请求,都会分配一个全局唯一的递增编号,这个编号反映了事务申请的先后顺序,因此zookeeper也是严格按照顺序来执行相应事务请求的。

目标四:高性能

  • zookeeper将数据存储在内存中,并且所有的follower机器可以自行处理读请求,因此它尤其适合于以读操作为主的主要应用场景,并且性能非常高效。

Zookeeper的基本概念

Zookeeper集群中的角色

通常我们会使用的集群模式是Master/Slave模式(主备模式),即Master机器处理所有的写数据服务,通过异步方式将数据复制到其他提供读数据服务的Slave机器上。

Zookeeper在集群中引入了三种角色,Leader、Follower和Observer三种角色

  • Leader角色:集群中选举出一台Leader机器,为客户端提供读/写服务,并且所有的事务请求只能由Leader角色进行处理
  • Follower角色:Follower角色提供读服务,并且会参与Leader选举过程与提案的投票过程
  • Oberver角色:Oberser角色不参与任何选举与投票过程,只提供读服务,并且可以在扩展集群时提升集群的读性能,因为Observer机器不参与投票,这样可以减少Leader提出提案投票交互的通信请求。

会话(Session)

Session是指客户端的会话,在Zookeeper中,客户端启动的时候会和zookeeper服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向Zookeeper发送请求并接受响应,同时还能接收来自服务器的Watch事件通知。并且Session中的sessionTimeout值是用来设置客户端会话超时时间的,即使是客户端因为某种原因断开了连接,只要能在超时时间内重新连接上任意一台服务器,那么这个会话还是有效的。

数据节点(ZNode)

在Zookeeper中,节点分为两类,第一类是指构成集群的机器,我们称为机器节点。第二类是数据模型中的数据单元,我们称为数据节点-ZNode,Zookeeper将所有的数据都存储在内存中,并且数据模型是一棵树(ZNode Tree),由/进行分隔上下级,例如/cloud/one,每个ZNode都会保存有自己的数据内容,同时还会保存一系列的属性信息。

在Zookeeper中,ZNode分为持久性节点与临时节点,并且两种节点还可以添加上一个排序属性-SEQUENTIAL,加上这个属性后,就会在节点后面自动追加上一个整型数字,这个数字是由父节点进行维护的递增数字。

  • 持久性节点:持久性节点是zookeeper中最常见的节点,这个ZNode一旦被创建后,只能通过主动移除的办法才能将其删除,否则会一直存在
  • 临时性节点:ZNode的生命周期与客户端会话绑定,一旦客户端的会话失效,那么这个客户端创建的所有临时性节点都会被移除,并且临时节点是不能继续创建子节点的
  • 持久性顺序节点:节点特性与持久性节点相同,但是会有一个顺序性的概念,创建节点时会在节点名后面追加一个数字的后缀
  • 临时性顺序节点:节点特性与临时性节点相同,创建临时节点时,会在名字后面追加一个数字的后缀

版本

每个ZNode上面都会存储数据,而这个数据的数据结构在Zookeeper中称为Stat,Stat中记录了这个ZNode的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode子节点的版本)和aversion(当前ZNode的ACL版本)

Watcher

Watcher(事件监听器)是Zookeeper中很重要的特性,zookeeper允许用户在指定节点注册一些Watcher,并且在一些特定事件触发的时候,zookeeper服务端会将事件转发至相应的客户端上

image-20200708003410713

zookeeper的Watcher机器主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分

具体的工作流程为:

  • 客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager中
  • zookeeper服务器触发Watcher事件
  • 向对应的服务器发送通知
  • 客户端线程从WatcherManager中取出对应的Watcher对象执行回调逻辑

ACL

Zookeeper采用ACL(Access Control Lists)策略来进行权限控制,类似于UNIX文件系统的权限控制

  • CREATE:创建子节点的权限
  • READ:获取节点数据和子节点列表的权限
  • WRITE:更新节点数据的权限
  • DELETE:删除子节点的权限
  • ADMIN:设置节点ACL的权限