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

深入理解Zookeeper系列-1.初识Zoookeeper

  • 👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家
  • 📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理
  • 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
  • 🍂博主正在努力完成2023计划中:源码溯源,一探究竟
  • 📝联系方式:nhs19990716,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬👀

文章目录

    • Zookeeper是什么?
    • 怎么去设计
      • leader
      • follower
      • Observer
      • 集群组成
    • 安装部署
    • 数据结构
    • Zookeeper可以解决那些实际问题
      • 有序队列的使用场景
      • 同级节点的唯一性
      • 节点元数据
      • watcher(监听机制)

Zookeeper是什么?

将其定义为分布式协调

简单来说,就是一个分布式系统下,有多个节点,每个节点一个请求,但是所有的节点只能确定一个请求被通过,而这个而通过的是所有节点达成一致的结果。

Google Chubby(不开源产品)其解决了分布式一致性

在这里插入图片描述

我们有多个不同的数据节点,如果我们去发起创建订单和扣减库存这两个动作,它分别落在不同的节点,如果我们要保证数据的一致性,可以考虑使用这种方案。其实就是解决分布式场景下达成一致的方式。

我们如何在不可靠的分布式场景中,基于某一个提议达成一致,这个一致是每一个节点都需要赞同的。

zookeeper是协调分布式下多个节点之间访问顺序的问题,所以也叫顺序一致性的中间件。而这个方式有点像实现锁的方式,所以zookeeper也能实现分布式锁,所以本质上其实就是一种锁的服务。

zookeeper是一种cp模型

在这里插入图片描述

怎么去设计

leader

  • 整个集群中的调度节点
  • 数据同步

follower

  • 高可用特性

  • 参与投票(leader选举的投票,数据达成一致的投票)

  • 处理客户端的请求(提升集群性能)这样设计到扩容,但是并不是节点越多性能越好,因为涉及到了数据同步,这里面有一个思想叫做 过半提交 ,比如当发起一个操作的时候,整个集群中至少要有过半的节点认为这是成功的,才会成功返回给后端,也就会导致follower会参与到这个过程中来。正是因为这样,如果盲目的扩容,最终就会导致因为过多的follower参与而导致性能下降。

Observer

主要是为了解决 增加follower节点而导致的性能问题,其并不需要参与投票,但是会参与数据的同步,只需要跟leader节点保持一致。简单来说,observer服务器只提供非事务请求服务,通常在于不影响集群事物事务处理能力的前提下提升集群非事务处理的能力。

在这里插入图片描述

在这里插入图片描述

如果超过了半数,那么就认为事务是成功的,那么就返回。

在这里插入图片描述

提交事务

如果是过半提交,那么就意思着其不是强一致的。如果是强一致的话,就必然影响到整个集群的吞吐和性能。

而这个方式就是一个典型的2pc协议。

在这里插入图片描述

2pc协议是一个强一致性协议,如果想实现2pc,在这里的情况就是所有的节点都必须要成功,如果有一个失败,那么就不行,协议定义的是一种规范和标准。所以zookeeper也是使用了2pc的方式,只不过它是改进版本的,不需要全部成功,只需要过半就可以了。

集群组成

怎么要满足过半,所以一般是由2n+1台server组成,每个server都知道彼此的存在。每个server都维护的内存状态镜像以及持久化存储的事务日志和快照。对于2n+1台server,只要有n+1台(大多数)server可用,整个系统保持可用。我们已经了解到,一个zookeeper集群如果要对外提供可用的服务,那么集群中必须要有过半的机器正常工作并且彼此之间能够正常通信,基于这个特性,如果向搭建一个能够允许F台机器down掉的集群,那么就要部署2*F+1台服务器构成的zookeeper集群。

因此3台机器构成的zookeeper集群,能够在挂掉一台机器后依然正常工作。一个5台机器集群的服务,能够对2台机器怪调的情况下进行容灾。如果一台由6台服务构成的集群,同样只能挂掉2台机器。因此,5台和6台在容灾能力上并没有明显优势,反而增加了网络通信负担。系统启动时,集群中的server会选举出一台server为Leader,其它的就作为follower(这里先不考虑observer角色)。

