ZooKeeper初探:分布式世界的守护者

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: ZooKeeper初探:分布式世界的守护者

欢迎来到我的博客,代码的世界里,每一行都是一个故事


前言

在分布式系统的大舞台上,ZooKeeper如同一位悠扬的钢琴师,在这场音乐中谱写着各个节点的和谐旋律。本篇文章将带你进入这个神奇的音乐厅,解析ZooKeeper的基础知识,让你更加熟悉这位分布式系统的基石。

Zookeeper的概述

ZooKeeper 是一个开源的分布式协调服务,提供了一个高度可靠且高性能的协调基础,用于构建分布式系统。它是一个分布式的、开放源代码的分布式应用程序协调服务,是 Apache Hadoop 和 Apache HBase 等分布式系统的关键组件之一。

ZooKeeper 的设计目标主要包括:

  1. 一致性: ZooKeeper 提供的服务应该在所有节点上保持一致,即对于所有客户端来说,ZooKeeper 提供的数据应该是一致的。
  2. 可靠性: ZooKeeper 应该是高可用、高性能且可靠的,能够应对网络分区、节点故障等情况。
  3. 实时性: ZooKeeper 能够在一定时间内(通常是毫秒级别)完成客户端的请求,保证及时响应。
  4. 简单性: ZooKeeper 提供简单的 API,易于使用和理解。

分布式系统中的角色和作用:

在分布式系统中,ZooKeeper 扮演了关键的角色,主要有以下作用:

  1. 协调服务: ZooKeeper 提供了一致性和可靠性的协调服务,用于管理和协调分布式系统中的各个节点,确保它们能够同步工作。
  2. 配置管理: 分布式系统中的配置信息可以存储在 ZooKeeper 中,各个节点通过监听配置节点的变化来动态调整自己的配置。
  3. 命名服务: ZooKeeper 提供了一个命名空间,可以用于存储节点的名称和相关的信息,实现分布式系统中的命名服务。
  4. 分布式锁: ZooKeeper 提供了分布式锁的实现,通过在 ZooKeeper 中创建临时节点,可以实现分布式环境下的协同工作,例如实现互斥访问共享资源。
  5. 分布式队列: ZooKeeper 的有序节点可以用来构建分布式队列,实现任务的有序执行。
  6. 分布式通知: ZooKeeper 提供了监视节点的功能,当节点的状态发生变化时,可以通知相关的节点。

总体而言,ZooKeeper在分布式系统中起到了保障一致性、提供可靠性、管理配置、实现协调和解决分布式系统中常见问题的作用,是许多分布式系统的基础组件之一。

Zookeeper的数据模型

在ZooKeeper中,数据被组织成一个树状结构,类似于文件系统的目录结构。ZooKeeper的基本数据单元是Znode,每个Znode都可以存储数据,同时可以有子节点。

Znode的概念和层次结构:

  1. Znode(ZooKeeper节点): 是ZooKeeper中的基本数据单元。每个Znode都有一个唯一的路径(类似于文件系统中的路径),路径的形式类似于/path/to/znode
  2. 层次结构: ZooKeeper的Znodes形成了一个层次结构,类似于文件系统的目录结构。根节点是一个特殊的Znode,其路径为/。每个Znode可以有多个子节点,形成树状结构。

Znode的类型和应用场景:

Znode可以有不同的类型,这些类型决定了Znode的特性和用途。主要的Znode类型包括:

  1. 持久节点(Persistent Znode): 持久节点一旦创建,将一直存在,直到显式删除。这种节点常用于存储配置信息、静态数据等。
/path/to/persistentZnode
  1. 临时节点(Ephemeral Znode): 临时节点的生命周期与创建它的客户端会话相关。如果客户端会话结束,临时节点将被自动删除。这种节点通常用于表示临时状态或临时任务。
/path/to/ephemeralZnode
  1. 有序节点(Sequential Znode): 有序节点在节点名称后会追加一个递增的序号。这种节点类型常用于实现分布式队列或确保全局顺序。
/path/to/sequentialZnode0001
/path/to/sequentialZnode0002
  1. 有序临时节点(Sequential Ephemeral Znode): 结合了有序节点和临时节点的特性,适用于需要临时性和有序性的场景。
/path/to/sequentialEphemeralZnode0001
/path/to/sequentialEphemeralZnode0002

应用场景:

  • 配置管理: 持久节点用于存储静态配置信息,而临时节点可以用于动态配置信息。
  • 命名服务: Znode的路径可以被视为唯一标识,用于实现分布式系统中的命名服务。
  • 分布式锁: 通过创建有序临时节点,可以实现分布式锁的机制,确保全局顺序和避免死锁。
  • 任务分配: 可以使用有序节点来实现分布式系统中任务的有序分配。
  • Leader选举: 通过ZooKeeper的特性,可以实现分布式系统中的Leader选举。

总体而言,ZooKeeper的数据模型提供了灵活而强大的工具,适用于各种分布式系统场景。

Zookeeper的基本原理

