当前位置: 首页 > 图灵资讯 > 技术篇> 一文了解 Zookeeper 基本原理与应用场景

一文了解 Zookeeper 基本原理与应用场景

来源:图灵教育
时间:2023-07-02 17:09:52

Zookeeper 它是一种高性能、高可靠的分布式协调系统 Google Chubby 开源实现,目前广泛应用于分布式系统和大数据领域。这篇文章将介绍 Zookeeper 集群架构、数据模型、监控机制、Zookeeper典型应用场景等。

1. Zookeeper 集群角色

首先介绍下 Zookeeper 集群,一个 Zookeeper 集群通常由一组机器组成,一般可以由3~5个集群组成 Zookeeper 集群。集群拓扑图基本如下:

一文了解 Zookeeper 基本原理与应用场景_数据

Zookeeper 集群中的每个节点都将在内存中保持当前的节点状态,并保持相互通信。这里需要注意的是,只要集群中一半以上的节点正常工作,整个集群就可以提供外部服务。

如上图,在 Zookeeper 集群中,有 Leader、Follower 和 Observer 三种类型的角色。

Leader

Leader 节点整个 Zookeeper 集群工作机制的核心是处理客户端的读写请求和集群内各项服务的调度。请注意,只有 leader 能够处理写作请求。

Follower

处理客户端的阅读请求,并将写作请求转发给客户端 leader。参与 leader 选举投票等。

Observer

这是自 Zookeeper 3.3.0 版本引入的新角色主要是解决大规模问题 Server 场景下因 leader 选举投票成本的增加导致写作性能下降。Observer 工作原理和工作原理 follower 基本一致。处理客户端的阅读请求,将写作请求转发给leader。和 follower 唯一的区别在于,Observer 不参加任何形式的选举,包括 leader 选举。

一般来说,中小型规模 Zookeeper 只包含在集群中 leader 和 follower 我们很容易忽略两个角色 observer 角色的存在。节点的配置是 observer 也很简单,只需要以下两步:

# 将peerTyper添加到observer节点的配置文件中=observer# 在每个节点的配置文件中,添加observer节点:observerlogo# 例如:server.1:localhost:2181:3181:observer

此时此刻,相信你是对的 Zookeeper 对集群结构和相关角色有一定的了解。

2. Zookeeper 数据模型

Zookeeper 数据模型是一个类似的数据模型 Unix 文件系统的 ZNode Tree 即 ZNode 树,但没有引入传统文件系统的目录或文件概念,而是使用了称为 “数据节点” 这个概念,术语叫做 ZNode。ZNode 是 Zookeeper 存储数据的最小单元,每个单元,每个单元 ZNode 可以保存数据或挂载子节点,其中根节点是 /。示意图如下:

一文了解 Zookeeper 基本原理与应用场景_数据_02

使用过 Zookeeper 所有的学生都应该知道,Zookeeper 主要提供两个核心功能:

  • 客户端提交的数据管理(存储、读取);
  • 为客户端提供数据节点监控服务;

这是涉及的 Zookeeper 它的两个重要特征是 ZNode 模型与 Watcher 机制。

ZNode 模型

前面讲到 Zookeeper 由数据节点组成 ZNode 构成的,Zookeeper 每个数据节点都有一个生命周期,其生命周期的长度取决于 ZNode 节点类型。ZNode 根据其生命周期和特点可分为生命周期和特点 4 类。

一文了解 Zookeeper 基本原理与应用场景_客户端_03

分别是:

  • 持久性节点(PERSISTENT):客户端与 Zookeeper 断开会话后,节点仍然存在,节点将被清除,直到被删除。
  • 持久顺序节点(PERSISTENT_SEQUENTIAL):另一个持久节点,Zookeeper 将节点名称添加数字后缀,进行顺序编号。
  • 临时节点(EPHEMERAL):节点的生命周期与客户端会话绑定,客户端与客户端会话绑定 Zookeeper 断开会话后,节点将自动删除。许多场景都被使用 Zookeeper 这一特性的临时节点。
  • 临时顺序节点(EPHEMERAL_SEQUENTIAL):概念与上述概念相似,Zookeeper 该节点也将按顺序编号。