之所以要满足这样一个等式,是因为一个节点要成为集群中的leader,需要有超过及群众过半数的节点
支持,这个涉及到leader选举算法。同时也涉及到事务请求的提交投票

安装部署

部署好后,连接发现

在这里插入图片描述

这就意味着zookeeper可以存储一些数据在里面,可以针对性的对数据进行一些操作。

数据结构

在这里插入图片描述

key代表名字,value代表值

当dubbo作为服务中心的时候,会像zookeeper写入一些信息

在这里插入图片描述

它还有临时节点(生命周期) 、持久化节点、以及有序节点(递增的序列号)。

对于其树形结构来说,先有父节点,再有子节点,当然临时节点下不能存在子节点(如果临时节点失效了,那么子节点怎么办呢?)。

同级节点下,节点名字必须是唯一的。

当了解了节点,除了做注册中心,还可以做配置中心

在这里插入图片描述

所以以上就是 服务注册 和 配置中心的简单示意图。

在这里插入图片描述

学到这里,其实技术是存在一个取舍的,但是功能是可以实现的,甚至用数据库来实现其实都可以,无非就是一个统一的存储,然后做个监听数据的变化,那么我们可以监听数据库的变化呀,去触发一些动作也没什么问题,只不过就是会复杂一些,可行性是有的。

剩下的就是针对对应的节点做crud了。

create /nhs
create /nhs/test "test"create [-s] [-e] [-c] [-t ttl] path [data] [acl]
-s:表示创建的 znode 为顺序节点,即在节点名称后面添加一个自增的数字后缀;
-e:表示创建的 znode 为临时节点,即客户端与 ZooKeeper 断开连接后,该节点会自动删除;
-c:表示创建的 znode 为容器节点,即该节点可以拥有子节点;
-t ttl:表示创建的 znode 有一个 TTL(Time To Live)值,即生存时间,超过该时间后节点将被删除;
path:表示新创建的 znode 的路径;
data:表示新创建的 znode 的数据内容;
acl:表示新创建的 znode 的 ACL(Access Control List),即访问控制列表。

Zookeeper可以解决那些实际问题

有序队列的使用场景

有序节点: 全局ID

分布式锁 (ZooKeeper中的有序节点能够用于实现分布式锁的主要原因在于其顺序临时节点的特性。当多个客户端尝试创建有序临时节点时,ZooKeeper会为每个节点赋予一个唯一的递增顺序号,并且客户端创建的节点将按照顺序号从小到大排列。)

基于这一特性,可以利用ZooKeeper有序节点来实现分布式锁的过程如下:

  1. 每个客户端需要获取锁时,在指定的ZooKeeper节点下创建一个有序临时节点。
  2. 客户端可以通过获取当前指定节点下所有子节点,并且判断自己创建的节点是否为序号最小的节点,如果是,则表示客户端获得了锁;否则,客户端需要监听比自己序号小的节点的变化事件。
  3. 如果前面的节点释放了锁,那么其它客户端对应创建的节点会收到通知,进而继续尝试获取锁。

分布式队列

同级节点的唯一性

分布式锁

节点元数据

stat /nhs 显示节点的元数据cZxid = 0x6 //节点被创建的事务zxid
ctime = Sat Sep 05 21:26:15 CST 2020 //创建时间
mZxid = 0x6 //修改的事务id
mtime = Sat Sep 05 21:26:15 CST 2020 //修改时间
pZxid = 0x8 //子节点列表中最后一次被修改的zxid
cversion = 1 //子节点版本号 (乐观锁)
dataVersion = 0 //当前节点版本号
aclVersion = 0 //权限版本号
ephemeralOwner = 0x0 //临时节点的所属会话
dataLength = 0 //数据的长度
numChildren = 1 //子节点数量(当前节点)

watcher(监听机制)

比如服务注册,有两个难点

1.服务的管理

2.服务的上下线感知

