Zookeeper入门篇,了解ZK存储特点

Zookeeper入门篇,了解ZK存储特点

  • 前言
  • 一、为什么要用 Zookeeper?
  • 二、Zookeeper存储特色
    • 1. 树状结构
    • 2. 节点类型
  • 三、存储位置
    • 1. 内存存储
      • 1. DataTree
      • 2. DataNode
    • 2. 硬盘存储
      • 1. 事务日志
      • 2. 快照


前言

在这里插入图片描述

继上次说完 Zookeeper 的安装后,已经过去半年多了,一直没有后续,本次得空就更新一下入门篇,给同学们介绍一下 Zookeeper ,并着重说一下其存储原理

📕作者简介:战斧,从事金融IT行业,有着多年一线开发、架构经验;爱好广泛,乐于分享,致力于创作更多高质量内容
📗本文收录于 Zookeeper 专栏,有需要者,可直接订阅专栏实时获取更新
📘高质量专栏 云原生、RabbitMQ、Spring全家桶 等仍在更新,欢迎指导
📙 mysql Redis dubbo docker netty等诸多框架,以及架构与分布式专题即将上线,敬请期待


一、为什么要用 Zookeeper?

我们先看 Zookeeper 官方自己的定义

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them, which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.
ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步、提供组服务。分布式应用程序以某种形式使用所有这些类型的服务。每次实现它们时,都有大量的工作要做,以修复不可避免的错误和竞争条件。由于实现这类服务的困难,应用程序最初通常会忽略它们,这使得它们在出现变化时变得脆弱,并且难以管理。即使正确地完成了这些服务,在部署应用程序时,这些服务的不同实现也会导致管理复杂性。

说人话,就是人如其名,ZooKeeper 就是动物园管理者,而各个组件和应用则是动物园里的动物。我们每引入一个组件,就可以把组件的配置信息,以及组件提供的服务信息等内容存储在ZK里。

如果仅仅是保存信息,那么很多组件都有这个能力,凭什么要有这么个ZooKepper?主要是ZooKepper有一些特性比较好用,比如:高可用高性能一致性

当然最实用的肯定是其提供了 监听与心跳 的功能:心跳可以用来检测节点的存活状态。节点在启动时会向ZK服务器发送心跳消息,如果一段时间内没有收到节点的心跳消息,ZK服务器会认为该节点不可用,而监听则可以让应用程序在ZK节点发生变化时收到通知,当节点发生变化(如节点创建、删除、数据变更)时,ZK会将变化事件通知到注册的监听器上。这样,应用程序可以及时响应节点变化,进行相应的处理。

二、Zookeeper存储特色

1. 树状结构

首先,让我们了解 Zookeeper 存储的基本原理。Zookeeper 使用一种层次化的命名空间进行数据存储,类似于一个树形结构。每个节点都是一个 znode,可以包含数据和子节点。Zookeeper 的数据存储是基于内存的,这意味着可以快速访问和更新数据。同时,Zookeeper 还使用了一种类似于文件系统的节点路径来唯一标识每个 znode,可以方便地对数据进行读写和查询,如下:

在这里插入图片描述

2. 节点类型

上面我们说了,ZK是以树状节点的样式来管理存储信息的。同时ZK也提供了四种节点类型:

  1. 持久节点(Persistent Node):创建后将一直存在,直到主动删除。当客户端与ZK断开连接后,持久节点的数据依然保留。

  2. 临时节点(Ephemeral Node):只在创建它的客户端与ZK保持连接期间存在,一旦客户端断开连接,临时节点将被自动删除。

  3. 持久顺序节点(Persistent Sequential Node):创建后将一直存在,直到主动删除。与持久节点类似,但ZK会为每个创建的节点自动分配一个递增的序列号。

  4. 临时顺序节点(Ephemeral Sequential Node):只在创建它的客户端与ZK保持连接期间存在,一旦客户端断开连接,临时节点将被自动删除。与临时节点类似,但ZK会为每个创建的节点自动分配一个递增的序列号。
    Zooke

