为什么需要zk

我们在kafka里看到了zk的使用,现在我们需要回答一个问题,为什么要用zk,为什么它在分布式系统里有着如此无可替代的地位,什么情况下我们要用zk?我们可以先看一下官网的回答:zk为分布式应用提供分布式协调服务,首先zk是用在分布式系统的,其次提供协调服务,提供什么样的协调服务呢,它另外一个属性是cp,也就是在分布式系统需要一致性的协调服务的时候我们就可以用zk了。zk设计的目标分为四个:

zk设计目标

  • 简单数据模型:zk使得分布式程序能够同过一个共享的、树型结构的名字空间来进行相互协调。树型结构的名字空间:是指zk服务器内存中的一个数据模型,其由一系列被称为ZNode的数据节点组成,总的来说,其数据模型类似于一个文件系统,而ZNode之间的层级关系,就像文件系统的目录结构一样。不过和传统的磁盘文件系统不同的是,zk将全量数据存储在内存中,以此来实现提高服务器吞吐、减少延迟的目的。

  • 可以构建集群:一个Zk集群通常由一组机器组成,一般3~5台机器就可以组成一个可用的zk集群了。组成zk集群的每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都互相保持着通信。值得一提的是,只要集群中存在超过一半的机器能够正常工作,那么整个集群就能够正常对外服务。Zk的客户端程序会选择和集群中任意一台机器来共同来创建一个TCP连接,而一旦客户端和某台Zk服务器之间的连接断开后,客户端会自动连接到集群中的其他机器。zk的客户端就是自己的分布式服务,zk服务器就是自己的集群。

在这里插入图片描述

  • 顺序访问:对于来自客户端的每个更新请求,zk都会分配一个全局唯一的递增编号,这个编号反映了所有事务操作的先后顺序,应用程序可以使用zk的这个特性来实现更高层次的同步原语。这个编号一般是zxid

  • 高性能:由于zk将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,因此它尤其适用于以读操作作为主的应用场景。

zk几个核心概念

1. 集群角色

Leader、Follower和Observer三种角色。Zk集群中的所有机器通过一个Leader选举过程来选定一台被称为“Leader”的机器,Leader服务器为客户端提供读和写服务。除Leader外,其他机器包括Follower和Observer。Follower和Observer都能够提供读服务,唯一区别在于,Observer机器不参与Leader选举过程,也不参与写操作的“过半写成功”策略。因此Observer可以在不影响写性能的情况下提升集群的读性能。

2. 会话(Session)

Session是指客户端会话。在Zk中,一个客户端连接是指客户端和服务器之间的一个TCP长连接。zk对外的服务器端默认是2181,客户端启动的时候,首先会与服务器建立一个TCP连接,从第一次建立连接开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向zk服务器发送请求并接受响应,同时还能通过该连接,接收来自服务器的Watch事件通知。

Session的sessionTimeout值用来设置一个客户端会话的超时时间,由于服务器压力大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在sessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话任然有效。

3. 数据节点(Znode)

分布式中,通常说的节点指组成集群的每一台机器。然而,在ZK中,节点分为两类。第一类同样是指构成集群的机器,我们称为机器节点;第二类则是指数据模型中的数据单元,我们称之为数据节点————ZNode。zk将所有数据存储存储在内存中,数据模型是一棵树(ZNode Tree),由斜杠(/)进行分割的路径,就是一个ZNode,例如/foo/path1。每个ZNode 上都会保存自己的数据内容,同时还会保存一些列属性信息。

在Zk中,ZNode可以分为持久节点和临时节点两类。持久节点是指一旦这个ZNode被创建了,除非主动进行ZNode的移除操作,否则这个ZNode将一直保存在ZK上。而临时节点,它的生命周期和客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都被移除。

4. 版本

zk的每个ZNode上都会存储数据,对应于每个ZNode,zk都会为其维护一个叫做Stat的数据结构,Stat中记录了这个ZNode的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode子节点的版本)和aversion(当前ZNode的ACL版本)

5. Watcher

Watcher(事件监听器),zk允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,zk服务端会将事件通知到感兴趣的客户端上去,该机制使zk实现分布式协调服务的重要特性。

6. ACL

zk采用ACL(Access Control Lists)策略来进行权限控制,类似于UNIX文件系统的权限控制。zk定义了如下五种权限:

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

参考地址:

https://zookeeper.apache.org/doc/r3.5.5/zookeeperOver.html

https://zhuanlan.zhihu.com/p/69114539

http://nivelle.me/2016/04/12/Zookeeper%E5%AD%A6%E4%B9%A0-%E4%BA%8C-%E4%B9%8Bzk%E5%9F%BA%E7%A1%80/