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.xdnf.cn/news/1488271.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据分析或处理中关于坐标系的一些事

通过对本文的阅读&#xff0c;你将获取坐标系的一些基础知识&#xff0c;以及学会如何使用pyproj实现地理数据的投影与转换。更重要的是&#xff0c;作为一个开发者&#xff0c;面对地理坐标系的图层数据&#xff0c;需要进行面积计算、距离量测、规则分块等需求时&#xff0c;…

海山数据库(He3DB)源码解读:海山PG 死锁处理实现

目录 背景 整体概述 数据结构 死锁处理设计 设计原理 主要流程 主要接口 作者介绍 背景 He3DB for PostgreSQL是受Aurora论文启发&#xff0c;基于开源数据库PostgreSQL 改造的数据库产品。架构上实现计算存储分离&#xff0c;并进一步支持数据的冷热分层&#xff0c;大幅…

音视频开发之旅(85)- 图像分类-VGG模型解析

目录 1. VGG解决的问题 2. 网络结构和参数 3. pytorch搭建vgg 4.flower_photos分类任务实践 5.资料 一、VGG解决的问题 论文链接&#xff1a;https://arxiv.org/pdf/1409.1556 在VGG之前&#xff0c;大多数深度学习模型相对较浅&#xff0c;比如下面的AlexNet(5层卷积和3…

网络服务与应用

一、 文件传输 FTP 1、FTP采用典型的C/S架构&#xff08;即服务器端和客户端模型&#xff09;&#xff0c;客户端与服务器端建立TCP连接之后即可实现文件的上传、下载。 2、FTP传输过程 1&#xff09;、主动模式&#xff08;POST&#xff09;&#xff1a;入站连接 2&#x…

微服务实践和总结

H5原生组件web Component Web Component 是一种用于构建可复用用户界面组件的技术&#xff0c;开发者可以创建自定义的 HTML 标签&#xff0c;并将其封装为包含逻辑和样式的独立组件&#xff0c;从而在任何 Web 应用中重复使用。 <!DOCTYPE html> <html><head…

企业利用AI智能名片S2B2C商城小程序参与社区团购的风险与机遇分析

摘要 在新零售浪潮的推动下&#xff0c;社区团购以其独特的商业模式迅速崛起&#xff0c;成为连接消费者与供应商的重要桥梁。企业纷纷探索如何有效利用这一新兴渠道&#xff0c;以扩大市场份额、提升品牌影响力。AI智能名片S2B2C商城小程序的引入&#xff0c;为企业参与社区团…

AWS Route 53:一站式域名注册与DNS管理解决方案

在构建网络应用时&#xff0c;域名注册是不可或缺的一步。作为全球领先的云服务提供商&#xff0c;Amazon Web Services (AWS) 不仅提供强大的云计算资源&#xff0c;还通过其服务 Route 53 提供域名注册功能。本文中九河云将详细介绍 AWS 的域名注册服务&#xff0c;以及它如何…

视频生成AI工具——PixVerse V2 登场:支持一键生成5段、最长 40S 连续视频!

就在昨天&#xff0c;光源伙伴 「 爱诗科技 」正式发布其视频生成产品 PixVerse V2 , 并全球同步开放&#xff0c;更低门槛&#xff0c;更高质量&#xff0c;更有逻辑&#xff0c;更长时长&#xff0c;这几个“更”&#xff0c;让这款产品受到了超高关注&#xff0c;今天带大家…

PHP基础语法-Part1

脚本格式 PHP脚本以<?php开头&#xff0c;以?>结尾&#xff1b; PHP语句以分号结尾&#xff08;;&#xff09; PHP是解释型语言&#xff1b; 输入和输出 获取用户的输入&#xff1a; $input readline("input:"); echo $input; echo "input:";…

自定义 RAG 工作流:在 IDE 中结合 RAG 编排,构建可信的编码智能体

构建编码智能体并非一件容易的事。结合我们在 AutoDev、ArchGuard Co-mate、ChocoBuilder 等智能体项目的经验&#xff0c;我们开始思考在 Shire 语言中提供一种新的 RAG 工作流。结合我们先前构建的 IDE 基础设施&#xff08;代码生成、代码校验、代码执行等接口&#xff09;&…

