当前位置: 首页 > 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 的底层原理和实现,有助于更好地应用它来解决分布式系统中的一致性问题。

相关文章:

Zookeeper底层原理

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

Spring Boot 事件监听机制实战【自定义 Spring Boot 事件监听】

前言&#xff1a; 上一篇我们分析了 Spring Boot 事件监听的原理&#xff0c;本篇我们来自定义实现自己的监听器。 Spring Boot 系列文章传送门 Spring Boot 启动流程源码分析&#xff08;2&#xff09; Spring Boot 启动流程源码分析&#xff08;2&#xff09; Spring Bo…...

AIGC笔记--Stable Diffusion源码剖析之DDIM

1--前言 以论文《High-Resolution Image Synthesis with Latent Diffusion Models》 开源的项目为例&#xff0c;剖析Stable Diffusion经典组成部分&#xff0c;巩固学习加深印象。 2--DDIM 一个可以debug的小demo&#xff1a;SD_DDIM 以文生图为例&#xff0c;剖析SD中DDIM的…...

【BUUCTF-PWN】13-jarvisoj_level2_x64

参考&#xff1a;BUU pwn jarvisoj_level2_x64 64位函数调用栈 - Nemuzuki - 博客园 (cnblogs.com) 64位&#xff0c;开启了NX保护 执行效果如下&#xff1a; main函数&#xff1a; vulnerable_function函数 read函数存在栈溢出&#xff0c;溢出距离为0x808 查找后门…...

项目实战--Spring Boot 3整合Flink实现大数据文件处理

一、应用背景 公司大数据项目中&#xff0c;需要构建和开发高效、可靠的数据处理子系统&#xff0c;实现大数据文件处理、整库迁移、延迟与乱序处理、数据清洗与过滤、实时数据聚合、增量同步&#xff08;CDC&#xff09;、状态管理与恢复、反压问题处理、数据分库分表、跨数据…...

开发者工具攻略:前端测试的极简指南

前言 许多人存在一个常见的误区&#xff0c;认为测试只是测试工程师的工作。实际上&#xff0c;测试是整个开发团队的责任&#xff0c;每个人都应该参与到测试过程中。 在这篇博客我尽量通俗一点地讲讲我们前端开发过程中&#xff0c;该如何去测试 浏览器开发者工具简介 开…...

git保存分支工作状态

git stash...

系统架构设计师——计算机体系结构

分值占比3-4分 计算机硬件组成 计算机硬件组成主要包括主机、存储器和输入/输出设备。 主机&#xff1a;主机是计算机的核心部分&#xff0c;包括运算器、控制器、主存等组件。运算器负责执行算术和逻辑运算&#xff1b;控制器负责协调和控制计算机的各个部件&#xff1b;主存…...

3D鸡哥又上开源项目!单图即可生成,在线可玩

大家好&#xff0c;今天和大家分享几篇最新的工作 1、Unique3D Unique3D从单视图图像高效生成高质量3D网格&#xff0c;具有SOTA水平的保真度和强大的通用性。 如下图所示 Unique3D 在 30 秒内从单视图野生图像生成高保真且多样化的纹理网格。 例如属于一张鸡哥的打球写真照 等…...

设计模式实现思路介绍

设计模式是在软件工程中用于解决特定问题的典型解决方案。它们是在多年的软件开发实践中总结出来的&#xff0c;并且因其重用性、通用性和高效性而被广泛接受。设计模式通常被分为三种主要类型&#xff1a;创建型、结构型和行为型。 创建型设计模式 创建型设计模式专注于如何创…...

Node.js学习教程

Node.js学习教程可以从基础到高级&#xff0c;逐步深入理解和掌握这一强大的JavaScript运行环境。以下是一个详细的Node.js学习教程概述&#xff0c;帮助初学者和进阶者更好地学习Node.js。 一、Node.js基础入门 1. 了解Node.js 定义&#xff1a;Node.js是一个基于Chrome V8…...