前面提及了 ZNode 除了存储用户数据外,它是存储数据的最小单元,ZNode 还有以下特点:

  • 包含 ZNode 修改/访问时间、事务id(zxid),ACL 状态信息,如权限、版本等;
  • 所有事务请求都在 ZNode 端是顺序和原子性的;
  • 数据主要存储在内存中,磁盘中保存事务日志、快照数据等;

Watcher 机制

Watcher 该机制也被称为监控机制,它是一种监控机制 Zookeeper 通过是关键特征 ZooKeeper 实现分布式发布/订阅、分布式锁、集群管理等功能的基础。

一文了解 Zookeeper 基本原理与应用场景_数据_04

如上图所示,Zookeeper 允许客户在服务端注册一个 Watcher 当服务端的一些指定事件触发监控时,监控器,如节点创建、删除、节点数据变更等事件,Zookeeper 相应的事件通知将发送给注册监听器的客户端。

3. 代码演示 Zookeeper 监听器

接下来,让我们来看看通过 Zookeeper 本地客户端 API,创建 ZNode 然后演示数据节点 Zookeeper 基本使用监听器。

引入依赖

首先,目前有一个节点包含三个节点 Zookeeper 集群,我们的基础 Zookeeper 版本引入了相应的依赖,如下

<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.5</version></dependency>

演示代码
  • 创建 ZNode

private final String ZK_ADDRS = “server01:2181,server02:2181,server03:2181";private final int SESSION_TIMEOUT = 5000;private String znodePath = "/my_node";@Testpublic void createZNode throws IOException, KeeperException, InterruptedException {//创建zookeper客户端ZooKeeper zkClient = new ZooKeeper(ZK_ADDRS, SESSION_TIMEOUT, watchedEvent -> {});////判断节点是否存在Statat exist = zkClient.exists(znodePath, false);if (exist == ){///创建持久节点并写入数据,完全放开acl权限zkclientttt,.create(znodePath, "123".getBytes, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}//关闭zookeper连接zkclienter.close;}

(左右滑动)

本单元测试实施后,我们通过命令行在服务端查看数据节点:

[zk: localhost:2181(CONNECTED) 48] get /my_node123czxid = 0xdb639ef2ctime = Fri Feb 27 21:08:09 CST 2020mZxid = 0xdb639ef2mtime = Fri Feb 27 21:08:09 CST 2020pZxid = 0xdb639ef2cversion = dataversion = 0aclversion = ephemeralowner = 0x0datalength = 3numChildren = 0

  • 删除 ZNode 节点,并监控节点的删除动作

