说一说Zookeeper的应用场景及其原理

一 ZooKeeper简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

二 Zookeeper 主要解决什么问题
在分布式多节点组成的集群环境中,所面临的三个常见的挑战。
第一种:集群管理。为了保证集群的高可用,每个节点都会创建一个数据副本,那么在这种情况下,要保证客户端访问集群中任意一个节点都要是最新的数据;
第二种:分布式锁,对于分布式系统来说,如何去保证共享资源的并发安全性,也是一个比较大的挑战,为了达到这样一个目的,我们必须使用一个跨进程的锁,也就是分布式锁来实现。
第三种:Master选举,在多个节点的集群中,为了去降低集群数据同步的复杂度,一般会将节点设置成两个角色,分别是Master和Slave。Master一般是负责数据的读写等事务性操作,而Slave只负责数据的读操作,如何去确定某个节点是 Master 还是 Salve,也是一件比较复杂的工作。
Zookeeper 的出现,主要是为了满足分布式环境中,以上三种常见的场景的需求。作为一个分布式的中间件而存在,它相当于一个分布式的开源的协调组件,协调和解决分布式系统中的各类问题。

三 Zookeeper分布式协调的基本原理
在这里插入图片描述
Zookeeper的基本原理是通过维护一份类似文件系统的树状数据结构(Znode树),并提供监听这些数据变化的机制,来实现分布式系统的协调。它提供了一种 CP 模型,来保证集群中的每个节点的数据一致性,当然Zookeeper的本身的集群并不是强一致性的,而是一个顺序一致性的一个模型,如果我们需要去保证CP特性的话,我们需要 调用“sync”同步方法来进行同步。

四 Zookeeper分布式锁基本原理

在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题。但当我们的应用是分布式集群工作的情况下,属于多JVM下的工作环境,跨JVM之间已经无法通过多线程的锁解决同步问题。那么就需要一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题——这就是分布式锁。
Zookeeper分布式锁的基本原理主要基于其提供的临时有序节点(Ephemeral Sequential Nodes)和Watch机制来实现。以下是详细的基本原理:

★临时节点:在Zookeeper中,临时节点是在客户端会话期间创建的。一旦客户端与Zookeeper服务器的会话结束(如客户端崩溃、断开连接等),这些临时节点会被自动删除。这一特性确保了如果持有锁的客户端出现问题,锁能够被自动释放,避免了死锁的发生。
★有序节点:每次在相同父节点下创建临时节点时,Zookeeper都会为这些节点添加一个自增的数字作为后缀,以保证节点的有序性。这种有序性使得节点可以按照创建的顺序进行排序。

★在Spring cloud 中可以用curator框架实现分布式锁,见下:
在Curator中有五种锁方案:
InterProcessSemaphoreMutex:分布式排它锁(非可重入锁)
InterProcessMutex:分布式可重入排它锁
InterProcessReadWriteLock:分布式读写锁
InterProcessMultiLock:将多个锁作为单个实体管理的容器
InterProcessSemaphoreV2:共享信号量

五 、 Master选举原理

ZooKeeper的Master选举原理主要基于其提供的节点特性和集群中的投票机制,具体原理如下:

1、选举机制概述
ZooKeeper集群中的每个服务器(节点)都有可能成为Master(也称为Leader),但集群在任何给定时间点只能有一个Master,以确保数据的一致性和服务的稳定性。当集群中的某个节点想要成为Master时,它会通过特定的机制进行选举。

2、基于节点的选举方式
ZooKeeper提供了两种基于节点的选举方式:

★基于临时节点的选举:
所有参与选举的节点会尝试在ZooKeeper中创建一个具有唯一名称的临时节点,如/master-election。
由于ZooKeeper保证同一层级下节点名称的唯一性,因此只有一个节点能够成功创建该临时节点。
成功创建临时节点的节点即被选为Master。
如果Master节点出现故障(如宕机),它创建的临时节点会自动从ZooKeeper中删除,其他节点通过注册Watcher监听该节点的变化,并在监听到变化后重新尝试创建临时节点,从而触发新一轮的选举。
★基于临时有序节点的选举:
所有参与选举的节点在同一父节点下(如/master-election)创建临时有序节点。
ZooKeeper会给这些节点分配一个全局递增的编号,如/master-election/lock-00000001、/master-election/lock-00000002等。
编号最小的节点成为Master。
其他节点会监听编号比自己小的节点的变化。如果Master节点宕机,它创建的临时有序节点会被删除,监听该节点的下一个节点会收到通知,并检查自己是否成为新的编号最小的节点,如果是,则成为新的Master。
3、集群投票与ZAB协议
ZooKeeper的选举机制还依赖于ZAB(ZooKeeper Atomic Broadcast)协议,该协议保证了集群中数据的一致性。在选举过程中,每个节点会进行投票,投票基于过半数原则:

