当前位置: 首页 > news >正文

Zookeeper底层原理

ZooKeeper 是一个高可用的分布式协调服务,广泛应用于分布式系统中,用于解决分布式系统的一致性问题。下面将详细介绍 ZooKeeper 的底层原理,包括其架构、数据模型、核心机制和一致性协议等方面。

1. 架构

ZooKeeper 采用主从架构(Master-Slave),通常由一个 Leader 和若干个 Follower 组成,还有 Observer 节点作为非投票节点,用于分担读请求的压力。

  • Leader:负责处理所有写请求(事务请求)和协调一致性协议。
  • Follower:参与投票选举和同步 Leader 的状态,处理读请求。
  • Observer:不参与投票选举,仅处理客户端的读请求和转发写请求。

2. 数据模型

ZooKeeper 以类似文件系统的树形结构存储数据,每个节点称为 znode。

  • znode:数据节点,具有路径、数据和状态信息。
  • 持久节点(Persistent znode):节点在客户端断开后依然存在,除非被显式删除。
  • 临时节点(Ephemeral znode):节点在客户端断开连接时自动删除。
  • 顺序节点(Sequential znode):节点在创建时自动附加一个递增的序列号。

3. 核心机制

3.1. 会话管理

每个客户端与 ZooKeeper 集群之间建立一个会话,用于维持连接状态和管理临时节点。ZooKeeper 通过心跳机制检测客户端的连接状态,如果在一定时间内未收到心跳,认为会话断开。

3.2. 数据同步

为了保证各个节点的数据一致性,ZooKeeper 采用了数据同步机制。Leader 节点在处理写请求时,会将变更操作发送给所有 Follower 节点,Follower 节点在接受变更操作后进行确认,最终由 Leader 节点决定变更操作是否成功。

3.3. 通知机制

ZooKeeper 支持 Watch 机制,客户端可以在指定的 znode 上注册 Watch,当该 znode 的数据或子节点发生变更时,ZooKeeper 会通知客户端。

4. 一致性协议

ZooKeeper 使用一种称为 ZAB(Zookeeper Atomic Broadcast)的一致性协议来保证数据的一致性。ZAB 包括两个阶段:选举阶段和广播阶段。

4.1. 选举阶段

当 ZooKeeper 集群启动时,或 Leader 节点故障时,需要进行选举以确定新的 Leader。选举阶段主要分为以下几步:

  1. 投票:所有节点都投票给自己,并将投票发送给其他节点。
  2. 接收投票:各节点接收到其他节点的投票,并统计投票结果。
  3. 更新投票:如果接收到的投票中有票数比自己高的候选人,则更新投票给该候选人。
  4. 确定 Leader:当某个候选人获得超过半数以上的投票时,成为新的 Leader。
4.2. 广播阶段

在 Leader 确定后,进入广播阶段,Leader 负责处理客户端的写请求,并将变更操作广播给所有 Follower 节点。具体步骤如下:

  1. 提案:Leader 接收到写请求后,生成一个提案,并将提案发送给所有 Follower 节点。
  2. 确认:Follower 节点接收到提案后,进行日志记录,并向 Leader 发送确认消息。
  3. 提交:Leader 节点接收到超过半数以上的确认消息后,提交该提案,并将提交结果通知所有 Follower 节点。
  4. 应用变更:Follower 节点接收到提交通知后,应用变更操作。

5. 示例代码

下面是使用 ZooKeeper 的一个简单示例,展示如何创建节点、读取节点数据和注册 Watch。

5.1. 引入依赖

pom.xml 中引入 ZooKeeper 客户端依赖。

 

xml复制代码

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

5.2. 创建节点和读取数据
 

java复制代码

import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.ZooDefs; import org.apache.zookeeper.KeeperException; import java.io.IOException; public class ZookeeperExample { private static final String ZK_ADDRESS = "localhost:2181"; private static final int SESSION_TIMEOUT = 3000; public static void main(String[] args) throws IOException, KeeperException, InterruptedException { // 创建 ZooKeeper 客户端 ZooKeeper zk = new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT, new Watcher() { @Override public void process(WatchedEvent event) { System.out.println("Event: " + event.getType()); } }); // 创建节点 String path = "/example"; byte[] data = "Hello ZooKeeper".getBytes(); if (zk.exists(path, false) == null) { zk.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } // 读取节点数据 byte[] retrievedData = zk.getData(path, false, null); System.out.println("Data: " + new String(retrievedData)); // 注册 Watch zk.getData(path, new Watcher() { @Override public void process(WatchedEvent event) { System.out.println("WatchedEvent: " + event.getType()); } }, null); // 修改节点数据,触发 Watch zk.setData(path, "New Data".getBytes(), -1); // 关闭 ZooKeeper 客户端 zk.close(); } }

总结

ZooKeeper 作为一个分布式协调服务,通过其主从架构、树形数据模型、会话管理、数据同步、通知机制和 ZAB 一致性协议,提供了高可用和一致性的分布式协调服务。理解 ZooKeeper 的底层原理和实现,有助于更好地应用它来解决分布式系统中的一致性问题。

http://www.lryc.cn/news/391651.html

相关文章:

  • Spring Boot 事件监听机制实战【自定义 Spring Boot 事件监听】
  • AIGC笔记--Stable Diffusion源码剖析之DDIM
  • 【BUUCTF-PWN】13-jarvisoj_level2_x64
  • 项目实战--Spring Boot 3整合Flink实现大数据文件处理
  • 开发者工具攻略:前端测试的极简指南
  • git保存分支工作状态
  • 系统架构设计师——计算机体系结构
  • 3D鸡哥又上开源项目!单图即可生成,在线可玩
  • 设计模式实现思路介绍
  • Node.js学习教程
  • 项目页面优化,我们该怎么做呢?
  • 【PCIe】P2P DMA
  • Linux shell编程学习笔记62: top命令 linux下的任务管理器
  • 如何在Java中实现高性能的网络通信
  • 政务单位网站SSL证书选择策略
  • 零基础入门 Ai 数据挖掘竞赛-速通 Baseline-1
  • 第二十六章 生成器(generator)(Python)
  • Vue通过Key管理状态
  • 鸿蒙 HarmonyOs 网络请求 快速入门
  • Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)
  • 如何使用Pip生成requirements.txt文件:全面指南与实践示例
  • 微信小程序消息通知(一次订阅)
  • 电传动无杆飞机牵引车交付用户
  • react框架,使用vite和nextjs构建react项目
  • Games101学习笔记 Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing)
  • 数据结构概念
  • Windows 下载安装ffmpeg
  • Java AI 编程助手
  • day10:01集合
  • 03浅谈提示工程、RAG和微调