深入理解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结构。

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

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

相关文章

办公软件PDF转换工具 - Bruce的PDF工具pdftool

Bruce的PDF工具 - 办公软件PDF转换工具 - pdftool,支持: 1、图片转PDF,支持图片自动压缩,可预览图片 2、合并PDF,支持多个PDF合并成一个PDF 3、PDF转图片,PDF的每页转成一张图片 4、OFD转PDF,O…

操作系统进程与线程篇

目录 一、进程 1.1、进程状态 1.2、进程的控制结构 1.3、进程的控制 1.4、进程的上下文切换 二、线程 2.1.线程是什么 2.2、线程与进程的比较 2.3、线程的上下文切换 2.4、线程的实现 2.5、轻量级线程 三、进程间的通信方式 3.1、管道 3.2、消息队列 3.3、共享内…

手摸手Element-ui路由VueRoute

后端WebAPI准备 https://router.vuejs.org/zh/guide/ https://v3.router.vuejs.org/zh/installation.html 路由 <template> <el-table :data"tableData" style"width: 100%" :row-class-name"tableRowClassName"…

国产linux单用户模式破解无密码登陆 (麒麟系统用户登录密码遗忘解决办法)

笔者手里有一批国产linu系统&#xff0c;目前开始用在日常的工作生产环境中&#xff0c;我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linux系统常见的为麒麟Linux&#xff0c;统信UOS等&#xff0c;基本都是基于debian再开发的linux。 问题描述&#xff1a; 因为…

Neo4j 数据库管理 数据备份与恢复(头歌)

文章目录 第1关&#xff1a;数据备份与恢复任务描述相关知识数据备份数据导入 编程要求测试说明答案测试前准备Cypher 代码数据备份与导入 第1关&#xff1a;数据备份与恢复 任务描述 本关任务&#xff1a;熟练掌握数据备份与恢复。 相关知识 为了完成本关任务&#xff0c;…

Python全栈之基本数据类型详解

文章目录 1.注释2.输出3.变量4.命名规范5.变量的定义方式1.字符串类型2.数字类型3.List列表类型4.tuple 元组类型的定义5.Dict字典类型6.set集合类型7.数据类型转换8.自动类型转换9.强制类型转换关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品…

ZeroTier外网访问实验室Linux服务器

ZeroTier外网访问实验室Linux服务器 1、在ZeroTier上创建一个自己的Network 进入ZeroTier的官网https://www.zerotier.com/注册一个账号 注册完之后登录进去&#xff0c;创建自己的Network 创建完之后来到IPv4的分配管理&#xff0c;选择主机位只有后8位的IP&#xff0c;才能…

SAP 如何检查已安装的SAP UI5 版本

第一个方法是直接从FLP中查看 但是部分高版本的FLP中没有这个about&#xff0c; 那么在当前界面可以使用&#xff1a;CTRL ALT SHIFT S 查看当前版本 根据此版本&#xff0c;去进行你的UI5的开发吧

全志XR806基于FreeRTOS下部署竞技机器人先进模糊控制器

前言 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。本人热衷于各种的开发板的开发&#xff0c;同时更愿意将其实现到具体项目中。秉承以上原则&#xff0c;发现大家的重心都放在开发中的环境构建过程&#xff0c;缺少了不少实际应用场景的运用&am…

算法:笛卡尔平面坐标系上,若干连接点形成线,剔除距离小于阈值的点,Kotlin

算法&#xff1a;笛卡尔平面坐标系上&#xff0c;若干连接点形成线&#xff0c;剔除距离小于阈值的点&#xff0c;Kotlin const val THRESHOLD 0.6f //距离小于这个点将被剔除。data class Point(val x: Float, val y: Float)fun removeNearbyPoint(points: List<Point>…

人工智能对我们的生活影响

文章目录 一、人工智能主要领域二、人工智能的应用三、对人工智能的看法 一、人工智能主要领域 人工智能&#xff08;AI&#xff09;涵盖了多个领域&#xff0c;其应用广泛&#xff0c;正在不断拓展。以下是人工智能的一些主要领域&#xff1a; &#xff08;1&#xff09;机器…

《ChatGPT实操应用大全》探索无限可能

&#x1f5e3;️探索ChatGPT&#xff0c;开启无限可能&#x1f680; 文末有免费送书福利&#xff01;&#xff01;&#xff01; ChatGPT是人类有史以来最伟大的发明。他能写作、绘画、翻译、看病、做菜、编程、数据分析、制作视频、解高等数学题…&#xff0c;他会的技能…

mysql从库设置为只读

直奔主题&#xff0c;mysql设置为只读后&#xff0c;无法增删改。 设置命令&#xff1a; mysql> set global read_only1; #1是只读&#xff0c;0是读写 mysql> show global variables like %read_only%; 以下是相关说明&#xff1a; 1、对于数据库读写状态&#xf…

数据库-MySQL之数据库必知必会17-21章

第17章 组 合 查 询 创建组合查询 可用UNION操作符来组合数条SQL查询。利用UNION&#xff0c;可给出多条SELECT语句&#xff0c;将它们的结果组合成单个结果集。 **例子&#xff1a;**假如需要价格小于等于5的所有物品的一个列表&#xff0c;而且还想包括供应商1001和1002生产…

在CentOS 7.9上搭建高性能的FastDFS+Nginx文件服务器集群并实现外部远程访问

文章目录 引言第一部分&#xff1a;FastDFS介绍与安装1.1 FastDFS简介1.2 FastDFS安装1.2.1 安装Tracker Server1.2.2 安装Storage Server 1.3 FastDFS配置1.3.1 配置Tracker Server1.3.2 配置Storage Server1.3.3 启动FastDFS服务 第二部分&#xff1a;Nginx配置2.1 Nginx安装…

[Android] c++ 通过 JNI 调用 JAVA函数

如何使用&#xff1a; Calling Java from C with JNI - CodeProject c里的 JNI 类型 和 JAVA 类型的映射关系&#xff1a; JNI Types and Data Structures Primitive Types and Native Equivalents Java TypeNative TypeDescriptionbooleanjbooleanunsigned 8 bitsbytejbyt…

【C语言】与文件有关的操作

目录 1. 前言2. 什么是文件&#xff1f;2.1 程序文件2.2 数据文件2.3 文件名 3. 二进制文件和文本文件&#xff1f;4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5. 文件的顺序读写5.1 顺序读写函数介绍5.2 对比一组函数 6. 文件的…

数字电源为什么一般用DSP控制,而不能用普通的单片机?

数字电源为什么一般用DSP控制&#xff0c;而不能用普通的单片机&#xff1f; 首先你要清楚&#xff0c;数字电源需要一个芯片具备什么功能&#xff1f; 1 能发PWM波 &#xff0c;并且具备保护关断功能&#xff1b; 电源对PWM发波 要求很高&#xff0c;精度要ns级甚至ps级的&…

Zigbee—基于Z-STACK组网

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;チノカテ—ヨルシカ 0:46━━━━━━️&#x1f49f;──────── 4:08 &#x1f504; ◀️ ⏸ ▶️ ☰ &a…

java分布式锁分布式锁

java分布式&锁&分布式锁 锁 锁的作用&#xff1a;有限资源的情况下&#xff0c;控制同一时间段&#xff0c;只有某些线程&#xff08;用户/服务器&#xff09;能访问到资源。 锁在java中的实现&#xff1a; synchronized关键字并发包的类 缺点&#xff1a;只对单个的…