前端学习7续

通过上一节Echarts图的学习&#xff0c;为此做了一个简单的案例来巩固一下前端学习的知识。 最终要完成成果展示 具体代码以及注释详解我已经打包 由于文章限制&#xff0c;无法上传压缩包&#xff0c;放一部分具体代码&#xff0c;当然如果有需要压缩包可以DM&#xff0c;同时…

【第二天】计算机网络 HTTP请求报文和响应报文是什么样的 HTTP请求方式有哪些 GET请求和POST请求的区别

HTTP请求报文和响应报文是什么样的&#xff1f; 我去&#xff0c;以前都没怎么研究过这个。 客户端发送一个请求给服务器&#xff0c;服务器根据请求报文中的信息进行处理&#xff0c;并将处理结果放到响应报文中返回给客户端。 URL HTTP使用URL (Uniform Resource Locator&…

《华为数据之道》读书笔记六---面向自助消费的数据服务建设

七、从结果管理到过程管理&#xff0c; 从能“看”到能“管” 1、数据赋能业务运营 数字化运营旨在利用数字化技术获取、管理和分析数据&#xff0c;从而为企业的战略决策与业务运营提供可量化的、科学的支撑。 数字化运营归根结底是运营&#xff0c;旨在推动运营效率与能力的…

【iOS】——Block底层实现和捕获机制

Block的实质 Block的定义是带有自动变量的匿名函数&#xff0c;下面从源码的角度探究下Block究竟是什么 下面是一个Block的简单实现&#xff1a; int main(int argc, const char * argv[]) {autoreleasepool {// insert code here...void (^blk)(void) ^{printf("Bloc…

Linux 14:网络编程2

1. 应用层 我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在应用层。 1-1. 协议 协议是一种 "约定"。socket api的接口&#xff0c;在读写数据时&#xff0c;都是按 "字符串" 的方式来发送接收的&#xff…

【系统架构设计师】十八、信息系统架构设计理论与实践②

目录 四、企业信息系统的总体框架 4.1 战略系统 4.2 业务系统 4.3 应用系统 4.4 企业信息基础设施 4.5 业务流程重组BPR 4.6 业务流程管理BPM 五、信息系统架构设计方法 5.1 行业标准的体系架构框架 5.2 架构开发方法 5.3 信息化总体架构方法 5.4 信息化建设生命周…

AnyMP4 Data Recovery for Mac v1.5.8免激活版:高效数据恢复新选择

AnyMP4 Data Recovery for Mac是一款专为Mac用户设计的高效数据恢复软件&#xff0c;凭借其强大的功能和简洁的操作界面&#xff0c;为用户提供了快速、安全的数据恢复体验。 该软件支持恢复多种文件类型&#xff0c;包括照片、视频、音频、文档等&#xff0c;无论是常见的图片…

旅游城市晚高峰延长2小时见证消费新活力 啤酒节滴滴打车需求上涨超300%

进入盛夏&#xff0c;各地夜生活“花式上新”&#xff0c;夜间出行链接夜食、夜游、夜购等多元消费业态&#xff0c;激发经济活力。滴滴出行数据显示&#xff0c;7月以来&#xff0c;哈尔滨、珠海、贵阳、西安等多个城市打车晚高峰延长2小时以上。 22点后打车需求上涨最高 “夜…

Java连接Redis和SpringBoot整合Redis

1. Java连接Redis 思考&#xff1a;我们之前操作redis都是通过命令行的客户端来操作。在开发时都是通过java项目操作redis java提高连接redis的方式为jedis。我们需要遵循jedis协议。 java提供连接mysql的方式为jdbc。 1.1 单机模式 引入依赖 <!--引入java连接redis的驱动…

获取手机当前信号强度(dbm/asu值)解决 getGsmSignalStrength()总是返回99问题

能看到这篇文章说明网上哪些获取 &#xff08;dbm/asu值&#xff09;不适合你&#xff0c;不是他们的代码不正确&#xff0c;而是不符合你的情况 比如安卓6获取android手机信号强度 可以看这篇文章 https://blog.csdn.net/sinat_31057219/article/details/81134030 当然如果你…