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

news2024/11/14 15:01:15

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 0x42

checksum: 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.coloradmin.cn/o/1941077.html

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

相关文章

设计模式学习[2]---策略模式+简单工厂回顾

文章目录 前言1.简单工厂模式回顾2.策略模式3.策略模式简单工厂的结合总结 前言 上一篇讲到简单工厂模式。 在我的理解中工厂的存在就是&#xff0c;为了实例化对象。根据不同条件实例化不同的对象的作用。 这篇博客写的策略模式&#xff0c;可以说是把这个根据不同情况实例化…

pdf2docx - pdf 提取内容转 docx

文章目录 一、关于 pdf2docx主要功能限制 二、安装1、 PyPI2、从remote安装3、从源码安装4、卸载 三、转化 PDF例 1: convert all pages例 2: 转换指定页面例 3: multi-Processing例 4: 转换加密的pdf 四、提取表格五、命令行交互1、按页面范围2、按页码3、Multi-Processing 六…

使用Vue.js集成百度地图WebGL实现3D地图应用

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用Vue.js集成百度地图WebGL实现3D地图应用 应用场景介绍 本代码用于在Vue.js应用程序中集成百度地图WebGL&#xff0c;实现3D地图的可视化展示。它可以应用于各种场景&#xff0c;例如&#xff1a; 城市规…

助燃新质生产力,魔珐科技亮相IMC2024制造业数字科技大会展示有言AIGC视频工具价值

2024年7月19日&#xff0c;IMC2024第八届制造业数字科技大会在上海盛大开幕&#xff0c;本次大会以《向“智”而行》为主题&#xff0c;250智能制造行业数字化转型企业、行业领军者及实践者共聚一堂&#xff0c;共同助力企业增强技术“硬核力”&#xff0c;为新质生产力蓄势赋能…

【SpringBoot3】全局异常处理

【SpringBoot3】全局异常处理 一、全局异常处理器step1&#xff1a;创建收入数字的页面step2:创建控制器&#xff0c;计算两个整数相除step3:创建自定义异常处理器step5&#xff1a;创建给用提示的页面step6&#xff1a;测试输入&#xff08;10/0&#xff09; 二、BeanValidato…

TCP/IP网络模型详解

在计算机网络领域&#xff0c;网络模型通常指的是 OSI&#xff08;Open Systems Interconnection&#xff09;参考模型或 TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;模型。这些模型描述了网络中数据传输的层次结构&#xff0c;便于理解和…

ROS2从入门到精通2-3:详解机器人3D物理仿真Gazebo与案例分析

目录 0 专栏介绍1 什么是Gazebo?2 Gazebo架构2.1 Gazebo前后端2.2 Gazebo文件格式2.3 Gazebo环境变量3 Gazebo安装与基本界面4 搭建自己的地图4.1 编辑地图4.2 保存地图4.3 加载地图5 常见问题0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有…

【面试八股文】计算机操作系统

参考&#xff1a;大佬图解文章 → 小林coding 简介&#xff1a;之前在学习小林大佬的八股文时&#xff0c;摘录了一些个人认为比较重要的内容&#xff0c;方便后续自己复习。【持续更新ing ~&#x1f4af;】 注&#xff1a;加五角星标注的&#xff0c;是当前掌握不牢固的&…

WEB攻防-通用漏洞-SQL注入-MYSQL-union一般注入

前置知识 MySQL5.0以后存放一个默认数据库information_schemaschemata表存放该用户创建的所有库名&#xff0c;schemata. schema_name字段存放库名tables表存放该用户创建的所有库名和表明&#xff0c;tables.table_schema字段存放库名&#xff0c;tables.table_name存放表名co…

Elastic 及阿里云 AI 搜索 Tech Day 将于 7 月 27 日在上海举办

活动主题 面向开发者的 AI 搜索相关技术分享&#xff0c;如 RAG、多模态搜索、向量检索等。 活动介绍 参加 Elastic 原厂与阿里云联合举办的 Generative AI 技术交流分享日。借助 The Elastic Search AI Platform&#xff0c; 使用开放且灵活的企业解决方案&#xff0c;以前所…

