拜占庭问题

1982年 ,Lamport与另两人共同发表了论文提出了一种计算机容错理论,为了描述这个理论中的问题,假设了一个问题相关的故事场景,如下:

拜占庭帝国有许多支军队,不同军队的将军之间必须制订一个统一的行动计划,从而做出进攻或者撤退的决定,同时,各个将军在地理上都是被分隔开来的,只能依靠军队的通讯员来进行通讯。然而,在所有的通讯员中可能会存在叛徒,这些叛徒可以任意篡改消息,从而达到欺骗将军的目的。

这就是著名的拜占庭问题,而这个问题就和分布式场景下异步系统和不可靠的协议中达到一致性类似,后来Lamport 在 1990年提出了一个理论上的一致性解决方案,茼时给出了严格的数学证明,Paxos算法由此而生。

Paxos算法

我们首先来看一下,对于一个一致性算法来说,我们应该满足哪几点:

1.所有提出的提案最终只有一个被选定

2.如果没有提案,那么最终没有任何选定的提案

3.当提案被选定后,所有客户端都应该能获取到提案信息

在Paxos算法中,有Proposer、Acceptor以及Learner三种角色,彼此之间通过收发消息来实现通信。在分布式场景下,Acceptor绝不可能只有一个实例存在,防止出现单机故障,因此我们需要满足,多个Acceptor的情况下完成选举操作,因此我们可以指定Proposer都向一个Acceptor集合中发送提案,而这个集合中的所有的Acceptor都可能批准提案,当有足够多的Acceptor批准提案的时候,我们就认为这个提案被选定,而所谓的足够多,只需要满足当前Acceptor集合中的大半Acceptor批准提案即可,并且我们规定每个Acceptor在一次选举过程中,只可以批准一个提案。

算法过程

整个Paxos算法的过程可以总结为两阶段提交的算法执行过程,分为Prepare请求阶段和Accept请求阶段,大体的过程如下:

Prepare阶段:

Proposer会选择一个提案,并且编号为M0,然后向Acceptor集合中发送M0编号的Prepare请求,如果这个时候Acceptor集合中的某个Acceptor收到了这个请求,并且编号M0比当前已经相应的所有的提案的最大编号还要大,那么Acceptor就需要反馈自己处理的最大编号,并且不会再去响应低于M0编号的任何请求。如果没有响应过请求,则会直接响应当前的M0编号的请求。

Accept阶段:

同样的,当Proposer发出的提案请求收到了来自整个Acceptor集合中的过半Acceptor的响应,那么就代表该提案可以生成,这个时候如果响应中过半是无任何提案信息的,则代表当前的提案的取值可以是任意值,如果响应中过半是其他的提案信息,那么则从中找到最大编号的提案的值,这里称为V0,组成**[M0,V0]的Acceptor请求,再次发送给整个Acceptor集合。这个时候Acceptor如果没有通过大于v4sp**  编号的提案,那么则会视为自动同意该提案,同样如果得到了过半数的同意,则当前提案视为通过。

当然在整个过程中,每个Proposer都有自己的周期定时生成不同的提案,并且严格按照上述过程运行,最终一定能保证算法的正确性,同样的,如果Proposer已经要生成更大编号的提案,Accept将收到的最大的编号信息通知给上一个同意的最大提案的Proposer,让其放弃自己的提案,选择最新的最大编号的提案即可。

Zab协议

看了前面的Paxos算法,我们可能会认为Zookeeper就是基于Paxos算法的实现,但是事实上,Zookeeper并不是完全采用的Paxos,而是一种名为Zookeeper Atomic Broadcast,简称ZAB协议的一种支持奔溃恢复的协议作为数据一致性核心算法。ZAB协议定义整个Zookeeper中关于事物消息的处理流程,大致如下:

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)

分享

这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!

Spring Cloud实战

Spring Boot实战

面试题整理(性能优化+微服务+并发编程+开源框架+分布式)

图片转存中…(img-enHcaQhk-1711088630496)]

面试题整理(性能优化+微服务+并发编程+开源框架+分布式)

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: