Zookeeper分布式一致性协议ZAB_zk 对客户端是nio吗-程序员宅基地

技术标签: java  zookeeper  分布式  

1、分布式一致性协议ZAB详解

Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持 崩溃恢复 和 原子广播 的协议。整个 Zookeeper 就是在这两个模式之间切换。 简而言之,当 Leader 服务可以正常使用,就进入消息广播模式,当 Leader 不可用时,则进入崩溃恢复模式。

2、zookeeper集群崩溃恢复leader选举流程

半数节点以上同步成功,3/2+1也就是3个节点需要2个节点同步。zk不是实时的强一致性,可以说是顺序一致性。leader挂了,事务id最大的那个节点成为新的主节点(因为他同步的数据最多)。

3、原子广播协议是什么

 ZAB 协议的消息广播过程使用的是一个原子广播协议,类似一个 两阶段提交过程(2PC)。对于客户端发送的写请求,全部由 Leader 接收,Leader 将请求封装成一个事务 Proposal,将其发送给所有 Follwer ,然后,根据所有 Follwer 的反馈,如果超过半数(含leader自己)成功响应,则执行 commit 操作。发送请求会先写到log中,leader收到超过半数ack才会commit写入内存。

4、从create命令来看下zookeeper集群数据同步全流程

通过nio的socketChannel发送到客户端

5、zookeeper链式数据处理器之责任链设计模式剖析

LeaderZooKeeperServer 和 FollowerZooKeeperServer 责任链有一定不同,但整体是类似的 ,leader做过的syncRequest(同步日志到磁盘),ackRequest(发送ack到leader),commit(提交数据到内存),finalRequest(数据到内存,节点变动触发客户端监听) ,follower也要做一遍这些操作。

//LeaderZooKeeperServer
    protected void setupRequestProcessors() {//构建leader请求处理链 -责任链 设计模式
        RequestProcessor finalProcessor = new FinalRequestProcessor(this);
        RequestProcessor toBeAppliedProcessor = new Leader.ToBeAppliedRequestProcessor(finalProcessor, getLeader());
        commitProcessor = new CommitProcessor(toBeAppliedProcessor,
                Long.toString(getServerId()), false,
                getZooKeeperServerListener());
        commitProcessor.start();
        ProposalRequestProcessor proposalProcessor = new ProposalRequestProcessor(this,
                commitProcessor);
        proposalProcessor.initialize();
        prepRequestProcessor = new PrepRequestProcessor(this, proposalProcessor);
        prepRequestProcessor.start();//线程处理消息
        firstProcessor = new LeaderRequestProcessor(this, prepRequestProcessor);

        setupContainerManager();
    }
ProposalRequestProcessor构造器中又初始化了两个Processor
public ProposalRequestProcessor(LeaderZooKeeperServer zks,
            RequestProcessor nextProcessor) {
        this.zks = zks;
        this.nextProcessor = nextProcessor;
        AckRequestProcessor ackProcessor = new AckRequestProcessor(zks.getLeader());
        syncProcessor = new SyncRequestProcessor(zks, ackProcessor);
    }

6、集群数据同步全流程

SyncRequestProcessor

client 发起request create /zhuge 666

Leader的操作 1.1 leader向所有follower发送proposal 1.2 写本地数据文件 1.3 给自己发ack

Follower的操作 2.1 写本地数据文件 2.2 返回ack给Leader

Leader的操作 3.1 leader收到半数以上给所有Follower发送commit 3.2 发送inform让observer存储消息 3.3 commit:写自己的内存数据 3.4  回发节点数据变动通知给客户端,触发客户端client监听事件 3.5 返回客户端命令操作结果   

Follower的操作  4 commit:写自己的内存数据
 
 当leader发完时还没有超过半数以上,等follower发过来超过后会commit。1.1步中发生的proposal是加入到一个leader的queuedPackets队列里了,leader.lead启动时有启动一个线程LearnerHandler run方法种startSendingPackets方法又启动线程 ,将队列中的packet阻塞式poll数据转发给follower 

7、zxid创建流程

这么设计是因为某个leader挂掉后,事务Id在jvm内存中是无法同步的,所以下一次LeaderId+1即可,这样避免了事务Id又重0开始覆盖之前的记录的问题。private final AtomicLong hzxid = new AtomicLong(0); 事务id自增是原子性的