说是四种节点,其实主要是两个属性:① 是否临时、② 是否排序。这种设计使得我们在很多场景都能利用上ZK。

比如临时节点通常用于表示临时的状态信息、临时的工作单元等。当一个临时节点的客户端与ZooKeeper会话断开连接时,该节点的信息就能被自动删除

排序节点就是节点路径后会由ZK附加一个自增的序列号,当大家都想创建同一个节点时,就能利用这个序号进行排序了,利用这种性质,能做成分布式锁。

三、存储位置

因为ZK需要快速读取和处理各种状态信息,并且需要提供低延迟的响应,所以 ZK的数据是存储在内存中的。然而,虽然数据存储在内存中,ZK也会将数据持久化到硬盘上,以确保数据的持久性和可靠性,所以我们说ZK同时有内存存储硬盘存储

1. 内存存储

ZK的数据在内存中,其结构主要依赖两个类,一个是节点类 DataNode,一个是树结构类DataTree。

1. DataTree

DataTree 维护两个并行的数据结构:一个从完整路径映射到datanode的散列表和一个由datanode组成的树。所有对路径的访问都要通过哈希表。只有在序列化到磁盘时才遍历树

在这里插入图片描述
这种双结构的存储方式,redis中也是一样的。这样会让我们在查询单个节点的时候,走的是 HashMap,时间复杂度为O(1),所以非常快。

2. DataNode

而所谓树状结构是怎么建立起来的呢?我们看一下 DataNode 的定义其实就清楚了,它其实是靠一个Set集合维护着子节点的。这样

public class DataNode {/** the data for this datanode */byte[] data;/*** 该节点的子节点列表。注意,子字符串列表不包含父路径——只包含路径的最后一部分。* 对于该集合的变动和查询都必须要使用 synchronized ,除了反序列化(为了加速问题)之外。*/private Set<String> children = null;
}

得益于这样节点内 synchronized 的设计,使得我们在某个节点下增、减、查子节点时,都要先获取同步锁。这是ZK能作为分布式锁给其他组件使用的重要基础

2. 硬盘存储

除了内存用来存储数据外,ZK还具有硬盘存储的机制,这种落盘机制的作用是确保ZK的数据在服务器故障或重启后能够重新加载并保持一致性

1. 事务日志

ZK的事务日志是指将每个写操作都记录在一个磁盘上的事务日志文件中。当客户端请求对ZK进行写操作时,ZK首先将该操作追加到日志文件中,然后向客户端返回成功响应。日志文件是顺序写入的,这样可以提高写入的效率。通过记录每个写操作,ZK可以保证它的数据是具有顺序一致性的。这份文件的主要格式,我们能在源码的 FileTxnLog 类中看到

FileTxnLog 类实现了TxnLog接口。它提供api来访问txnlogs并向其中添加条目。事务日志文件的格式如下由三部分构成:
// 文件头     事务列表    文件末尾的填充0
FileHeader    TxnList      ZeroPad// 文件头构成:
FileHeader: {
magic 4bytes (ZKLG)
version 4字节
dbid 8个字节
}// 事务列表由一个或多个事务记录构成
TxnList:
Txn || Txn TxnList// 事务记录构成:
checksum Txnlen TxnHeader Record 0x42checksum: 8字节,使用的Adler32算法的校验和
Txnlen: 4字节TxnHeader: {
sessionid 8个字节
cxid 4字节
zxid 8个字节
time 8个字节
type 4个字节
}

关于事务这部分的详细情况,我们会在后面讲ZK集群的一致性时着重说明,现在我们只要知道ZK有事务日志功能即可

2. 快照

除了事务日志,ZK还使用快照来进行数据的持久化。快照是指ZK的内存数据结构在某个时刻的一份副本。ZK定期将内存中的数据转存到磁盘上,形成一个快照文件。快照文件是一个压缩文件,包含了ZK服务器的所有数据

