分布式与一致性协议之ZAB协议(八)

news2025/1/12 18:54:42

ZAB协议

如何实现读操作

相比写操作,读操作的处理要简单很多,因为接收到度请求的节点只需要查询本地数据,然后响应数据给客户端就可以了。读操作的核心流程如图所示。在这里插入图片描述

  • 1.跟随者在FollowerRequestProcessor.processRequest()中接收到度请求。
  • 2.跟随者在FinalRequestProcessor.processRequest()中查询本地数据,也就是dataTree中的数据,如代码所示
// 处理读请求
case OpCode.getData: {
......
// 查询本地dataTree中的数据
rsp = handleGetDataRequest(getDataRequest, cnxn, request.authInfo);
......
break;
}
  • 3.然后跟随者响应查询到的数据给客户端,如代码所示
case OpCode.getdata: {
......
// 响应查询到的数据给客户端
cnxn.sendResponse(hdr, rsp, "response", path, stat, opCode);
break;
}

至此,ZooKeeper就完成了读操作的处理。这里补充一点,可以将dataTree理解成Raft的状态机,提交的数据最终都存放在dataTree中

ZAB协议与Raft算法

在我看来,ZAB协议和Raft算法很类似,比如主备模式(也即领导者、跟随者模型)、日志必须是连续的、以领导者的日志为准来实现日志一致等。为什么它们比较类似呢?
我的看法是,“英雄所见略同”。比如ZAB协议要实现操作的顺序性,而Raft算法不仅要实现操作的顺序性,还要实现线性一致性,这两个目标决定了它们不能允许日志不连续,且必须按照顺序提交日志,素以,它们要通过上面的方法实现日志的顺序性,并保证达成共识(即提交后的日志不会再改变)。

最后,就ZAB协议和Raft算法做个对比,来具体说说二者的异同。既然要做对比,那么首先要定义对比标准,我们可以这么考虑:你应该有这样的体会,同一个功能,不同的人实现的代码会不一样(比如数据结构、代码逻辑),所以过于细节的比较,尤其是偏系统实现方面的比较,意义不大(比如比较跟随者是否转发写请求到领导者,不仅意义不大,而且这是ZAB协议和Raft算法都没有约定的,是集群系统需要考虑的)。我们可以从核心原理上做对比。

  • 1.领导者选举:ZAB协议采用的是"见贤思齐、相互推荐"的快速领导者选举(Fast Leader Election)算法,Raft算法采用的是"一张选票、先到先得"的自定义算法。在我看来,Raft算法的领导者选举需要通信的消息数更少、选举也更快
  • 2.日志复制:Raft算法和ZAB协议都是以领导者的日志为准来实现日志一致,而且日志必须是连续的,也必须按照顺序提交
  • 3.读操作和一致性:ZAB协议的设计目标是操作的顺序性,在ZooKeeper中默认实现的是最终一致性,读操作可以在任何节点上执行,而Raft算法的设计目标是强一致性(也就是线性一致性),所以Raft算法更灵活,它既可以提供强一致性,也可以提供最终一致性
  • 4.写操作:Raft算法和ZAB协议的写操作都必须在领导者节点上处理
  • 5.成员变更:Raft算法和ZAB协议都支持成员变更(其中ZAB协议是以动态配置的方式实现的),所以在节点变更时,你不需要重启及其,因为集群是一直运行的,服务也不会中断。
  • 6.其他:相比ZAB协议,Raft算法的设计更为简洁,比如Raft算法没有引入类似ZAB协议的成员发现和数据同步阶段,而是当节点发起选举时递增任期编号,在选举结束后广播心跳,直接建立领导关系,然后向各节点同步日志,来实现数据副本的一致性。在我看来,ZAB协议的成员发现可以和领导者选举合到一起,类似Raft算法,在领导者选举结束后直接建立领导者关系,而不是再引入一个新的阶段;数据同步阶段是一个冗余的设计,可以去除。因为ZAB协议无须先实现数据副本的一致性,才可以处理写请求,而且这个设计是没有额外的意义和价值的。
  • 7.另外,ZAB协议与ZooKeeper强耦合,无法在实际系统中独立使用;而Raft算法的实现(比如Hashicorp Raft算法)是可以独立使用的,编程友好

思维拓展

  • 1.在ZAB协议中,主节点是基于TCP协议来广播消息的,且保证了消息接收的顺序性。那么你不妨想想,如果ZAB采用的是UDP协议,能保证消息接收的顺序性吗?为什么呢?
    答案:ZAB(ZooKeeper Atomic Broadcast)协议是ZooKeeper分布式协调服务中用于实现分布式系统间一致性的一种协议。在ZAB协议中,主节点(Leader)负责将消息广播给所有从节点(Followers),确实保证了消息接收的顺序性,这是通过TCP协议的连接性和确认机制来实现的。
    如果ZAB协议采用UDP协议来广播消息,那么消息接收的顺序性将无法得到保证。这是因为UDP(用户数据报协议)是一种无连接的协议,它不保证数据保的顺序、可靠传输或者数据的完整性。在UDP中,数据包(datagrams)可能会丢失、重复或乱序到达。这些特性使得UDP在高速传输但可以容忍一定数据丢失的应用场景中非常有用,比如视频流或在线游戏。