当我的服务提供者发生上下线变化的时候,那么需要去感知移除那个,最好的设置方式就是临时节点,当服务挂掉的时候,不需要去触发什么东西,zookeeper会去检测其心跳。

在这里插入图片描述

其中service provider是持久化节点。

上图的这个机制就叫做watcher

zookeeper提供了分布式数据的发布/订阅功能,zookeeper允许客户端向服务端注册一个watcher监听,当服务端的一些指定事件触发了watcher,那么服务端就会向客户端发送一个事件通知。

值得注意的是,Watcher通知是一次性的,即一旦触发一次通知后,该Watcher就失效了,因此客户端需要反复注册Watcher,即程序中在process里面又注册了Watcher,否则,将无法获取c3节点的创建而导致子节点变化的事件。

配置中心的变更也是这样

在这里插入图片描述

配置中心能够应用主要是其 key value结构。

相关文章:

深入理解Zookeeper系列-1.初识Zoookeeper

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理🔥如果感觉博主的文章还不错的话&#xff…...

芯片技术探索:了解构芯片的设计与制造之旅

芯片技术探索:了解构芯片的设计与制造之旅 一、引言 随着现代科技的飞速发展,芯片作为信息技术的核心,已经渗透到我们生活的方方面面。从智能手机、电视、汽车到医疗设备和工业控制系统,芯片在各个领域都发挥着至关重要的作用。然而,对于大多数人来说,芯片仍然是一个神秘…...

STM32 超声波模块(HC-SR04)

HC-SR04介绍 典型工作电压&#xff1a;5v &#xff08;如果你的超声波模块没有工作&#xff0c;可以看一下是不是电压不够&#xff09;超小静态工作电流&#xff1a;<2mA 感应角度&#xff1a;<15 &#xff08;超声波模块&#xff0c;是一个范围式的探…...

ELK+Filebeat

Filebeat概述 1.Filebeat简介 Filebeat是一款轻量级的日志收集工具&#xff0c;可以在非JAVA环境下运行。 因此&#xff0c;Filebeat常被用在非JAVAf的服务器上用于替代Logstash&#xff0c;收集日志信息。实际上&#xff0c;Filebeat几乎可以起到与Logstash相同的作用&…...

MySql之锁表、锁行解决方案

查询正在使用的表&#xff0c;没有跑业务&#xff0c;一般情况下是锁表了 show open tables where in_use > 0 ;查看进程&#xff0c;可以看到Command类型&#xff08;Sleep为阻塞线程&#xff09; show processlist;kill事务&#xff0c;kill 进程Id kill 8193583;其他 …...

2023年第十六届山东省职业院校技能大赛中职组“网络安全”赛项竞赛正式试题

第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题 目录 一、竞赛时间 二、竞赛阶段 三、竞赛任务书内容 &#xff08;一&#xff09;拓扑图 &#xff08;二&#xff09;A模块基础设施设置/安全加固&#xff08;200分&#xff09; &#xff08;三&#xf…...

JAVA 整合 AWS S3(Amazon Simple Storage Service)文件上传,分片上传,删除,下载

依赖 因为aws需要发送请求上传、下载等api&#xff0c;所以需要加上httpclient相关的依赖 <dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk-s3</artifactId><version>1.11.628</version> </dependency&…...

记录:Unity脚本的编写9.0

目录 射线一些准备工作编写代码 突然发现好像没有写过关于射线的内容&#xff0c;我就说怎么总感觉好像少了什么东西&#xff08;心虚 那就在这里写一下关于射线的内容吧&#xff0c;将在这里实现射线检测鼠标点击的功能 射线 射线是一种在Unity中检测碰撞器或触发器的方法&am…...

共享单车停放(简单的struct结构运用)

本来不想写这题的&#xff0c;但是想想最近沉迷玩雨世界&#xff0c;班长又问我这题&#xff0c;就草草写了一下 代码如下&#xff1a; #include<stdio.h> #include<math.h> struct parking{int distance;int remain;int speed;int time;int jud; }parking[50]; …...