ZooKeeper的基本原理:

  1. 事务日志和快照:
  • 事务日志(Transaction Log): ZooKeeper使用事务日志来记录所有的更新操作。每个客户端的请求都会被转化为一个事务,并将该事务写入事务日志,以确保数据的持久性。
  • 快照(Snapshot): 为了提高读取性能,ZooKeeper定期生成快照,该快照包含了当前数据的一个快照。当事务日志变得太大时,ZooKeeper会截断日志,将截断点之前的事务应用到快照中,然后继续记录后续的事务。这样,新的客户端可以从最近的快照开始,然后应用在快照之后的事务,以恢复到当前状态。
  1. ZAB协议(ZooKeeper Atomic Broadcast):
  • ZooKeeper使用ZAB协议来保证分布式系统中的数据的原子广播,确保所有节点看到的顺序相同。ZAB协议主要分为两个阶段:Leader选举事务广播
  • Leader选举: 在ZooKeeper集群中,有一个节点被选为Leader,负责协调和处理客户端的请求。Leader选举过程是ZAB协议的第一个阶段,它确保只有一个节点成为Leader。Leader负责向其他节点广播事务,保持一致性。
  • 事务广播: 一旦Leader选举完成,Leader开始接收客户端的写请求,并通过ZAB协议将这些写请求广播给所有节点。每个节点按照相同的顺序应用这些事务,确保在整个集群中数据的一致性。
  • 原子性: ZAB协议保证了事务的原子性。所有节点按照相同的顺序接收和应用事务,确保在整个集群中对数据的修改是原子的。
  • 持久性: 通过事务日志和快照,ZAB协议保证了数据的持久性。事务日志记录了每个事务的详细信息,而快照则提供了一种快速恢复到当前状态的机制。

ZooKeeper的基本原理和ZAB协议确保了ZooKeeper在分布式系统中提供了高可用、一致性和持久性的服务,使其成为分布式系统中常用的协调服务。

Zookeeper的基础操作

  1. 创建Znode:
  • 使用ZooKeeper客户端API,调用create方法可以创建一个Znode。
  • 示例:
String znodePath = "/myZnode";
byte[] data = "Hello, ZooKeeper!".getBytes();
zooKeeper.create(znodePath, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  1. 读取Znode:
  • 使用ZooKeeper客户端API,调用getData方法可以读取一个Znode的数据。
  • 示例:
String znodePath = "/myZnode";
Stat stat = new Stat();
byte[] data = zooKeeper.getData(znodePath, false, stat);
String dataString = new String(data);
System.out.println("Data: " + dataString);
  1. 更新Znode:
  • 使用ZooKeeper客户端API,调用setData方法可以更新一个Znode的数据。
  • 示例:
String znodePath = "/myZnode";
byte[] newData = "Updated data".getBytes();
int version = zooKeeper.exists(znodePath, true).getVersion();
zooKeeper.setData(znodePath, newData, version);
  1. 删除Znode:
  • 使用ZooKeeper客户端API,调用delete方法可以删除一个Znode。
  • 示例:
String znodePath = "/myZnode";
int version = zooKeeper.exists(znodePath, true).getVersion();
zooKeeper.delete(znodePath, version);

监听器的使用和事件通知:

ZooKeeper提供了监听机制,允许客户端在Znode发生变化时得到通知。可以使用Watcher接口实现监听器,并注册到ZooKeeper客户端。

  1. 设置监听器:
  • 使用getDataexists等方法时,可以通过在方法调用中传递Watcher对象来设置监听器。
  • 示例:
String znodePath = "/myZnode";
Stat stat = new Stat();
Watcher watcher = new MyWatcher(); // 自定义的Watcher实现
byte[] data = zooKeeper.getData(znodePath, watcher, stat);
  1. Watcher接口的实现:
  • 实现Watcher接口,并覆盖process方法,以定义监听事件发生时的处理逻辑。
  • 示例:
public class MyWatcher implements Watcher {
    @Override
    public void process(WatchedEvent event) {
        System.out.println("Event type: " + event.getType());
        System.out.println("Znode path: " + event.getPath());
        // 处理事件的逻辑
    }
}
  1. 事件通知:
  • 当Znode发生变化时,注册的监听器将接收到通知,然后可以在process方法中执行相应的逻辑。
  • 事件类型包括NodeCreatedNodeDeletedNodeDataChanged等。
  1. 这样,通过监听器和事件通知机制,ZooKeeper客户端可以实时感知Znode的变化,从而在分布式环境中进行协同工作和协调操作。
相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
3月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
3月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
23天前
|
存储 运维 NoSQL
分布式读写锁的奥义:上古世代 ZooKeeper 的进击
本文作者将介绍女娲对社区 ZooKeeper 在分布式读写锁实践细节上的思考,希望帮助大家理解分布式读写锁背后的原理。
|
2月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
53 2
|
2月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
52 1
|
2月前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
52 0
|
3月前
|
Java
分布式-Zookeeper-分布式锁
分布式-Zookeeper-分布式锁
|
3月前
|
存储 负载均衡 Dubbo
分布式-Zookeeper(一)
分布式-Zookeeper(一)
|
5月前
|
监控 NoSQL Java
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
|
3月前
分布式-Zookeeper-数据订阅
分布式-Zookeeper-数据订阅
下一篇
DataWorks