项目页面优化,我们该怎么做呢?

避免页面卡顿 怎么衡量页面卡顿的情况呢&#xff1f; 失帧和帧率FPS 60Hz就是帧率fps&#xff0c;即一秒钟60帧&#xff0c;换句话说&#xff0c;一秒钟的动画是由60幅静态图片连在一起形成的。 卡了&#xff0c;失帧了&#xff0c;或者掉帧了&#xff0c;一秒钟没有60个画面&…...

【PCIe】P2P DMA

PCIe P2P (peer-to-peer communication)是PCIe的一种特性&#xff0c;它使两个PCIe设备之间可以直接传输数据&#xff0c;而不需要使用主机RAM作为临时存储。如下图3的走向 比如EP1要发送和数据给EP2,操作流程如下&#xff1a; 1. 打开EP1的dma控制器&#xff1b;--client侧 …...

Linux shell编程学习笔记62: top命令 linux下的任务管理器

0 前言 top命令是Unix 和 Linux下常用的性能分析工具&#xff0c;提供了一个动态的、交互式的实时视图&#xff0c;显示系统的整体性能信息&#xff0c;以及正在运行的进程的相关信息&#xff0c;包括各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。 1 top命令…...

如何在Java中实现高性能的网络通信

如何在Java中实现高性能的网络通信 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 在当今互联网时代&#xff0c;高性能的网络通信是构建大规模分布…...

政务单位网站SSL证书选择策略

在数字化快速发展的今天&#xff0c;政务单位网站作为政府与公众沟通的重要桥梁&#xff0c;其安全性和可信度显得尤为重要。SSL证书作为保障网站安全的重要手段&#xff0c;其选择对于政务单位网站来说至关重要。本文将探讨政务单位网站在选择SSL证书时应该考虑的因素&#xf…...

零基础入门 Ai 数据挖掘竞赛-速通 Baseline-1

#AI夏令营 #Datawhale #夏令营 本项目为Datawhale 2024 年 AI 夏令营赛事&#xff0c;零基础入门 AI 数据挖掘竞赛-速通学习手册配套的代码项目。 项目链接&#xff1a;https://aistudio.baidu.com/bd-cpu-02/user/2961857/8113198/home#codelab 任务目标 根据给的test&…...

第二十六章 生成器(generator)(Python)

文章目录 前言一、生成器函数 前言 在 Python 中&#xff0c;使用了 yield 的函数被称为生成器&#xff08;generator&#xff09; yield 是一个关键字&#xff0c;用于定义生成器函数&#xff0c;生成器函数是一种特殊的函数&#xff0c;可以在迭代过程中逐步产生值&#xff…...

Vue通过Key管理状态

Vue通过Key管理状态 Vue 默认按照“就地更新”的策略来更新&#xff0c;通过 v-for 渲染的元素列表。当数据项的顺序改变时&#xff0c;Vue 不会随之移动 DOM 元素的顺序&#xff0c;而是就地更新每个元素&#xff0c;确保它们在原本指定的索引位置上渲染。为了给 Vue 一个提示…...

鸿蒙 HarmonyOs 网络请求 快速入门

官方文档&#xff1a; ArkUI简介-ArkUI&#xff08;方舟UI框架&#xff09;-应用框架 | 华为开发者联盟 (huawei.com) 一、通过原有的http组件进行网络请求&#xff08;方式一&#xff09; 1.1 HttpRequestOptions的操作 名称类型描述methodRequestMethod请求方式&#xff…...

实战应用:基于快马AI与OpenClaw构建Mac本地电商价格监控系统

最近在做一个电商价格监控的小工具&#xff0c;发现用OpenClaw配合Mac本地环境搭建特别方便。这里分享一下我的实战经验&#xff0c;希望能帮到有类似需求的同学。 为什么选择OpenClaw OpenClaw是个轻量级的Python爬虫框架&#xff0c;特别适合需要快速搭建数据采集系统的场景…...