一个节点想要成为Master时,会向其他节点发送一个提议,并等待超过一半的节点同意这个提议。
如果超过一半的节点同意,那么这个节点就会成为Master;否则,它会被否决并继续等待下一次选举。
投票时,节点会考虑其他节点的最新事务ID(zxid)和服务器ID。zxid是一个逻辑时钟,用于标识数据更新的顺序,确保新选出的Master具有最新的数据状态。如果两个节点的zxid相同,则服务器ID更大的节点会获得优先权。

4、选举的公平性和高效性
公平性:通过临时有序节点的编号分配和集群投票机制,确保了选举的公平性,即请求创建节点的顺序与选举结果的顺序基本一致。
高效性:通过Watcher机制和节点编号的有序性,减少了不必要的选举竞争和网络通信开销,提高了选举的效率。
综上所述,ZooKeeper的Master选举原理是一个复杂但高效的过程,它充分利用了ZooKeeper的节点特性和集群中的投票机制,确保了分布式环境下Master节点的选举和切换的高效性和一致性。
目前主流的kfaka,HBase、hadoop 都是用Zookeeper 来实现集群节点的主从选择。

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

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

相关文章

vue3/Element-Plus/路由的使用

我们来实现一个简单的二级路由 1.准备主页和要配置的组件 主页面 <template><!-- 加载配置路由 --><RouterView></RouterView> </template><style scoped></style>组件1 <template><div>考试组件</div> </t…

关于区块链的安全和隐私

背景 区块链技术在近年来发展迅速&#xff0c;被认为是安全计算的突破&#xff0c;但其安全和隐私问题在不同应用中的部署仍处于争论焦点。 目的 对区块链的安全和隐私进行全面综述&#xff0c;帮助读者深入了解区块链的相关概念、属性、技术和系统。 结构 首先介绍区块链…

吉林省自闭症寄宿学校:提供个性化培养方案

在吉林省的怀抱中&#xff0c;隐藏着一片温馨而特殊的天地——星贝育园自闭症儿童寄宿制学校。这里&#xff0c;不是简单的教育场所&#xff0c;而是无数自闭症儿童梦想启航的港湾&#xff0c;是他们感受爱、学习成长、绽放自我光芒的温馨家园。 自闭症&#xff0c;一个逐渐被…

【Python常用模块】_cx_Oracle模块详解

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…

idea插件开发的第四天-完善JSON工具

介绍 Demo说明 本文基于maven项目开发,idea版本为2022.3以上,jdk为1.8本文在Tools插件之上进行开发本次demo将使用idea的一些组件优化 Tools插件说明 Tools插件是一个Idea插件,此插件提供统一Spi规范,极大的降低了idea插件的开发难度,并提供开发者模块,可以极大的为开发者开…

Q必达任务脚本

文章目录 1.购买服务器地址2.部署教程3. 代码如下4. 如何联系我 1.购买服务器地址 服务器购买地址 https://t.aliyun.com/U/rUHk58 若失效&#xff0c;可用地址 https://www.aliyun.com/activity/wuying/dj?source5176.29345612&userCode49hts92d 2.部署教程 2024年最…

鸿蒙OpenHarmony【小型系统基础内核(进程管理任务)】子系统开发

任务 基本概念 从系统的角度看&#xff0c;任务Task是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它任务运行。 OpenHarmony 内核中使用一个任务表示一个线程。 OpenHarmony 内核中同优先级进程内的任务统一调度、运…

群晖使用Docker部署WPS Office并实现异地使用浏览器制作办公文档

文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 想象一下这个场景&#xff1a;如果遇到周末紧急需要改方案&#xff0c;但团队成员都在各自家中&#xff0c;这个时候如果大家能够轻松访问这个…

Unity图形用户界面!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(万字解析)