8、客户端Watcher监听机制

客户端用path和wathcer绑定好存到一个集合里,到时服务端(发现节点变动触发监听机制)传回来一个path,客户端就会根据path从wathcer集合里去找相应的watcher。出于性能考虑监听是一次性的,触发一次后在服务端的watcherTable里会remove这个path

9、zk如何使用BIO&NIO&Netty通信

leader和follower选举后的通讯是建立BIO连接(适用于连接数比较少),除开选举的端口是另一个端口。

zk默认使用NIO连接(适用于多个客户端),因为以前Netty有时候不稳定,需要保证系统的稳定。Netty在后期加入,可以手动配置,现在官方是推荐使用netty.

将zoo.cfg文件位置配置到启动参数里

-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory

使用Netty通信

10、zookeeper集群架构如何规避脑裂问题

脑裂(brain-split):脑裂是指在主备切换时,由于切换不彻底或其他原因,导致客户端和follower误以为出现两个leader,最终使得整个集群处于混乱状态。

zookeeper 如果leader挂掉,会进行重新选举,选举周期会+1,就是leaderId会比上一个大,这样可以判断最大的zxid才是最终的leader。就算他后面恢复了,log记录的内容也会被清除掉,因为leaderId不是最大的那个。

11、zookeeper架构设计核心总结

ZAB协议(多节点分布式一致性算法的实现),原子广播,并发消息队列/并发编程,bio/nio通讯,zxid,leader选举(多级内存队列,半数以上),崩溃恢复

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/soulweee/article/details/122495431

智能推荐

idea Debug启动项目半天没反应,但使用run可正常启动,解决方法整理_idea debug运行米反应-程序员宅基地

文章浏览阅读3.5k次,点赞5次,收藏2次。使用idea Debug启动项目10分钟都没启动好项目,但使用run可正常启动,解决方法如下:1、现象:idea debug启动后,卡在如下界面上。2、解决办法如下:经排查,发现是某个方式打了断点,把该断点去掉即可。控制台也有相应的提示。使用ctrl + shift + F8 可打开断点管理界面,把断点全部放开后,则debug启动项目正常,待Debug启动成功后再打上断点。断点管理界面如下,把所有断点的勾选去掉。..._idea debug运行米反应

Excel数据分析—散点图/气泡图_散点图数据实例-程序员宅基地

文章浏览阅读5.2k次。Excel数据分析小技巧,让你快速了解并掌握散点图/气泡图~更有免费实战案例数据供你练习!!!_散点图数据实例

Linux系统中一些目录和文件的详细解释(参照RHEL5.4)-程序员宅基地

文章浏览阅读87次。Linux有四种基本文件系统类型:--普通文件:如文本文件、C语言源代码、shell脚本等,可以用cat、less、more、vi等来察看内容,用mv来改名;--目录文件:包括文件名、子目录名及其指针,可以用ls列出目录文件;--链接文件:是指向一索引节点的那些目录条目,用ls来查看时,链接文件的标志用l开头,而文件后以"->"指向所链接的文件;--特殊文件:如磁盘、终..._linux 5.4.0版本ip地址文件夹

微信小程序:排行榜页面模板_小程序 排行榜素材-程序员宅基地

文章浏览阅读2.9k次,点赞6次,收藏37次。在开发一款背单词的微信小程序时,为了加强用户的体验感,刺激用户积极学习,小程序中需要有的模块。通过打卡天数来排名,让用户有攀比学习的心里。_小程序 排行榜素材

element组件MessageBox 弹框使用和upload上传文件踩坑记录_element upload给出弹窗提示后上传有问题-程序员宅基地

文章浏览阅读1.6k次。1、MessageBox 弹框在做项目的过程中遇到了这样一种情况文字需要换行处理。但是删除一般都用这个,非常的方便且契合,但是对于提示的内容,我试了在字符串里添加 \n 和 \r\n 都没有换行的效果,本来想换一个方法实现,但是不知道为啥,忽然那股觉得一定有解决方法的劲儿又上来了,果然,被我找到了解决方法,感谢这篇博客呀~【element-ui】messageBox弹窗提示消息换行问题..._element upload给出弹窗提示后上传有问题