基于YOLO8的目标检测系统:开启智能视觉识别之旅

文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 target_dec_app.py 二、核心代码介绍篇2.1 target_dec_app.py2.2 scan_taskflow.py 三、结语 在线体验 基于YOLO8的目标检测系统 基于opencv的摄像头…

Spring Cloud GateWay(4.1.4)

介绍 该项目提供了一个建立在 Spring 生态系统之上的 API 网关&#xff0c;包括&#xff1a;Spring 6、Spring Boot 3 和 Project Reactor。Spring Cloud Gateway 旨在提供一种简单而有效的方法来路由到 API&#xff0c;并为其提供跨领域关注点&#xff0c;例如&#xff1a;安…

华清数据结构day3 24-7-18

基于昨天代码增加增删改查功能 zy.h #ifndef ZY_H #define ZY_H #define MAX 100 //最大容量 //定义学生类型 struct Stu {char name[20];int age;double score; }; //定义班级类型 struct Class {struct Stu student[MAX]; //存放学生的容器int size; //实际…

【Git】(基础篇五)—— Git进阶

Git进阶 之前关于本地和远程仓库的各种操作都已经非常基础了&#xff0c;本文介绍git的一些进阶使用和设置 用户名和邮箱 之前介绍的每一次提交(commit) 都会产生一条日志(log) 信息&#xff0c;这条日志信息不仅会记录提交信息&#xff0c;还会记录执行提交操作的这个用户的…

【QAC】分布式部署下其他机器如何连接RLM

1、 文档目标 解决分布式部署下其他机器如何连接RLMLicense管理器。 2、 问题场景 分布式部署下QAC要在其他机器上单独运行扫描&#xff0c;必须先连接RLMLicense管理器&#xff0c;如何连接&#xff1f; 3、软硬件环境 1、软件版本&#xff1a;HelixQAC23.04 2、机器环境…

ClusterIP、NodePort、LoadBalancer 和 ExternalName

Service 定义 在 Kubernetes 中&#xff0c;由于Pod 是有生命周期的&#xff0c;如果 Pod 重启它的 IP 可能会发生变化以及升级的时候会重建 Pod&#xff0c;我们需要 Service 服务去动态的关联这些 Pod 的 IP 和端口&#xff0c;从而使我们前端用户访问不受后端变更的干扰。 …

SpringBoot Security OAuth2实现单点登录SSO(附源码)

文章目录 基础概念1. 用户认证2. 单点登录&#xff08;SSO&#xff09;3. 授权管理4. 安全性和配置 逻辑实现配置认证服务器配置Spring Security两个客户端 页面展示本篇小结 更多相关内容可查看 附源码地址&#xff1a;https://gitee.com/its-a-little-bad/SSO.git 基础概念 …

HarmonyOS 状态管理(一)

1. HarmonyOS 状态管理 1.1. 说明 官方文档&#xff08;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-state-management-V5&#xff09; 1.1.1. 状态管理&#xff08;V1稳定版&#xff09; 状态管理&#xff08;V1稳定版&#xff09;提供了多种…

90+ Python 面试问答(2024 版)

90+ Python 面试问答(2024 版) 一、介绍 欢迎来到准备数据科学工作面试的第一步。这里有一个全面而广泛的 Python 面试问题和答案列表,可帮助您在面试中取得好成绩并获得理想的工作!Python 是一种解释型通用编程语言,由于其在人工智能 (AI) 中的使用,如今需求量很大。…

python大小写转换、驼峰大小写转换

一 大小写转换 1第1个单词的首字母大写 capitalize() 2每个单词的首字母大写 title() 3所有字母大小写转换 swapcase() 代码示例 texttoday is sundaYprint(text.capitalize()) # 仅第1个单词的首字母大写 print(text.title()) # 每个单词的首字母大写 print(text.swapcase…