在分布式系统中消息的顺序性是非常重要的,因为它涉及到系统的一致性和状态同步。如果消息顺序无法保证,可能会导致系统状态的不一致,从而影响整个分布式系统的正确性。
因此,如果ZAB协议基于UDP来实现,就需要引入额外的机制来确保消息的顺序性,例如:
1.1 序列号:为每个消息分配一个序列号,接收方根据序列号重新排序消息
1.2 确认和重传:接收方对于收到的消息进行确认,发送方对于未确认的消息进行重传
1.3 选择性重传:只重传哪些确认丢失的消息

这些机制会增加协议的复杂性,并且可能会降低系统的性能。因此,在设计分布式协议时,通常会根据应用的需求来选择合适的传输协议,对于需要强一致性的系统,如ZooKeeper,使用TCP是更合适的选择

  • 2.ZAB协议是通过快速领导者选举来选举出新的领导者的。那么选举中会出现选票被瓜分、选举失败的问题吗?为什么?
    答案:因为存在任期编号大的优先、zxid较大节点优先、zxid相同,服务器id较大的节点优先
  • 3.提案提交的大多数原则和领导者选举的大多数原则,确保了被复制到大多数节点的提案不再改变。那么你不妨思考和推演一下,这是为什么?
    答案:"大多数"原则在提案提交和领导者选举中都起到了确保系统一致性、容错能力和稳定性的关键作用
  • 4.ZooKeeper提供的是最终一致性,读操作可以在任何节点上执行。如果读操作访问的是备份节点,为什么无法保证每次都能读到最新的数据呢?
    答案:有可能备份节点还没有收到领导者的提交响应,所以存在延迟

重点总结

  • 1.ZAB协议是通过"一切以领导者为准"的强领导者模型和严格按照顺序处理、提交提案来实现操作的顺序性的
  • 2.领导者选举的目标是选举出大多数节点中数据最完整的节点,也就是大多数节点中事务标识符值最大的节点。任期编号、事务标识符、集群ID的值的大小决定了哪个节点更适合作为领导者,按照顺序,值最大的节点更适合作为领导者
  • 3.数据同步是通过以领导者的数据为准的方式来实现各节点数据副本的一致性的。需要注意的是,基于"大多数"的提交原则和选举原则能确保被复制到大多数节点并提交的提案不再改变
  • 4.在ZooKeeper中,写请求只能在领导者节点上处理,读请求可以在所有节点上处理,即ZooKeeper实现的是最终一致性。而与领导者"失联"的跟随者(比如发生分区故障时)既不能处理写请求、也不能处理读请求。

你可能会问Paxos算法、Raft算法也都有领导者,难道实现一致性就必须要领导者吗?没有领导者就无法实现一致性吗?其实有些没有领导者的算法也能实现一致性

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

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

相关文章

JavaScript异步编程——04-同源和跨域

同源和跨域 同源 同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。 跨域问题的解决方案 从我自己的网站访问别人网站的内容,就叫跨域。 出于安全性考虑,浏览器不允许ajax跨域获取…

mac监听 linux服务器性能可视化(Grafana+Promethus+Node_exporter)

Grafana和promethus(普罗米修斯)的安装和使用 监控系统的Prometheus类似于一个注册中心,我们可以只需要配置一个Prometheus,而在其他服务器,只需要安装node_exporter,它们的数据流转就是通过exporter采集数据信息,然后告诉prometheus它的位置…

redis分片java实践、redis哨兵机制实现、redis集群搭建

redis分片java实践 linux安装redishttps://mp.csdn.net/mp_blog/creation/editor/134864302复制redis.conf配置文件成redis1.conf、redis2.conf、redis3.conf 修改redis的端口信息和存pid文件的路径。存pid文件的路径只要不同就行了,没什么特别要求。 指定配置文件…

《编译原理》阅读笔记:p1-p3

《编译原理》学习第 1 天,p1-p3总结,总计 3 页。 一、技术总结 1.compiler(编译器) p1, But, before a program can be run, it first must be translated into a form in which it can be executed by a computer. The software systems that do thi…

【文章转载】ChatGPT 提示词十级技巧: 从新手到专家

学习了微博网友宝玉xp老师《ChatGPT 提示词十级技巧: 从新手到专家》 个人学习要点: 1、关于提示中避免使用否定句,播主说:“没有人能准确解释为什么,但大语言模型在你告诉它去做某事时,表现似乎比你让它不做某事时更…

C++语法|如何写出高效的C++代码(一)|对象使用过程中背后调用了哪些方法(构造和析构过程)?