Unity 3D GUI 简介 游戏开发过程中&#xff0c;开发人员往往会通过制作大量的图形用户界面&#xff08; Graphical User Interface&#xff0c;GUI &#xff09;来增强游戏与玩家的交互性。 Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI等&#xff0c;这些类型的图形系统内容…

仓颉编程入门2,启动HTTP服务

上一篇配置了仓颉sdk编译和运行环境&#xff0c;读取一个配置文件&#xff0c;并把配置文件简单解析了一下。 前面读取配置文件&#xff0c;使用File.readFrom()&#xff0c;这个直接把文件全部读取出来&#xff0c;返回一个字节数组。然后又创建一个字节流&#xff0c;给文件…

Apache James配置连接达梦数据库

项目场景&#xff1a; Apache James配置连接达梦数据库&#xff0c;其他配置中不存在的数据库也可参考此方案。 配置步骤 1、把需要的jar包导入到James 把DmJdbcDriver18.jar复制到下面lib目录下 james-2.3.2\lib 2、 修改连接配置 james-2.3.2\apps\james\SAR-INF\confi…

Dockerfile部署xxljob

使用Dockerfile部署xxljob 1. 背景 我们在使用定时任务调度时&#xff0c;通常会使用xxljob容器化部署xxljob&#xff0c;通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说&#xff0c;没有任何问题。但是在arm架构的服…

springboot项目引入了第三方jar包

应该把jar包放在resource目录下&#xff0c;新建一个lib目录放进去&#xff0c;不然打包的时候会报错找不到jar包&#xff0c;放入jar包&#xff0c;右键添加到库&#xff0c;才可以使用。 _g().startMarquee();

MapReduce基本原理

目录 整体执行流程​ Map端执行流程 Reduce端执行流程 Shuffle执行流程 整体执行流程 八部曲 读取数据--> 定义map --> 分区 --> 排序 --> 规约 --> 分组 --> 定义reduce --> 输出数据 首先将文件进行切片&#xff08;block&#xff09;处理&#xff…

【C语言】猜数字游戏

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 前言1. 随机数生成1.1 rand1.2 srand1.3 time1.4 设置随机数的范围 2. 猜数字游戏实现2.1 游戏菜单2.2 主函数部分2.3 game函数部分2.4 附代码2.5 优化代码 前言 前面学习的这些知识&#xff0c;我们就可以写一些稍微…

常见统计量与其抽样分布

什么是统计量 我们首先给出统计量的定义:设 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X1​,X2​,⋯,Xn​ 为来自于总体X的一个样本&#xff0c; g ( X 1 , X 2 , ⋯ , X n ) g(X_1,X_2,\cdots,X_n) g(X1​,X2​,⋯,Xn​) 为关于 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X…

C++ STL容器(三) —— 迭代器底层剖析

本篇聚焦于STL中的迭代器&#xff0c;同样基于MSVC源码。 文章目录 迭代器模式应用场景实现方式优缺点 UML类图代码解析list 迭代器const 迭代器非 const 迭代器 vector 迭代器const 迭代器非const迭代器 反向迭代器 迭代器失效参考资料 迭代器模式 首先迭代器模式是设计模式中…

linux网络编程7

24.9.24学习目录 一.网络通信过程&#xff08;续&#xff09;1.路由器 二.原始套接字&#xff08;SOCK_RAW&#xff09;1.创建原始套接字2.数据包解析 一.网络通信过程&#xff08;续&#xff09; 1.路由器 路由器是用于连接多个逻辑上分开的网络&#xff1b; 具有判断网络地…

React-Native 中使用 react-native-image-crop-picker 在华为手机上不能正常使用拍照功能

背景: React-Native 0.66 中使用 react-native-image-crop-picker 在安卓 华为手机上不能正常使用拍照功能, 其他品牌正常 代码如下: import ImagePicker from react-native-image-crop-picker;ImagePicker.openCamera(photoOptions).then(image > {callback(image);}) …

不靠学历,不拼年资,怎么才能月入2W?

之前统计局发布了《2023年城镇单位就业人员年平均工资情况》&#xff0c;2023年全国城镇非私营单位和私营单位就业人员年平均工资分别为120698元和68340元。也就是说在去年非私营单位就业人员平均月薪1W&#xff0c;而私营单位就业人员平均月薪只有5.7K左右。 图源&#xff1a;…