zookeeper知识点扫盲

news/2024/4/27 14:04:21/文章来源:https://blog.csdn.net/GaleZhang/article/details/126676474

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这样一个中间件来处理。对调用方来说,所需要处理的仅仅是简单易用的接口和高性能的系统。

zookeeper常见的应用场景包括:

  • 数据发布/订阅
  • 负载均衡
  • 命名服务
  • 分布式协调/通知
  • 集群管理
  • Master 选举
  • 分布式锁
  • 分布式队列

zookeeper的三个核心内容

数据结构znode

zookeeper使用znode作为基本的数据结构,我们平时对于zookeeper的使用,大部分都是在操作znode。

znode是一种树状结构,每个节点都是一个znode,znode中保存着节点的一些metadata和用户自定义数据。

znode分为持久节点和临时节点,区别在于其存活时间。节点的类型在创建时指定,且不可更改。
持久节点的存活时间不依赖于客户端会话,只有客户端在显式执行删除节点操作时,节点才消失。
临时节点的存活时间依赖于客户端会话,当会话结束,临时节点将会被自动删除(当然也可以手动删除临时节点)。利用临时节点的这一特性,我们可以使用临时节点来进行集群管理,包括发现服务的上下线等。
zk规定,临时节点不能拥有子节点。

同时,节点可设置为顺序节点,对于持久节点和临时节点,均可设置为顺序节点。顺序节点可用来做id生成器等。

znode中的用户数据不建议存储过大,当数据量过大时会显著影响zookeeper的性能。

znode的metadata

版本号

每个znode都有三个版本号:

1. dataVersion

数据版本号,每次对节点进行set操作,dataVersion的值都会增加1(即使设置的是相同的数据)。

2. cversion

子节点的版本号。当znode的子节点有变化时,cversion 的值就会增加1。

3. aclVersion

ACL的版本号,关于znode的ACL(Access Control List,访问控制),可以参考下文

以数据版本号来说明zk中版本号的作用。每一个znode都有一个数据版本号,它随着每次数据变化而自增。ZooKeeper提供的一些API例如setData和delete根据版本号有条件地执行。多个客户端对同一个znode进行操作时,版本号的使用就会显得尤为重要。例如,假设客户端C1对znode /config写入一些配置信息,如果另一个客户端C2同时更新了这个znode,此时C1的版本号已经过期,C1调用setData一定不会成功。这正是版本机制有效避免了数据更新时出现的先后顺序问题。在这个例子中,C1在写入数据时使用的版本号无法匹配,使得操作失败。下图描述了这个情况。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z8LhpphD-1662182448238)(https://km.woa.com/gkm/api/img/cos-file-url?url=https%3A%2F%2Fkm-pro-1258638997.cos.ap-guangzhou.myqcloud.com%2Ffiles%2Fphotos%2Fpictures%2F202112%2F1639577694-2449-61b9f85e3bcf8-88990.png&is_redirect=1)]

事务ID

对于zk来说,每次的变化都会产生一个唯一的事务id,zxid(ZooKeeper Transaction Id)。通过zxid,可以确定更新操作的先后顺序。例如,如果zxid1小于zxid2,说明zxid1操作先于zxid2发生。
需要指出的是,zxid对于整个zk都是唯一的,即使操作的是不同的znode。

cZxid
Znode创建的事务id。

mZxid
Znode被修改的事务id,即每次对znode的修改都会更新mZxid。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QdflLUbR-1662182448239)(https://km.woa.com/gkm/api/img/cos-file-url?url=https%3A%2F%2Fkm-pro-1258638997.cos.ap-guangzhou.myqcloud.com%2Ffiles%2Fphotos%2Fpictures%2F202112%2F1639577723-5148-61b9f87b7db3e-960679.png&is_redirect=1)]

在集群模式下,客户端有多个服务器可以连接,当尝试连接到一个不同的服务器时,这个服务器的状态要与最后连接的服务器的状态要保持一致。Zk正是使用zxid来标识这个状态,上图描述了客户端在重连情况下zxid的作用。当客户端因超时与S1断开连接后,客户端开始尝试连接S2,但S2延迟于客户端所识别的状态。然而,S3的状态与客户端所识别的状态一致,所以客户端可以安全连接上S3。

watcher机制

相比于大部分中间件的响应模式,zk的一大特点就是基于watcher机制,通过异步回调的方式实现了zk服务对客户端的主动调用。整个流程如下图所示,客户端在服务端注册watcher,当服务端某个znode发生了变化后,会判断当前节点是否注册了watcher,如果有的话,会主动推送相应的watchevent到客户端。客户端通过发送过来的path找到watcher,进行相应的操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yYeMl5vW-1662182448239)(https://km.woa.com/gkm/api/img/cos-file-url?url=https%3A%2F%2Fkm-pro-1258638997.cos.ap-guangzhou.myqcloud.com%2Ffiles%2Fphotos%2Fpictures%2F202112%2F1639578166-8453-61b9fa36ce655-49979.png&is_redirect=1)]

watcher注册的整体过程如下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2OX69jdo-1662182448239)(https://km.woa.com/gkm/api/img/cos-file-url?url=https%3A%2F%2Fkm-pro-1258638997.cos.ap-guangzhou.myqcloud.com%2Ffiles%2Fphotos%2Fpictures%2F202112%2F1639578183-4486-61b9fa476d890-354871.png&is_redirect=1)]

watcher回调的整体过程如下。出于对资源节约的考虑,zk服务在每次回调通知客户端后,会删除相应的watcher,如有相应的需要,客户端需要再次主动注册watcher。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GqinZzdS-1662182448240)(https://km.woa.com/gkm/api/img/cos-file-url?url=https%3A%2F%2Fkm-pro-1258638997.cos.ap-guangzhou.myqcloud.com%2Ffiles%2Fphotos%2Fpictures%2F202112%2F1639578196-9887-61b9fa54f1684-598452.png&is_redirect=1)]

ACL权限控制

zookeeper 可以通过 ACL(Access Control List,访问控制表)进行权限控制,对数据进行保护。相比于redis每个连接都可以随意更改所有的数据,zk的数据安全性能得到进一步的保障。

zookeeper 的 acl 通过 [scheme,id,permissions] 来构成权限列表。对于每一个节点,都维护着这样的一个权限列表。

  • 1、scheme:代表采用的某种权限机制,包括 world、auth、digest、ip、super 几种。
  • 2、id:代表允许访问的用户。
  • 3、permissions:权限组合字符串,由 cdrwa 组成,其中每个字母代表支持不同权限, 创建权限 create©、删除权限 delete(d)、读权限 read®、写权限 write(w)、管理权限admin(a)。

ZooKeeper 支持以下权限:

  • CREATE: 能创建子节点
  • READ:能获取节点数据和列出其子节点
  • WRITE: 能设置节点数据
  • DELETE: 能删除子节点
  • ADMIN: 能设置权限

CREATE权限和DELETE权限从WRITE权限中分离出来,是为了获得更好的访问控制。使用CREATE和DELETE权限的场景如下:
你想让A用户能够设置节点数据,但不允许创建或删除子节点。
有CREATE但无DELETE权限:客户端发出一个在父目录下创建节点的请求。你想让所有客户端能够添加,但是只有创建者能够删除。(这类似于文件的APPEND权限)。

内置的 ACL schemes

ZooKeeper有如下内置的schemes

  • world 有个唯一的id, anyone ,代表所有人。
  • auth 不使用任何id,代表任何已认证的用户。
  • digest 用 username:password 字符串来产生一个MD5串,然后该串被用来作为ACL ID。认证是通过明文发送username:password 来进行的,当用在ACL时,表达式为username:base64 ,base64是password的SHA1摘要的编码。
  • ip 使用客户端的主机IP作为ACL ID 。这个ACL表达式的格式为addr/bits ,此时addr中的有效位与客户端addr中的有效位进行比对。

zookeeper的最佳实践

详见参考资料ZooKeeper 的应用场景 - 知乎 (zhihu.com)

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

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

相关文章

express演示前端解决跨域的方法jsonp、cors

1.jsonp jsonp全称 JSON with Padding 即json外面包了一层js函数外衣&#xff0c;jsonp主要是利用了html中<script>等带有src属性的标签进行服务器请求时可以不受跨域影响 ①直接fetch请求 客户端代码 <!DOCTYPE html> <html lang"en"><head…

数据仓库---Hive

1. 数据仓库 1.1 概念 一个非常规范标准的定义是:数据仓库是一个面向主题的、集成的、相对稳定的、反应历史变化的数据集合,用于支持管理决策。 1.2 根本目的 数据仓库的根本目的是为了支持企业内部的商业分析和决策,也即企业相关的经营管理可以基于数据仓…

Java的接口以及接口与抽象类区别

java的接口 产生的背景 有时候必须从几个类中派生出一个子类&#xff0c;继承他们所有的方法&#xff0c;java不支持多继承&#xff0c;于是就有接口 当抽象类中全是抽象方法时&#xff0c;为了简化abstract关键字&#xff0c;于是就有了接口 特点 接口用interface实现 接口中…

22-09-02 西安 JVM 类加载器、栈、堆体系、堆参数调优、GC垃圾判定、垃圾回收算法、对象的finalize机制

JVM入门 1、JVM结构图 JVM是运行在操作系统之上的&#xff0c;它与硬件没有直接的交互 方法区&#xff1a;存储已被虚拟机加载的类元数据信息(元空间) 堆&#xff1a;存放对象实例&#xff0c;几乎所有的对象实例都在这里分配内存 虚拟机栈(java栈)&#xff1a;虚拟机栈描述…

springboot简单使用(4)

1.9 第九章 Thymeleaf 模版 1.9.1 认识 Thymeleaf Thymeleaf 是一个流行的模板引擎,该模板引擎采用 Java 语言开发 模板引擎是一个技术名词,是跨领域跨平台的概念,在 Java 语言体系下有模板引擎,在 C#、PHP 语言体系下也有模板引擎,甚至在 JavaScript 中也会用到模板引擎技…

每个架构师都值得拥有的一份Netty开发实战(附带面试专题)

前言 本书循序渐进的地介绍了 Netty各个方面的内容。 本书共分为 4 个部分&#xff08;共15章&#xff09;&#xff1a; 第一部分详细地介绍 Netty 的相关概念以及核心组件&#xff1b;第二部分介绍自定义协议经常用到的编解码器&#xff1b;第三部分介绍 Netty 对于应用层高…

线程相关方法

1. wait&#xff0c;notify&#xff0c;notifyAll 1.1wait原理 1.2用法 阻塞阶段 让线程暂时休息&#xff0c;等到时机成熟再唤醒继续运行。 在对象执行wait方法的时候&#xff0c;线程必须拥有这个对象的monitor锁&#xff0c;然后释放锁&#xff0c;进入阻塞状态。 唤醒阶段…

如何让 ABAP 报表在后台作业的模式下运行

本教程迄今为止我们介绍的各种 ABAP 程序的编写,都是在事物码 SE38 或者 SE80 里完成之后,直接点击工具栏的执行按钮,或者使用 F8 快捷键来执行的: 以这种方式启动的 ABAP 程序,是以在线方式(online)运行的,有时也称 联机 模式。 也就是说,如果在执行 ABAP 程序的过程中…

利用 SSH 完成 Git 与 GitHub 的绑定

如上图所示,进入Settings页面后,再点击SSH and GPG Keys进入此子界面,然后点击New SSH key按钮:在「史上最简单的 GitHub 教程」中,我们已经对 GitHub 有了一定的了解,包括创建仓库、拉分支,或者通过Clone or download克隆或者下载代码;我们也下载并安装了 Git,也了解…

Java开发五年跳槽涨薪从12K到35K,靠“狂刷”九遍面试题

朋友做Java开发三年多的时间了&#xff0c;在老东家勤勤恳恳工作了三年多&#xff0c;工资也就是从刚开始的8K涨到了12K&#xff0c;天天给我吐槽他的工资低。2020年年初开始就一直在各种地方找资源&#xff0c;刷面试题&#xff0c;想要“骑驴找马”&#xff0c;恰恰又是在疫情…

jupyter 基本用法

前一段时间&#xff0c;同事帮我在超算服务器安装了一套 jupyter notebook 软件&#xff0c;甚是好用。但用了几天后&#xff0c;忽然就不能用了。今天研究了一下&#xff0c;发现是服务器程序关闭了&#xff0c;所以我在浏览器端的网页就打不开了。今天仔细研究了一下&#xf…

Unity入门01——unity界面基础

1.工程文件夹 1.Assets&#xff1a;工程资源文件夹&#xff08;(美术资源&#xff0c;脚本等等) 2.Library&#xff1a;库文件夹(Unity自动生成管理) 3.Logs&#xff1a;日志文件夹&#xff0c;记录特殊信息(Unity自动生成管理) 4.obj&#xff1a;编译产生中间文件(Unity自动生…

【05】Yarn

125_尚硅谷_Hadoop_Yarn_课程介绍 126_尚硅谷_Hadoop_Yarn_基础架构 整个集群资源的老大&#xff1a;ResourceManager 单个结点资源的老大&#xff1a;NodeManager 每一个作业任务的老大&#xff1a;ApplicationMaster 相应的容器&#xff08;相当于一个小电脑&#xff09;&…

DolphinScheduler实例表备份、清理

&#x1f60b;DolphinScheduler实例表备份、清理 &#x1f44a;一、前言 DolphinScheduler至今已经在项目中使用了将近一年&#xff0c;工作流实例和任务流实例都积累了百万级的数据量。在查看工作流实例和任务实例的时候&#xff0c;都要等待后台去查询数据库&#xff0c;感觉…

【电商项目实战】拦截器(详细篇)

&#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;SpringBoot电商项目实战 ✨学习社区&#xff1a; &#x1f449;不会压弯的小飞侠 ✨知足上进&#x…

Python tkinter 制作一个经典的登录界面和点击事件

前言Tkinter(即 tk interface) 是 Python 标准 GUI 库,简称 “Tk”;从本质上来说,它是对 TCL/TK 工具包的一种 Python 接口封装。Tkinter 是 Python 自带的标准库,因此无须另行安装,它支持跨平台运行,不仅可以在 Windows 平台上运行,还支持在 Linux 和 Mac 平台上运行…

怎样在LaTeX中方便输入带圆圈的数字

这个也是这两天修改别人论文的时候得到的经验。正如这里所说&#xff1a;latex 如何添加圆圈数字&#xff1f;_Tsingke的博客-CSDN博客 如果使用\textcircled&#xff0c;数字编号大的时候&#xff0c;数字会跑到圆圈外面。但是上面这篇博客的解决方案太复杂了&#xff0c;就像…

电子数据取证-流程与技术

推荐公众号&#xff1a;安全猎人 专注于全栈攻防&#xff0c;学习笔记等&#xff1b; 原文url&#xff1a;https://mp.weixin.qq.com/s/hwpBcp-55ycXnSdObEffGg 电子数据取证流程与技术 根据某大佬经验&#xff0c;汇总出一系列取证流程、理论和模型&#xff1b; 在模型中&am…

pacman 升级软件包提示 “failed to commit transaction (invalid or corrupted package)“

很久没打开 WSL 2 里面的 Arch Linux, 想着更新一下软件包, 执行 pacman -Syu, 遇到 “signature is marginal trust” “failed to commit transaction (invalid or corrupted package)” 等错误. 观察输出的信息, 似乎提到了 “签名” “信任” 的问题 (signature … is marg…

快鲸智慧楼宇:助力商业地产快速实现数字化转型升级

作为国内领先的商业地产运营管理数字化服务商&#xff0c;快鲸搭建了集资产管理、合同管理、租客管理、财务管理、招商管理、物业管理等一套完整的 “商办招商营销管理空间资产运营管理租客运营服务体系”&#xff0c;致力于打造全场景商办地产标准化运营管理平台。 该平台具备…