@Testpublic void TestWatcher throws IOException, KeeperException, InterruptedException {//创建zookeeper客户端,并注册一个监听器ZooKeeper zkClient = new ZooKeeper(ZK_ADDRS, SESSION_TIMEOUT, new Watcher {@Overridepublic voidprocess(WatchedEvent watchedEvent) {//监听指定节点删除事件ififif (watchedEvent.getType == Event.EventType.NodeDeleted &&watchedEvent.getPath.equals(znodePath)){log.info(String.format("注意:ZNode '%s' is deleted !", znodePath));}}});///判断节点是否存在,并注册一个节点 watcherStat exist = zkClient.exists(znodePath, true);if (exist != )(//删除节点zkclientent.delete(znodePath, -1);}//关闭zookeper连接zkclienter.close;}

(左右滑动)

代码执行后,您可以看到控制台打印了我们的日志:

21:41:07.870 [main-EventThread] INFO xxx - 注意:ZNode '/my_node' is deleted !

检查节点的服务端已不再存在:

[zk: localhost:2181(CONNECTED) 50] get /my_nodeNode does not exist: /my_node

在这里,我们简单演示一下 Zookeeper 原始 API、希望通过这个简单的demo,我们可以使用监听器 Zookeeper 监听器有更直观的理解。

4. Zookeeper 应用场景

Zookeeper 它广泛应用于分布式系统和大数据领域 8 典型的应用场景:

数据发布/订阅

所谓配置管理或配置中心,拓扑图如下:

一文了解 Zookeeper 基本原理与应用场景_数据_05

通常在分布式系统或集群中,因此节点的配置应相同。例如,Hadoop集群需要对配置进行修改,可以快速同步到每个节点 Zookeeper 实现:

  • 写入配置信息 ZooKeeper 的一个 ZNode 中;
  • 每个节点从启动阶段开始 Zookeeper 获取配置,注册数据变更 Watcher 监听器;
  • 当 ZNode 中间的数据被修改,ZooKeeper 接到通知后,将通知各客户端节点进行配置更新;

负载均衡

负载平衡通常是一种动态服务配置,拓扑图:

一文了解 Zookeeper 基本原理与应用场景_客户端_06

通常包括两部分:

  • 服务注册,当服务提供商启动时,它将是一个根 ZNode 在节点下创建自己的子节点,并写一些服务信息 比如IP:Port信息;
  • 服务分析,服务用户在要求服务时将首先获得根源 ZNode 节点子节点列表,即服务列表,然后通过一定的负载平衡算法 例如,hash选择服务访问;

命名服务

又称 nameservice,这是一个常见的场景,Zookeeper 命令服务的应用主要有两个方向:

一文了解 Zookeeper 基本原理与应用场景_数据_07 style="visibility: visible; width: 570px;"></p><ul style=

  • 提供类似 JNDI 功能:将各种服务的名称、地址等信息放入 Zookeeper 使用时读取,实现资源的定位和使用;
  • 利用 Zookeeper 顺序节点的特性是唯一一个生成分布式的整体 ID;
  • 分布式协调/通知

    主要是使用 Zookeeper Watcher 注册和异步通知机制通常是不同客户端正确的 Zookeeper 进行一个数据节点 Watcher 注册和监控数据的变化。当数据节点发生变化时,所有订阅客户端都可以收到通知并相应处理。常见场景如:

    • Master 定期检测节点 Slave 节点状态与心跳检测机制相似;
    • 信息推送相当于发布订阅系统,类似于第一个场景;

    集群管理

    一文了解 Zookeeper 基本原理与应用场景_客户端_08

    主要包括两部分功能

    • 记录当前集群中有多少个节点在工作,以及节点的运行状态;
    • 上下操作集群中的节点;

    Master 选举

    Master 在分布式系统中,选举是一个非常常见的场景,在这里使用 Zookeeper 具有很强的一致性,确保只有一个客户端能够成功创建节点。

    一文了解 Zookeeper 基本原理与应用场景_客户端_09

    分布式锁

    不同节点的服务可能需要同时访问一个资源,然后可能需要一个分布式锁。使用 Zookeeper 实现分布式锁主要基于以下特点:

    • ZooKeeper 一致性强,保证只有一个客户端能成功创建锁。
    • 锁的独占性,创建 ZNode 只有成功的客户端才能获得锁,其它客户端只能等待,当客户端用完释放锁时,其它客户端再次尝试创建 ZNode,获取分布式锁。

    分布式队列

    利用 Zookeeper 主要可以实现两种分布式队列:

    • 当一个队列的成员聚集在一起时,这个队列可以使用,否则所有的成员都会等待到达,这是同步队列。 比如一个 job 由多个 task 成分,只有一切 task 完成后,job 才完成运行,可以做 job 创建一个 /job 目录,然后在目录下,为每个人完成 task 创建临时的 ZNode,临时节点数一旦达到 task 总数,则表示 job 运行完成。
    • 利用 Zookeeper 实现临时顺序节点特性 FIFO 也就是先进先出的队列。

    5. 总结

    本文介绍了 Zookeeper 集群结构,ZNode 数据模型,Watcher 监控机制,以及 Zookeeper 典型的应用场景。Zookeeper HDFS等主流大数据组件广泛应用于分布式系统中、HBase、同样依赖Kafka等 Zookeeper 提供协调服务。通过这篇文章的介绍,我相信我们是对的 Zookeeper 进一步掌握。