【Java8系列07】Java8日期处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

为什么做CSGO搬砖的不直接去炒股呢?

首先&#xff0c;CS2并非只有一个交易平台&#xff0c;阿阳个人觉得像IGXE等交易平台一样是交易&#xff0c;况且我记得很早的时候我就开始用IGXE了&#xff0c;我记得最早的时候还是机器人发货&#xff0c;后来因为V社对于很多开箱网站的管控&#xff0c;所以让这种发货的方式…...

12月01日,每日信息差//阿里国际发布3款AI设计生态工具//美团买菜升级为“小象超市”//外国人永居证换新、6国游客免签来华

_灵感 &#x1f396; 阿里国际发布3款AI设计生态工具 &#x1f384; AITO问界系列11月交付新车18827辆 &#x1f30d; 美团买菜升级为“小象超市” &#x1f30b; 全球首个金融风控大模型国际标准出炉&#xff0c;由腾讯牵头制定 &#x1f381; 支付宝&#xff1a;支持外国人…...

ChatGPT探索:提示工程详解—程序员效率提升必备技能【文末送书】

文章目录 一.人工智能-ChatGPT1.1 ChatGPT简介1.2 ChatGPT探索&#xff1a;提示工程详解1.2 提示工程的优势 二.提示工程探索2.1 提示工程实例&#xff1a;2.2 英语学习助手2.3 Active-Prompt思维链&#xff08;CoT&#xff09;方法2.4 提示工程总结 三.文末推荐与福利3.1《Cha…...

Pytest做性能测试?

Pytest其实也是可以做性能测试或者基准测试的。是非常方便的。 可以考虑使用Pytest-benchmark类库进行。 安装pytest-benchmark 首先&#xff0c;确保已经安装了pytest和pytest-benchmark插件。可以使用以下命令安装插件&#xff1a; pip install pytest pytest-benchmark …...

Swagger各版本访问地址

2.9.x 访问地址: http://ip:port/{context-path}/swagger-ui.html 3.0.x 访问地址: http://ip:port/{context-path}/swagger-ui/index.html 3.0集成knife4j 访问地址: http://ip:port/{context-path}/doc.html...

docker-compose;私有镜像仓库harbor搭建;镜像推送到私有仓库harbor

docker-compose&#xff1b;私有镜像仓库harbor搭建&#xff1b;镜像推送到私有仓库harbor 文章目录 docker-compose&#xff1b;私有镜像仓库harbor搭建&#xff1b;镜像推送到私有仓库harbordocker-compose私有镜像仓库harbor搭建镜像推送到私有仓库harbor docker-compose D…...

OpenTSDB(CVE-202035476)漏洞复现及利用

任务一&#xff1a; 复现环境中的命令注入漏洞。 任务二&#xff1a; 利用命令注入执行whoami&#xff0c;使用DNS外带技术获取结果 任务三&#xff1a;使用反弹shell&#xff0c;将漏洞环境中的shell反弹到宿主机或者vps服务器。 任务一&#xff1a; 1.搭建好环境 2.先去了…...

Maven无法拉取依赖/构建失败操作步骤(基本都能解决)

首先检查配置文件&#xff0c;确认配置文件没有问题(也可以直接用同事的配置文件(记得修改文件里的本地仓库地址)) 1.file->Invalidate Caches清除缓存重启(简单粗暴&#xff0c;但最有效) 2.刷新maven以及mvn clean&#xff0c;多刷几次&#xff0c;看看还有没有报红的依赖…...

【数据库】数据库并发控制的目标,可串行化序列的分析,并发控制调度器模型

数据库并发控制 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定期更…...

带头结点的双向循环链表

目录 带头结点的双向循环链表 1.存储定义 2.结点的创建 3.结点的初始化 4.尾插结点 5.尾删结点 6.头插结点 7.头删结点 8.查找并返回结点 9.在pos结点前插入结点 10.删除pos结点 11.打印链表 12.销毁链表 13.头插结点2.0版 14.尾插结点2.0版 前言&#xff1a; 当…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...