// SyncRequestProcessor.java代码步骤解释: 
1. 获取当前日志数量  logCount  和日志大小  logSize 。 
2. 判断条件:如果日志数量大于(快照计数设定值 snapCount  的一半加上随机数  randRoll ),或者如果快照大小( snapSizeInBytes )大于0且日志大小大于(快照大小设定值 的一半加上随机大小  randSize )
private boolean shouldSnapshot() {int logCount = zks.getZKDatabase().getTxnCount();long logSize = zks.getZKDatabase().getTxnSize();return (logCount > (snapCount / 2 + randRoll))|| (snapSizeInBytes > 0 && logSize > (snapSizeInBytes / 2 + randSize));
}

通过事务日志的方式,ZK可以在发生故障时,通过回放日志文件来恢复数据。而通过快照文件,可以加快数据恢复的速度。因此,落盘机制是非常重要的,它保证了ZK的数据的持久性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/49143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV图像滤波(2)均值平滑处理函数blur()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在OpenCV中&#xff0c;blur()函数用于对图像应用简单的均值模糊&#xff08;mean blur&#xff09;。这种模糊效果可以通过将图像中的每个像素替…

C++知识点:类和对象(自用)

类和对象 1. 类和对象的关系2. 对象指针3. 在堆上创建对象4. 成员访问限定符5. 名字编码&#xff08;Name Mangling&#xff09;6.构造函数7.构造函数的重载8.初始化列表8. 成员变量初始化的顺序&#xff08;通过初始化列表&#xff09;9. 初始化 const 成员变量10. 析构函数11…

MySQL窗口函数详解

MySQL窗口函数详解 MySQL从8.0版本开始引入了窗口函数&#xff0c;这是一个强大的特性&#xff0c;可以大大简化复杂的数据分析任务。本文将详细介绍MySQL窗口函数的概念、语法和常见用法&#xff0c;并结合实际应用场景进行说明。 什么是窗口函数? 窗口函数是一种能够对结…

UE5+OpenCV配置(Windows11系统)

一、概述 因为需要在UE5中使用OpenCV这些工具进行配置&#xff0c;所以在网络上参考借鉴一些资料进行配置。查询到不少的资料&#xff0c;最后将其配置成功。在这里顺便记录一下自己的配置成功的过程。 二、具体过程 &#xff08;一&#xff09;版本 使用Windows11系统、UE5.…

CSS(九)——CSS 轮廓(outline)

CSS 轮廓&#xff08;outline&#xff09; 轮廓&#xff08;outline&#xff09;是绘制于元素周围的一条线&#xff0c;位于边框边缘的外围&#xff0c;可起到突出元素的作用。 轮廓&#xff08;outline&#xff09;属性指定元素轮廓的样式、颜色和宽度。 让我们用一个图来看…

基于Java中的SSM框架实现高校心理评测与分析系统项目【项目源码+论文说明】

基于Java中的SSM框架实现高校心理评测与分析系统演示 摘要 为了让学校和教师方面更好的深入了解学生的心理&#xff0c;有助于加强学生心理建设。该系统使用Java语言开发&#xff0c;系统架构采用SSM技术来实现功能性开发&#xff0c;MySQL数据库存放数据&#xff0c;实现了进…

springAOP理解及事务

AOP&#xff1a; springAOP是什么&#xff1a; AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实就是面向特定方法编程。 使用场景&#xff1a; 比如你想统计业务中每个方法的执行耗时&#xff0c;那我们最…

git cherry-pick用法

git cherry-pick 如何将我另一个分支上的某个提交合并到新的分支上 首先切换到新分支上git cherry-pick <commit_hash>例如&#xff1a;git cherry-pick f8a70c9

python实现接缝雕刻算法

python实现接缝雕刻算法 接缝雕刻算法步骤详解Python实现详细解释优缺点应用领域接缝雕刻算法(Seam Carving Algorithm)是一种内容感知的图像缩放技术,可以智能地改变图像的尺寸,而不会明显影响其重要内容。它通过动态规划的方式寻找图像中的“接缝”,即在图像中从上到下或…

jenkins自动化持续集成

一、持续集成优势 1.1 解放重复劳动 一次设置&#xff0c;多次复用。持续集成任务可以解放集成、测试、部署等重复性劳动&#xff0c;通过自动化任务能够显著提升集成频率。 1.2 更快解决问题 接入持续集成任务后&#xff0c;能够更早地感知变更后效果&#xff0c;及时进入…

pytest结合allure-pytest插件生成测试报告

目录 一、安装allure-pytest插件 二、下载allure 三、生成allure报告 四、效果展示 一、安装allure-pytest插件 二、下载allure 下载之后解压&#xff0c;解压之后还要配置环境变量&#xff08;把allure目录下bin目录配置到系统变量的path路径&#xff09;&#xff0c;下…

mysql语法介绍

MySQL 语法主要基于 SQL&#xff08;Structured Query Language&#xff09;标准&#xff0c;用于管理和操作关系型数据库。以下是一些基本的 MySQL 语句&#xff1a; 1.创建数据库&#xff1a; CREATE DATABASE database_name; 1.选择数据库&#xff1a; USE database_name;…

WPF使用TouchSocket实现Tcp client

文章目录 前言1、页面展示2、主页面UI代码2、TCP client的UI代码3、Tcp client后台代码实现4、UI与后台代码的关联 前言 在该篇的Demo中&#xff0c;您可以找到以下内容&#xff1a; 1、TouchSocket的使用&#xff1b; 2、CommunityToolkit.Mvvm的使用&#xff1b; 3、AvalonD…

GPT-4o Mini:探索最具成本效益的小模型在软件开发中的应用

随着人工智能技术的迅猛发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域也取得了显著的进步。OpenAI 最新发布的 GPT-4o Mini 模型&#xff0c;以其卓越的性能和极具竞争力的价格&#xff0c;成为了广大开发者关注的焦点。作为一名长期关注人工智能及其在软件开发…

破局产品同质化:解锁3D交互式营销新纪元!

近年来&#xff0c;随着数字体验经济的蓬勃发展&#xff0c;3D交互式营销作为一种创新手段迅速崛起&#xff0c;它巧妙地解决了传统产品展示中普遍存在的缺乏差异性和互动性的问题&#xff0c;使您的产品在激烈的市场竞争中独树一帜&#xff0c;脱颖而出。 若您正面临产品营销…

【Python数据结构与算法】枚举----特殊密码锁

题目&#xff1a;特殊密码锁 描述 有一种特殊的二进制密码锁&#xff0c;由n个相连的按钮组成&#xff08;1<n<30&#xff09;&#xff0c;按钮有凹/凸两种状态&#xff0c;用手按按钮会改变其状态。 然而让人头疼的是&#xff0c;当你按一个按钮时&#xff0c;跟它相邻…

自定义协议(应用层协议)——网络版计算机基于TCP传输协议

应用层&#xff1a;自定义网络协议&#xff1a;序列化和反序列化&#xff0c;如果是TCP传输的&#xff1a;还要关心区分报文边界&#xff08;在序列化设计的时候设计好&#xff09;——粘包问题 1、首先想要使用TCP协议传输的网络&#xff0c;服务器和客户端都应该要创建自己…

无损放大图片工具

一、简介 1、Upscayl 是一款无损放大图片工具&#xff0c;支持CPU和GPU&#xff0c;扩图速度特别的快&#xff0c;而且效果特别的好。而且它有多种模型&#xff0c;比如说艺术动漫风格、真实风格、快速生成等等。最大支持16倍放大和亿级别像素&#xff0c;同时支持Windows、Mac…

Ruoyi-WMS本地运行

所需软件 1、JDK&#xff1a;8 安装包&#xff1a;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.htmlopen in new window 安装文档&#xff1a;https://cloud.tencent.com/developer/article/1698454open in new window 2、Redis 3.0 安装包&a…

Weakly Supervised Contrastive Learning 论文阅读

Abstract 无监督视觉表示学习因对比学习的最新成就而受到计算机视觉领域的广泛关注。现有的大多数对比学习框架采用实例区分作为预设任务&#xff0c;将每个实例视为一个不同的类。然而&#xff0c;这种方法不可避免地会导致类别冲突问题&#xff0c;从而损害所学习表示的质量…