ZooKeeper 核心知识全解析:架构、角色、节点与应用
1.ZooKeeper 分布式锁怎么实现的
ZooKeeper 是一个高效的分布式协调服务,它提供了简单的原语集来构建更复杂的同步原语和协调数据结构。利用 ZooKeeper 实现分布式锁主要依赖于它的顺序节点(Sequential Node)特性以及临时节点(Ephemeral Node)机制。
以下是使用 ZooKeeper 实现分布式锁的基本步骤:
-
创建锁节点:
- 所有想要获取锁的客户端都会在同一个预先约定的父节点下创建自己的临时顺序节点。
- 例如,所有客户端都试图在 /lock 路径下创建子节点,如 /lock/lock-0000000001。
-
检查前驱节点:
- 创建完节点后,每个客户端会获取当前 /lock 路径下的所有子节点列表,并根据节点名称中的序列号排序。
- 如果发现自己创建的节点是排序后的第一个节点,则认为自己获得了锁。
- 否则,监听比自己创建的节点序列号小的第一个节点的删除事件,等待前驱节点被删除。
-
持有锁:
- 当某个客户端获得锁之后,可以在执行相应的临界区代码的同时保持与 ZooKeeper 的会话连接,以确保其临时节点不会因为长时间没有心跳而被自动删除。
-
释放锁:
- 完成临界区的操作后,客户端主动删除自己创建的临时顺序节点,这将释放锁,允许下一个等待的客户端获取锁。
- 如果持有锁的客户端意外断开连接或崩溃,由于它是临时节点,ZooKeeper 会在会话超时后自动删除该节点,从而释放锁。
-
处理异常情况:
- 如果在等待过程中前驱节点突然消失(即前驱客户端崩溃),那么当前客户端应该重新获取最新的子节点列表并再次判断是否获得了锁。
这种实现方式可以保证在任何时刻最多只有一个客户端持有锁,即使在网络分区、客户端故障等情况下也能正确工作。此外,ZooKeeper 的 Watcher 机制使得等待锁的客户端能够及时响应锁状态的变化,提高了系统的响应速度。
2.了解Zookeeper的系统架构吗?
ZooKeeper 是一个分布式应用程序协调服务,它的设计目标是简化和可靠地实现分布式系统中的常见任务。ZooKeeper 的架构主要由以下几个组件构成:
-
客户端(Client):
- 客户端通过网络与 ZooKeeper 服务器进行通信。每个客户端可以连接到集群中的任意一台服务器,并且可以在服务器之间自动切换以保持连接的高可用性。
-
服务器(Server):
- ZooKeeper 集群通常由奇数个服务器组成(如3、5或7),以确保在投票过程中能够达成多数同意。每个服务器都保存了一份数据副本,这保证了系统的高可用性和容错性。
-
领导者(Leader):
- 在 ZooKeeper 集群中,选举出一个领导节点来处理所有的写请求。领导者负责将更新广播给其他跟随者(Follower),并确保所有服务器的数据状态一致。
-
跟随者(Follower):
- 非领导者的其他服务器被称为跟随者。它们接受来自领导者的消息并应用这些消息到自己的状态机上。跟随者还参与领导者选举过程,在必要时投票选出新的领导者。
-
观察者(Observer):
- 观察者是一种特殊的跟随者,它不参与选举也不参与写操作的投票。观察者的存在是为了增加读取性能,因为它们可以响应只读请求而不影响写入路径的一致性协议。
-
ZAB 协议(ZooKeeper Atomic Broadcast):
- 这是 ZooKeeper 使用的原子消息广播协议,用于在服务器之间同步状态。ZAB 确保所有事务按全局顺序执行,并且只有当大多数服务器同意后才会提交更改。
-
内存数据库(In-Memory Database):
- ZooKeeper 将所有数据存储在内存中,以提供快速的读写访问。同时,它也会定期将快照和日志持久化到磁盘上,以便恢复。
-
Watcher 机制:
- Watcher 是 ZooKeeper 提供的一种回调机制,允许客户端订阅特定事件(例如节点变化)。一旦触发条件满足,ZooKeeper 会通知相应的客户端。
-
ACLs(Access Control Lists):
- ACLs 用来控制哪些客户端可以对特定的 znode 执行什么样的操作,提供了安全性和权限管理的功能。
ZooKeeper 的架构设计使其成为一个高性能、高可靠的分布式协调服务,适用于构建分布式应用程序中的各种协调任务,比如配置管理、命名服务、分布式锁等。
3.Zookeeper为什么要这么设计?
ZooKeeper 的设计初衷是为了简化分布式系统的协调任务,同时确保这些任务能够以一种可靠、高效且易于使用的方式执行。以下是 ZooKeeper 设计背后的一些关键考虑因素:
-
简单性:
- ZooKeeper 提供了一个简单的文件系统风格的数据模型,其中每个节点(znode)都可以存储少量数据,并可以拥有子节点。这种结构使得开发者更容易理解和实现复杂的分布式协调算法,如选举、锁和屏障等。
-
高可用性和容错性:
- ZooKeeper 通过复制来提高系统的可用性。集群中的每个服务器都保存了一份完整的数据副本。如果一台服务器失败,其他服务器仍然可以继续服务请求。此外,ZooKeeper 使用 ZAB 协议来保证所有服务器在事务处理上的一致性,即使在网络分区或某些服务器故障的情况下也能正常工作。
-
顺序一致性:
- 所有更新操作都是全局有序的,这意味着对于所有的客户端来说,它们看到的操作顺序是一样的。这对于维护分布式系统的状态一致非常重要。
-
原子性:
- 更新要么完全成功,要么完全失败,不存在部分成功的状态。这保证了系统的可靠性。
-
快速读取:
- ZooKeeper 将所有数据存储在内存中,使得读取操作非常快,这对于许多需要频繁查询的应用程序来说至关重要。
-
持久性和临时节点:
- 支持创建持久节点和临时节点。持久节点在创建后会一直存在直到被显式删除;而临时节点在创建它的客户端断开连接时自动删除。这样的机制有助于实现各种协调原语,比如领导者选举和分布式锁。
-
事件通知(Watchers):
- 客户端可以设置监听器(Watcher),当指定的数据发生变化时会触发相应的回调函数。这种方式可以让应用程序及时响应配置变更或其他重要事件。
-
轻量级通信:
- ZooKeeper 的 API 和协议设计得尽可能简单,以减少网络传输的负担并提高效率。
-
线性扩展性:
- 虽然 ZooKeeper 不是为大规模水平扩展设计的(因为随着集群大小的增长,性能可能会下降),但在大多数情况下,一个小型的 ZooKeeper 集群(通常由3到7个节点组成)已经足够满足需求,并能提供良好的性能和可靠性。
综上所述,ZooKeeper 的设计目的是为了在分布式环境中提供一个健壮、高效的服务,用于管理和协调多个组件之间的交互,同时保持操作的一致性和正确性。它特别适用于那些需要强一致性而非高吞吐量的场景。
4.你知道Zookeeper中有哪些角色?
在 ZooKeeper 中,主要存在三种角色:Leader(领导者)、Follower(跟随者)和 Observer(观察者)。这些角色在集群中扮演不同的职责,以确保系统的高可用性和性能。
-
Leader (领导者)
- 领导者是负责处理所有写请求的服务器。当客户端发起创建、删除节点或更新数据等操作时,这些请求会被转发给领导者。领导者会按照全局顺序为每个事务分配一个唯一的编号(Zxid),然后将该事务广播给所有的跟随者和观察者。
- 领导者还负责协调选举过程,在当前领导者失效时,集群中的其他成员会启动新的领导者选举来选出一个新的领导者。
-
Follower (跟随者)
- 跟随者接收来自领导者的提案,并参与投票以确认提案。对于写请求,跟随者会应用从领导者接收到的更新,并在本地执行相同的变更。
- 在读请求方面,跟随者可以直接响应客户端的查询,因为它们的数据状态与领导者保持同步。
- 跟随者也参与到领导者选举过程中,通过投票帮助确定下一个领导者。
-
Observer (观察者)
- 观察者是一种特殊的跟随者,它不参与任何投票活动,包括领导者选举和写操作的提交确认。这意味着观察者不会影响到集群达成一致的速度。
- 它的主要作用是分担读负载,因为它也可以像跟随者那样直接回应读请求。由于不需要参与投票,理论上可以添加更多的观察者来增加系统的读取吞吐量而不降低写入性能。
除了上述三种角色外,还有两种概念性的角色:
-
Client (客户端)
- 客户端是指连接到 ZooKeeper 集群的应用程序或用户。它们向 ZooKeeper 发送请求(如读写操作)并接收响应。客户端通常与集群中的任意一台服务器建立连接,并可以在服务器故障时自动切换到另一台健康的服务器上。
-
Elector (选举器)
- 选举器并不是一个独立的角色,而是指集群中用于进行领导者选举的逻辑组件。每个服务器都包含了这个功能,以便在需要时能够共同决定谁应该成为新的领导者。
总结来说,ZooKeeper 的设计使得领导者负责写操作的一致性管理,而跟随者和观察者则共同承担了读请求的服务工作,从而实现了高效且可靠的分布式协调服务。
5.你熟悉Zookeeper节点ZNode和相关属性吗?
是的,ZooKeeper 的核心概念之一是 ZNode(ZooKeeper Node),它是 ZooKeeper 数据模型的基本单元。每个 ZNode 都可以存储少量的数据,并且可以有子节点。ZooKeeper 的命名空间类似于文件系统,但它的结构和行为与传统文件系统有所不同。以下是关于 ZNode 和其相关属性的一些重要信息:
ZNode 类型
-
持久节点 (PERSISTENT)
- 一旦创建,这些节点将一直存在,直到它们被显式删除。
-
临时节点 (EPHEMERAL)
- 这些节点与创建它们的会话绑定。如果会话结束(例如客户端断开连接),那么这个节点就会自动删除。临时节点不能有子节点。
-
顺序节点 (SEQUENTIAL)
- 创建时,ZooKeeper 会在节点路径的末尾附加一个递增的序列号。这可以用于实现分布式队列等特性。顺序节点可以是持久的也可以是临时的。
-
临时顺序节点 (EPHEMERAL_SEQUENTIAL)
- 结合了临时节点和顺序节点的特点,即具有临时性并且创建时带有递增序列号。
ZNode 属性
-
dataLength:存储在该节点上的数据字节数。
-
ctime:节点创建的时间戳,以毫秒为单位。
-
mtime:节点最后一次更新的时间戳,以毫秒为单位。
-
version:节点内容版本号,每当节点数据被修改时,此值加1。
-
cversion:子节点版本号,每当子节点列表发生改变时,此值加1。
-
aversion:ACL 版本号,每当 ACL 列表被修改时,此值加1。
-
ephemeralOwner:如果是临时节点,则表示创建该节点的会话ID;如果不是临时节点,则此字段为0。
-
data:实际存储在节点中的数据,大小限制为1MB左右。
ZNode 操作
- Create:创建一个新的 ZNode。
- Delete:删除一个存在的 ZNode。
- Exists:检查某个 ZNode 是否存在。
- Get Data:获取指定 ZNode 上的数据。
- Set Data:设置或更新指定 ZNode 上的数据。
- Get Children:列出指定 ZNode 下的所有子节点。
ACL(Access Control List)
- 每个 ZNode 都有关联的访问控制列表(ACL),用来定义哪些客户端可以对它执行特定的操作。ACL 包含权限和身份验证方案两个部分。权限可以包括 CREATE、READ、WRITE、DELETE 和 ADMIN 等操作。
通过上述特性和功能,ZooKeeper 提供了一个强大的基础来构建分布式应用程序所需的协调服务,如配置管理、命名服务、分布式锁和集群管理等。
相关文章:
ZooKeeper 核心知识全解析:架构、角色、节点与应用
1.ZooKeeper 分布式锁怎么实现的 ZooKeeper 是一个高效的分布式协调服务,它提供了简单的原语集来构建更复杂的同步原语和协调数据结构。利用 ZooKeeper 实现分布式锁主要依赖于它的顺序节点(Sequential Node)特性以及临时节点(Ep…...
笔记本电脑 选购 回收 特权模式使用 指南
笔记本电脑 factor 无线网卡:有些笔记本无法检测到特定频段的信息,会导致连不上校园网 sudo iwlist wlp2s0 scan | grep Frequency > net.txt cat net.txt>表示用终端输出覆盖后续文件,>>表示添加到后续文件的末尾 一种更简…...
2023-2024 学年 广东省职业院校技能大赛(高职组)“信息安全管理与评估”赛题一
2023-2024 学年 广东省职业院校技能大赛(高职组“信息安全管理与评估”赛题一) 模块一:网络平台搭建与设备安全防护第一阶段任务书任务 1:网络平台搭建任务 2:网络安全设备配置与防护DCRS:DCFW:DCWS:DCBC:WAF: 模块二:网络安全事件…...
C#补充----反射,特性,迭代器,特殊语法,值类型运用类型。
1.反射:通过type 获取类中的数据。创建实例,并赋值。 《1》获取类的方式 《2》反射的应用 <1>获取类型的所有公共成员 <2>获取构造函数 <3>获取类型的 公共成员变量 <4>获取类型的 公共方法 <5>.获取类型的 属性 <6&g…...
深度学习核函数
一、核函数的基本概念 核函数在机器学习中具有重要应用价值,常用于支持向量机(SVM)等算法中。 核函数是面试中经常被考到的知识点,对于找工作和实际数据转换都有重要作用。 二、数据建模与核函数的作用 数据越多,可…...
Spring MVC流程一张图理解
由于现在项目中大部分都是使用springboot了,但是ssm中的springmvc还是可以了解一下 1 、用户发送请求至前端控制器 DispatcherServlet 。 2 、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。 3 、处理器映射器找到具体的处理器 ( 可以根据 xml 配…...
计算机网络速成
前言:最近在做一些动态的crypto,但是配置总搞不好,正好也有学web的想法,就先学学web再回去做密码,速成视频推荐b站建模老哥 目录 计算机网络概述网络的范围分级电路交换网络(电路交换)报文交换网…...
spring.profiles.active不同优先级
1、在editConfiguration中配置profiles.activedev会同时影响项目取application-dev.properties、bootstrap-dev.yaml,且这种方式优先级最高,会覆盖application.properties、bootstrap.yaml中的spring.profiles.active配置 2、在application.properties配…...
我这不需要保留本地修改, 只需要拉取远程更改
如果你不需要保留本地修改,只需要拉取远程更改并强制将本地分支与远程分支同步,可以按照以下步骤操作: 1. 丢弃本地修改 首先,丢弃所有本地未提交的修改: git reset --hard这会重置工作目录和暂存区,丢弃…...
源码编译安装httpd 2.4,提供系统服务管理脚本并测试(两种方法实现)
下载 httpd 2.4 源码: wget https://dlcdn.apache.org/httpd/httpd-2.4.x.tar.gztar -zxvf httpd-2.4.x.tar.gzcd httpd-2.4.x配置、编译和安装: ./configure --prefix/usr/local/apache2 --enable-so --enable-ssl --enable-cgi makesudo make install实…...
深度学习在自动化测试中的创新应用:提升运维效率与质量
《深度学习在自动化测试中的创新应用:提升运维效率与质量》 一、引言 在当今快速发展的软件行业中,自动化测试是确保软件质量和可靠性的关键环节。随着软件系统的日益复杂,传统的自动化测试方法在处理复杂场景、提高测试覆盖率和准确性方面面临着诸多挑战。深度学习作为人…...
单独编译QT子模块
单独编译QT子模块 系统 win qt-everywhere-src-5.12.12 下载源码: https://download.qt.io/archive/qt/5.12/5.12.12/single/ 参考: https://doc.qt.io/qt-5/windows-building.html 安装依赖 https://doc.qt.io/qt-5/windows-requirements.html Per…...
学习华为熵减:激发组织活力(系列之三)
目录 为什么学习华为? 学习华为什么? 一、势:顺势而为,在风口上猪都会飞起来。 二、道:就是认识和利用规律层面,文化和制度创新就是企业经营之道。 三、法:就是一套价值管理的变革方法论。…...
CNCF云原生计算基金会
CNCF,全称为云原生计算基金会(Cloud Native Computing Foundation),成立于2015年,是一个隶属于Linux基金会的非营利组织。CNCF旨在促进和支持开源技术的发展,特别是那些支持云原生(cloud native…...
STM32 FreeRTOS时间片调度---FreeRTOS任务相关API函数---FreeRTOS时间管理
目录 时间片调度简介 FreeRTOS任务相关API函数介绍 延时函数介绍 时间片调度简介 在FreeRTOS中,同等优先级的任务会轮流分享相同的CPU时间,这个时间被称为时间片。在这里,一个时间片的长度等同于SysTick中断的周期。 FreeRTOS任务相关API…...
SQL LAST()
SQL中的LAST()函数是一个用于返回指定列中最后一个记录值的函数。然而,需要注意的是,这个函数并不是SQL标准的一部分,因此并不是所有数据库系统都支持它。具体来说,只有MS Access直接支持LAST()函数【0†source】。 在其他数据库…...
云服务信息安全管理体系认证,守护云端安全
在数据驱动的时代,云计算已成为企业业务的超级引擎,推动着企业飞速发展。然而,随着云计算的广泛应用,信息安全问题也日益凸显,如同暗流涌动下的礁石,时刻威胁着企业的航行安全。这时,云服务信息…...
【Hive】新增字段(column)后,旧分区无法更新数据问题
TOC 【一】问题描述 Hive修改数据表结构的需求,比如:增加一个新字段。 如果使用如下语句新增列,可以成功添加列col1。但如果数据表tb已经有旧的分区(例如:dt20190101),则该旧分区中的col1将为…...
C# (图文教学)在C#的编译工具Visual Studio中使用SQLServer并对数据库中的表进行简单的增删改查--14
目录 一.安装SQLServer 二.在SQLServer中创建一个数据库 1.打开SQL Server Manager Studio(SSMS)连接服务器 2.创建新的数据库 3.创建表 三.Visual Studio 配置 1.创建一个简单的VS项目(本文创建为一个简单的控制台项目) 2.添加数据库连接 四.简单连通代码示例 简单连…...
4G DTU赋能智能配电环网柜通信运维管理
在智能电网建设持续推进下,智能配电环网柜作为配电网的关键节点设备,其稳定、高效运行对保障电力可靠供应是品质生活的基本保障。通信系统是实现智能配电环网柜远程监控与管理的核心纽带,而4G DTU(数据传输单元)凭借其…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
