其他分享
首页 > 其他分享> > Zookeeper 技术内幕

Zookeeper 技术内幕

作者:互联网

文章目录

一、Zookeeper 核心概念概述

Zookeeper是一个分布式协调服务框架,是一个分布式数据一致性的解决方案。从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。

在分布式系统中,集群的每一台机器一般都会有自己的角色,例如最为经典的 Master/Slave模式,就将控制写操作的机器称为 Master,而通过异步复制获取数据并且提供读服务的机器称为 slave。

Zookeeper 则是通过引入 Leader、Follower 以及 Observer 三种角色。

  1. 通过选举过程选定 Leader 机器,可以提供读写服务。
  2. Follower 和 Observer 都能提供读服务,但是 Observer 并不参与选举过程,也不参与写操作的过半写成功策略。

Zookeeper 中一个客户端连接指的是客户端和服务器端之间的一个 TCP 连接。从连接的建立,一个客户端的会话周期也开始了。

并且会通过心跳检测来保证有效会话。

节点不仅指集群中的某一台机器,在 Zookeeper 中也指数据模型中的数据单元。

Zookeeper 将所有数据存储在内存中,数据模型是一棵树。

ZNode 可以分为持久节点临时节点两类。

  1. 持久节点指结点一旦被创建,除非主动移除,不然会一直存在。
  2. 临时节点指生命周期和客户端会话绑定,会话终止则消失。

每个ZNode 会维护一个 Stat 数据结构,记录了当前节点,子节点以及 ACL 的版本号。

Zookeeper 可以在某些节点上添加 Watcher 监听感兴趣的事件,如果发送事件则通知对应的客户端。

通过 ACL (Access Control Lists)策略来对节点进行权限控制。

二、ZAB 协议

Zookeeper 使用 Zookeeper Atomic Broadcast(ZAB,ZooKeeper原子消息广播协议) 的协议作为其数据一致性的核心算法。

Zookeeper 使用单一的主进程(Leader)接受并处理客户端的事务请求,然后采用 ZAB 的原子广播协议,将服务器数据的状态变更广播到所有副本进程(Follower)。

1. 消息广播

在这里插入图片描述

ZAB协议的消息广播过程使用的是一个原子广播协议,类似于一个二阶段提交过程。

但是,可能存在 Leader 崩溃退出而带来的数据不一致的问题,则需要通过崩溃恢复来解决。

2. 崩溃恢复

如果一个 Leader 服务器突然崩溃,或者失去与一半 Follower 的联系,就会进入崩溃恢复,需要选举新的Leader 并且 让其他 Follower 感知到新的 Leader。

为了保证数据的一致性,ZAB 协议需要保证以下两条特性:

所以,选举算法会选举出 ZXID 也就是事务 ID 最大的节点,就能保证该节点拥有系统中最全的事务消息。

再选取出 Leader 节点之后,就会进入数据同步的过程,对于正常的数据同步 Follower 机器,Leader 为每个 Follower 创建一个队列,并为每个 Follower 发送没有同步的事务,并带着 Commit 指令,表示已经提交。来保证集群系统数据的一致性。

而对于需要丢弃的事务,也就是之前 Leader 产生但是还没有发送给 Follower 的提案是如何丢弃的呢?

这又要回到 ZAB 协议的事务编号 ZXID,这是一个64位的数字,低 32 位是递增的计数器,而高 32 位则是代表 Leader 周期的 epoch 编号,也就是每更换一个 Leader 会 +1 ,代表了 Leader 的纪元。当之前的Leader恢复之后,发现之前的事务存在编号相同但是纪元更新的提案,则会进行回退。

三、系统模型

1. 数据模型

Zookeeper 的视图结构,类似于 Unix 系统中的文件系统,将文件目录抽象成了数据节点,也就是 ZNode,ZNode 可以存储数据,也可以挂在子节点,所以形成树形的层次化命名空间。

另外,对于可以改变服务器状态的操作,称为事务,包括对于数据节点的创建删除,内容更新等。