ResNet50人脸重建作品集:cv_resnet50_face-reconstruction在艺术创作中的人脸风格迁移底图生成

ResNet50人脸重建作品集&#xff1a;cv_resnet50_face-reconstruction在艺术创作中的人脸风格迁移底图生成 1. 项目介绍与核心价值 cv_resnet50_face-reconstruction 是一个基于ResNet50架构的人脸重建项目&#xff0c;专门为艺术创作和设计工作提供高质量的人脸底图生成服务…...

TTI-Chicago等机构突破性研究:AI学会了一笔一划创作矢量草图

这项由芝加哥丰田技术研究院&#xff08;TTI-Chicago&#xff09;、芝加哥大学和麻省理工学院联合开展的研究发表于2026年&#xff0c;论文编号为arXiv:2603.19500v1。有兴趣深入了解技术细节的读者可以通过该编号查询完整论文。当我们看到一位画家创作时&#xff0c;他们通常不…...

Ostrakon-VL终端实战:从扫码识别到生成抖音短视频脚本的创意延伸

Ostrakon-VL终端实战&#xff1a;从扫码识别到生成抖音短视频脚本的创意延伸 1. 像素特工终端介绍 想象你是一名零售侦探&#xff0c;手持的不是笨重的扫描枪&#xff0c;而是一个充满复古游戏风格的AI终端。这就是基于Ostrakon-VL-8B模型开发的像素风格交互界面&#xff0c;…...

Easypoi导出Excel时,如何优雅地处理‘未知’或‘空值’?一个replace动态替换的实战技巧

Easypoi动态替换Excel导出中的未知值与空值&#xff1a;实战技巧与最佳实践 在数据导出场景中&#xff0c;我们经常遇到数据库枚举值与Excel展示不匹配的问题。比如性别字段&#xff0c;除了标准的"男"、"女"外&#xff0c;还可能存在空值或超出预设范围的…...

【ArkTS】基础语法

一、ArkTS 语言简介 ArkTS 是一种设计用于构建高性能应用的编程语言。它在继承 TypeScript 语法的基础上进行了优化,以提供更高的性能和开发效率。 许多编程语言在设计之初未考虑移动设备,导致应用运行缓慢、低效且功耗大。随着移动设备在日常生活中越来越普遍,针对移动环境…...

FreeRTOS数据通信避坑指南:为什么我的MessageBuffer总是接收失败?

FreeRTOS消息缓冲区实战&#xff1a;从接收失败到高效通信的深度解析 第一次在FreeRTOS项目中使用MessageBuffer时&#xff0c;我遇到了一个令人抓狂的问题——明明发送端显示消息已成功写入&#xff0c;接收端却总是返回0字节。调试器显示缓冲区非空&#xff0c;但xMessageBuf…...

从零搭建无人船:两年实战后,我总结的ArduPilot+Pixhawk避坑全流程

从零搭建无人船&#xff1a;两年实战后&#xff0c;我总结的ArduPilotPixhawk避坑全流程 第一次把无人船放进水里时&#xff0c;GPS信号突然丢失&#xff0c;船体在河中央失控打转——这个惊心动魄的瞬间让我意识到&#xff0c;开源飞控的实战应用远不是下载代码、连接硬件那么…...

告别编码等待:LosslessCut的无损视频处理革命

告别编码等待&#xff1a;LosslessCut的无损视频处理革命 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 副标题&#xff1a;掌握零质量损失剪辑、多轨道精细控制与批…...

阿里千问,有个海外版

阿里千问&#xff0c;有个海外版。我也是最近才知道&#xff0c;用了一下&#xff0c;发现审核尺度明显要宽松很多&#xff0c;国内的千问明显被约束很多&#xff0c;就是个半残品。据说啊&#xff0c;国际版千问的部分数据放在了新加坡&#xff0c;对标的是ChatGPT。好像现在阿…...