文章目录 再探拷贝构造函数和重载复制运算符实例化新对象和赋值操作强转为类类型指针和引用时临时对象的构造和析构过程 考考你问题答案 再探拷贝构造函数和重载复制运算符 实例化新对象和赋值操作 首先我们写一个类,实现它的拷贝构造并重载赋值运算符。 class T…

算法学习006-瓷砖总数 广度优先算法BFS 中小学算法思维学习 信奥算法解析 c++实现

目录 C瓷砖总数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C瓷砖总数 一、题目要求 1、编程实现 在一个长方形房间,铺着不同颜色的的瓷砖,有红色和黑色&#…

流畅的python-学习笔记_序列修改+散列+切片

vector第一版 reprlib.repr用于选取有限长度较长变量 vector第二版切片 注意切片还有indices属性,它可以入参一个序列长度,根据此序列长度,转化不规矩的start stop stride, vector第三版动态存取属性 obj.attra时,先…

WordPress MasterStudy LMS插件 SQL注入漏洞复现(CVE-2024-1512)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress Plugin MasterStudy LMS 3.2.5 版本及之…

长难句打卡5.6

For H&M to offer a $5.95 knit miniskirt in all its 2,300-plus stores around the world, it must rely on low-wage overseas labor, order in volumes that strain natural resources, and use massive amounts of harmful chemicals. 翻译:H&M若要在其全球总共2…

JavaScript异步编程——05-回调函数

我们在前面的文章《JavaScript 基础:异步编程/单线程和异步》中讲过,Javascript 是⼀⻔单线程语⾔。早期我们解决异步场景时,⼤部分情况都是通过回调函数来进⾏。 (如果你还不了解单线程和异步的概念,可以先去回顾上一…

多模态中的“单流模型”和“双流模型”

多模态预训练模型按照模型结构可以分为单流和双流两种结构。 单流是指图片和文本在embedding之后就融合在一起进入后续的transformer层。【先将信息fusion,然后再用一个model处理】双流是指文本和图片单独享有自己的transformer层,只在最后做轻量的融合…

添砖Java之路其二——基本数据类型,scanner,字符拼接。

目录 基本数据类型: ​编辑 Scanner: 字符拼接: 课后小题: 基本数据类型: 如图可见:Java里面有八种基本数据类型。 注意:在其中我们需要注意的是int默认整型数据,double是默认浮点型数据。因…

IP协议全解析:网络层通信的基石

⭐小白苦学IT的博客主页⭐ ⭐初学者必看:Linux操作系统入门⭐ ⭐代码仓库:Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统❤ 前言 在数字化时代的浪潮中,网络通信无处不在,它连接着世界的每一个角落,承载着信息的高…

OpenNJet产品体验-手把手在Ubuntu20.04系统从零部署到应用OpenNJet

目录 一、引言 二、OpenNJet产品安装 2.1下载OpenNJet安装包 2.2安装OpenNJet V2.0.1 ​2.3快速启动并测试OpenNJet 三、OpenNJet产品应用体验 3.1配置OpenNJet 3.2 部署 Web 应用程序 3.3启动 NJet 3.4访问 Web 应用程序 四、总结 一、引言 OpenNJet应用引擎是高性…

文件加密软件排行榜前四名|好用的四款文件加密软件分享

在数据泄露事件频发的今天,文件加密软件成为了保护个人隐私与企业信息安全的必备工具。 选择一款高效、可靠且易用的加密软件至关重要。 本文精选了当前市场上备受好评的十款文件加密软件,旨在为您在数据保护之旅中提供方向。 1.域智盾 域智盾软件是一…

书单 | 6本AI领域名家名作,大模型时代,趁风而起!

–文末赠书– 大模型时代,想抓住风口吗? 本期书单就来分享6本AI领域名家名作,给大家把大模型时代那些事儿讲清楚! 放心,入门的同学也可以从最基础的学起~~ 快来看看有哪些书吧…… 01 ▊《多模态大模型&#xff1…

【JAVA基础之时间API】自定义时间格式

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.Date类 1.1 概述 1.2 构造方法 1.3 常用方法 2.SimpleDateFormat类 2.1 概述 2.2 构造方法 2.3 格式规则 2.4 常用方法 3.Calendar类 3.1 概述…

SOLIDWORKS Electrical电气元件智能开孔

实际的电气元器件安装中,一些元器件需要穿过孔洞安装,例如按钮、指示灯会在配电柜的控制面板上,需要穿过控制面板安装。这部分内容放在软件建模、装配时,往往比较复杂因为考虑孔的大小符合元器件规格、孔跟随元器件移动、同一元器…

Docker入门篇来啦~

文章目录 1虚拟化技术1.1 硬件级虚拟化1.2 操作系统级虚拟化 2 Docker是什么2.1 Docker介绍2.2 容器和虚拟机的区别2.3 为什么使用Docker 3 Docker运行环境部署3.1 Docker安装3.2 Docker服务启动 4 Docker核心组件4.1 镜像4.1.1 镜像的基本概念4.1.2 镜像的组成结构4.1.3 镜像的…