2. 节点特性

Zookeeper 中每个节点都有对应的生命周期,取决于节点的类型。

在ZooKeeper 中,节点类型可以分为持久节点(PERSISTENT)、临时节点(EPHEMERAL)和顺序节点(SEQUENTIAL)三大类,具体在节点创建过程中,通过组合使用,可以生成以下四种组合型节点类型:

另外,可以通过 stat 查看节点的状态。

在这里插入图片描述
在这里插入图片描述

3. 版本

Zookeeper 为数据节点引入版本的概念,每个节点主要保存了三种版本的信息:

因为 ZooKeeper 采用的 ZAB 原子消息广播协议,所以需要利用版本号来保证分布式情况下的原子性,版本号记录的是每个节点对应数据的修改次数,例如某个节点刚被创建,版本号就是0,修改一次则 + 1,每次进行事务操作的时候,就会先检查版本号,如果发现不是预期的当前版本,就会抛出 BadVersionExcption 异常。成功进行事务操作之后,就会对版本号进行一次更新。

4. Watcher 监视器

ZooKeeper 可以通过 Watcher 的机制来实现发布订阅的功能,客户端可以向服务器端注册一个 Watcher 监听,相当于注册感兴趣的事件,当该事件发生,则出发 Watcher ,就会向客户端发送一个对应的通知进行处理。

在这里插入图片描述

该机制主要的 Watcher 存储在客户端的 WatchManager 中,当触发事件之后,服务器端发送通知,客户端从 WatchManager 中取出 Watcher 对象执行对应的回调函数。

也就是回调 process() 函数。

abstract public void process(WatchedEvent event);

Zookeeper 服务器将触发事件包装为 WatchedEvent 返回放置到Watcher 中,客户端调用回调函数,取出对应事件进行处理。

5. Access Control List 访问控制列表

为了保障ZooKeeper 内数据的安全,避免因为误操作而导致的分布式系统异常,Zookeeper 提供一套 ACL 的机制来保证数据的安全。

ACL 机制主要包括三方面来实现:

四、Leader 选举

ZooKeeper Leader的选举是极其重要的技术之一,也是保障分布式数据一致性的关键所在,主要包括了服务器启动时的 Leader 选举,以及 Leader 崩溃之后的选举。

1. 服务器启动时期的Leader选举

将服务器集群中的机器启动并且可以相互通信之后发现没有Leader 节点,就进入 LOOKING 状态,并且可以开始进行选举 Leader 的过程。

主要流程如下:

2. 服务器运行期间的Leader选举

在提供服务期间,一旦Leader崩溃或者失去大于一半节点的联系,则该集群会无法对外提供服务,而进入新一轮 Leader 选举,选举过程和启动时大体相同,只不过 ZXID 不再是0,所以会选择事务ID更大的Follower 作为 Leader,因为他有集群最全的数据。

五、服务器角色

以上的内容应该已经清楚的知道了ZooKeeper 服务器主要包括三个角色:Leader、Follower 和 Observer。

六、请求处理

1. 写数据请求

ZK 客户端可以使用 SetData接口来进行写数据请求,改变数据节点的状态。大体分为请求的预处理,事务处理、事务应用以及请求响应四大步骤。

2. 事务转发请求

在 ZK 集群中,只有 Leader 节点能够处理事务请求,并不是所有的客户端都连接上 Leader 节点,所以需要对事务进行转发,当 Follower 节点或者 Observer 节点接受到事务请求之后,会检查是否是事务请求,如果是,则转发到Leader 节点进行处理。

3. 读数据请求

非事务请求的处理大体与写操作一样,但是少了很多校验转发操作,从相应数据节点中获取数据,封装为响应传送回客户端。

参考:

《从Paxos到Zookeeper :分布式一致性原理与实践》

标签:事务,Zookeeper,技术,节点,内幕,服务器,Leader,客户端
来源: https://blog.csdn.net/weixin_48922154/article/details/120208128