npm 报错-4048 Error: EPERM: operation not permitted, mkdir ‘XXXX\node_cache\_cacache‘_cnpm -4048-程序员宅基地

文章浏览阅读980次。新电脑刚安装nodejs,使用npm全局安装淘宝镜像时出现问题,以下是我的代码npm install -g cnpm --registry=https://registry.npm.taobao.org报-4048错误:Error: EPERM: operation not permitted, mkdir ‘XXXX\node_cache_cacache’查询到说需要管理员权限安装,找到命令提示符,使用管理员方式打开再进行安装即可成功。..._cnpm -4048

随便推点

Python中requests库中post与get的区别_python request与get区别-程序员宅基地

文章浏览阅读2.7k次。Django中post与get的区别记录下Django中post与get的区别1.post是取页面中提交的值2.get是从数据库中取值_python request与get区别

c语言课程设计-药店管理系统_c语言药店管理系统设计报告-程序员宅基地

文章浏览阅读6k次,点赞28次,收藏151次。这个东东第一次才开始写的时候,脑子都是懵的,把我的方法和解决办法写出来,希望可以对你有一点帮助。逻辑方面可以先想想,我需要这个系统实现什么功能,就药店管理系统来讲,这个我觉得增删改查是必须的,再加一个补货提醒,剩下的就是什么几家药店一起搞,这样用户知道库存和药店位置可以做出最优选择。然后搞了两个端口进行,一个用户端,一个工作人员端口,这样的话显示菜单不同,功能也可以分开实现。(这里可以写三个文本,一个存药店信息,一个存药品信息,一个存所有的用户和工作人员的ID和密码)。代码实现按照运行显示顺序排列代_c语言药店管理系统设计报告

高精度3D点云配准利器:ct_icp-程序员宅基地

文章浏览阅读243次,点赞5次,收藏3次。高精度3D点云配准利器:ct_icp项目地址:https://gitcode.com/jedeschaud/ct_icp项目简介ct_icp 是一个开源的C++库,专注于CT(Computed Tomography)扫描数据和3D点云之间的高精度配准。该项目由Jedéschaud开发并维护,旨在提供一种高效、精确的方法,用于医学影像处理、工业检测等领域中的三维重建和数据分析。技术解析ct...

Javascript 身份证号转字符串为什么不对_身份证号转字符串出现问题-程序员宅基地

文章浏览阅读652次。问题描述从数据库(Mongodb)中取的身份证号是lang类型,需要转换成字符串类型。拿到这个需求的时候没有多想,上来就是toString,+'',类似:var idCardNo = 110105199805241789;var idString = idCardNo + '';// 或者 var idString = idCardNo.toString();console.log(idString,typeof(idString));// 110105199805241800 string_身份证号转字符串出现问题

Metric Learning——度量学习_度量学习的作用-程序员宅基地

文章浏览阅读1.3w次,点赞8次,收藏37次。看到一篇知乎大神Flood Sung发表在CVPR2018上的paper,介绍了一种基于metric的模式识别方法,创新之处在于它不同于常用的matric-based方法,使用人为定义的度量,像简单的欧式距离、马氏距离,而是采用了用神经网络去训练这个度量,模型虽然简单,但是效果却很显著。1、度量(Metric)先说一下关于度量这个概念:在数学中,一个度量(或距离函数)是一个定义集合中元素之间距离的..._度量学习的作用

易懂的Bresenham 布雷森汉姆算法画圆的原理与Python编程实现教程_中点bresenham算法画圆python算法-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏38次。Bresenham 布雷森汉姆算法画圆的原理与编程实现教程注意:Bresenham的圆算法只是中点画圆算法的优化版本。区别在于Bresenham的算法只使用整数算术,而中点画圆法仍需要浮点数。所以我先介绍中点画圆法。中点画圆法看下面这个图,这就是一个像素一个像素的画出来的。我们平常的圆也是一个像素一个像素的画出来的,你可以试试在“画图”这个软件里面画一个圆然后放大很多倍,你会发现就是一些像素..._中点bresenham算法画圆python算法

推荐文章

热门文章

相关标签