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

news2024/11/13 10:19:06

一 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.coloradmin.cn/o/2142378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】深入理解引用:从基础到进阶详解

🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:C_小米里的大麦的博客-CSDN博客 🎁代码托管:C: 探索C编程精髓,打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、引用的概念 三、常引用&#x…

c++249多态

#include<iostream> using namespace std; class Parent { public:Parent(int a){this->a a;cout << " Parent" << a << endl;} public:virtual void print()//在子类里面可写可不写 {cout << "Parent" <<a<&l…

虚拟机centos_7 配置教程(镜像源、配置centos、静态ip地址、Finalshell远程操控使用)

文章目录 一、下载镜像源&#xff08;准备工作&#xff09;1、开源网站2、下载 二、VMware配置centos三、配置静态IP地址四、Finalshell使用1、下载Finalshell2、连接虚拟机 五、谢谢观看&#xff01; 一、下载镜像源&#xff08;准备工作&#xff09; 1、开源网站 有许多开源…

[Linux]:进程间通信(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. system V通信 前面我们所探究的通信方式都是基于管道文件的&#xff0c;而…

day22JS-npm中的部分插件使用方法

1. 静态资源目录 静态资源目录就是访问服务器的某些路劲时候&#xff0c;服务器可以吐出一个写好的指定页面。 实现思路&#xff1a; 1、先判断要找的路径是否是文件&#xff0c;如果是文件&#xff0c;就加载发给对方。 2、如果是文件夹&#xff0c;找到这个文件夹所在路径中…

STL相关简介

string 看到这个词&#xff0c;相信大家一定都很好奇什么是string&#xff0c;它有什么作用呢&#xff1f;今天&#xff0c;就让我们一起来了解一下关于string的简介吧~ 目录 string 1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的重要性 5. 如何学习STL 6.STL的…

modbus调试助手/mqtt调试工具/超轻巧物联网组件/多线程实时采集/各种协议支持

一、前言说明 搞物联网开发很多年&#xff0c;用的最多的当属modbus协议&#xff0c;一个稳定好用的物联网组件是物联网平台持续运行多年的基石&#xff0c;所以这个物联网组件从一开始就定位于自研&#xff0c;为了满足各种场景的需求&#xff0c;当然最重要的一点就是大大提…

【题解】—— [CSP-J2019 江西] 面积

【题解】—— [CSP-J2019 江西] 面积 [CSP-J2019 江西] 面积题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2 提示 1.思路解析2.AC代码 [CSP-J2019 江西] 面积 通往洛谷的传送门 题目描述 Alice 有一个边长为 a a a 的正方形&#xff0c;Bob 有一个长宽…

【Linux】生产者消费者模型:基于阻塞队列,使用互斥锁和条件变量维护互斥与同步关系

目录 一、什么是生产者消费者模型 二、为什么要引入生产者消费者模型&#xff1f; 三、详解生产者消费者模型 ​编辑 生产者和生产者、消费者和消费者、生产者和消费者&#xff0c;它们之间为什么会存在互斥关系&#xff1f; 生产者和消费者之间为什么会存在同步关系&…

信奥学习规划(CSP-J/S)

CSP-J组学习路线规划 CSP-S组学习规划

AbMole带你解密穿心莲:天然植物中的抗癌新星

在浩瀚的自然界中&#xff0c;隐藏着无数未被完全发掘的宝藏&#xff0c;其中&#xff0c;穿心莲&#xff08;Andrographis paniculata&#xff09;作为一种传统的药用植物&#xff0c;正逐渐展现出其在现代医学研究中的独特魅力。近日&#xff0c;一项发表在《Phytomedicine》…

Jemter项目实战(黑马程序员)

视频网址&#xff1a;02测试数据准备_哔哩哔哩_bilibili 自动化脚本架构搭建 新增和修改 新增 删除和查询 弱压力、高并发、高频率 弱压力测试 高并发 高频率 生成图形化报告

深入理解命令模式:行为设计模式的精髓

在软件设计中&#xff0c;命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装成对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;并且支持请求的排队、记录日志以及撤销操作。命令模式是设计模式中的一种&…

通信工程学习:什么是EPON以太网无源光网络

EPON&#xff1a;以太网无源光网络 EPON&#xff08;Ethernet Passive Optical Network&#xff0c;以太网无源光网络&#xff09;是一种结合了以太网技术和无源光网络&#xff08;PON&#xff09;优势的高速、大容量宽带接入技术。以下是关于EPON的详细解释&#xff1a; 一、…

【经典文献】双边滤波

文章目录 ICCV 1998基本思路双边高斯滤波 ICCV 1998 1995年&#xff0c;Aurich和Weule提出一种非线性高斯滤波器&#xff0c;三年后&#xff0c;Tomasi和Manduchi将其用于图像平滑&#xff0c;并将其命名为双边滤波。 Aurich, V., & Weule, J. (1995). Non-linear Gaussi…

Git常用指令整理【新手入门级】【by慕羽】

Git 是一个分布式版本控制系统&#xff0c;主要用于跟踪和管理源代码的更改。它允许多名开发者协作&#xff0c;同时提供了强大的功能来管理项目的历史记录和不同版本。本文主要记录和整理&#xff0c;个人理解的Git相关的一些指令和用法 文章目录 一、git安装 & 创建git仓…

蓝桥杯-STM32G431RBT6(串口)

前言 一、配置 二、使用步骤 1.串口发送 代码逻辑 效果展示 2.串口接收单个字符 代码逻辑 中断回调函数 3.串口接受字符串 代码逻辑 字符串函数 中断回调函数 声明 代码开源 前言 一、配置 二、使用步骤 1.串口发送 代码逻辑 sprintf(tx_buf,"jin ke\r\n&…

(学习总结17)C++继承

C继承 一、继承的概念与定义继承的概念继承定义1. 定义格式2. 继承基类成员访问方式的变化 继承类模板 二、基类和派生类间的转换三、继承中的作用域隐藏规则 四、派生类的默认成员函数4个常见默认成员函数实现一个不能被继承的类 五、继承与友元六、继承与静态成员七、多继承及…

DFS:二叉树中的深搜

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一. 深搜的总结 二. 二叉树的深搜题目 2.1 计算布尔二叉树的值 2.2 求根节点到叶节点的数字之和 2.3 二叉树剪枝 2.4 验证二叉搜索树 2.5 二叉搜索树中第k小的节点 2.6 二叉树的…

【C++】——继承详解

目录 1、继承的概念与意义 2、继承的使用 2.1继承的定义及语法 2.2基类与派生类间的转换 2.3继承中的作用域 2.4派生类的默认成员函数 <1>构造函数 <2>拷贝构造函数 <3>赋值重载函数 <4析构函数 <5>总结 3、继承与友元 4、继承与静态变…