漫画:什么是拜占庭将军问题

转载自 漫画:什么是拜占庭将军问题

什么是拜占庭将军问题?

在很久很久以前,拜占庭是东罗马帝国的首都。那个时候罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信使传递消息。

 

 

 

在打仗的时候,拜占庭军队内所有将军必需达成一致的共识,才能更好地赢得胜利。但是,在军队内有可能存有叛徒,扰乱将军们的决定。

 

 

这时候,在已知有成员不可靠的情况下,其余忠诚的将军需要在不受叛徒或间谍的影响下达成一致的协议。

 

莱斯利·兰伯特( Leslie Lamport )通过这个比喻,表达了计算机网络中所存在的一致性问题。这个问题被称为拜占庭将军问题。

 

 

 

 

 

 

 

 

什么是 Raft 算法?

 

Raft 算法是一种简单易懂的共识算法。它依靠 状态机 和 主从同步 的方式,在各个节点之间实现数据的一致性。

 

在学习Raft算法的时候,大家需要了解Raft的两个核心要点:

 

1.选取主节点

 

2.同步数据

 

 

不难理解,使用主从同步的方式,可以让集群各个节点的数据更新以主节点为准,从而保证了一致性。那么,如何选取主节点呢?

 

 

 

 

 

 

 

 

我们的出生,离不开无数小蝌蚪之间的激烈竞争。在竞争的过程中,某个速度最快运气最好的小蝌蚪最终胜出,让我们诞生到了这个世界。

 

同样道理,Raft算法在选择主节点的过程中,也是通过多个节点之间的投票竞争。

 

说到这里,不得不说一下Raft算法的状态机。Raft算法为节点定义了三种角色:

 

1.Leader(主节点)

2.Follower(从节点)

3.Candidate(参与投票竞争的节点)

 

让我们来看一看选主的具体流程:

 

第一步,在最初,还没有一个主节点的时候,所有节点的身份都是Follower。每一个节点都有自己的计时器,当计时达到了超时时间(Election Timeout),该节点会转变为Candidate。

 

 

 

 

 

第二步,成为Candidate的节点,会首先给自己投票,然后向集群中其他所有的节点发起请求,要求大家都给自己投票。

 

 

 

 

 

第三步,其他收到投票请求且还未投票的Follower节点会向发起者投票,发起者收到反馈通知后,票数增加。

 

 

 

 

第四步,当得票数超过了集群节点数量的一半,该节点晋升为Leader节点。Leader节点会立刻向其他节点发出通知,告诉大家自己才是老大。收到通知的节点全部变为Follower,并且各自的计时器清零。

 

 

 

 

这里需要说明一点,每个节点的超时时间都是不一样的。比如A节点的超时时间是3秒,B节点的超时时间是5秒,C节点的超时时间是4秒。这样一来,A节点将会最先发起投票请求,而不是所有节点同时发起。

 

为什么这样设计呢?设想如果所有节点同时发起投票,必然会导致大家的票数差不多,形成僵局,谁也当不成老大。

 

那么,成为Leader的节点是否就坐稳了老大的位置呢?并不是。Leader节点需要每隔一段时间向集群其他节点发送心跳通知,表明你们的老大还活着。

 

 

 

 

一旦Leader节点挂掉,发不出通知,那么计时达到了超时时间的Follower节点会转变为Candidate节点,发起选主投票,周而复始......

 

 

 

 

 

 

 

 

 

让我们来看一看数据同步的流程:

 

第一步,由客户端提交数据到Leader节点。

 

 

 

 

 

第二步,由Leader节点把数据复制到集群内所有的Follower节点。如果一次复制失败,会不断进行重试。

 

 

 

 

 

第三步,Follower节点们接收到复制的数据,会反馈给Leader节点。

 

 

 

 

第四步,如果Leader节点接收到超过半数的Follower反馈,表明复制成功。于是提交自己的数据,并通知客户端数据提交成功。

 

 

 

 

第五步,由Leader节点通知集群内所有的Follower节点提交数据,从而完成数据同步流程。

 

 

 

 

 

共识算法的应用场景?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Paxos 算法:

早期的共识算法,由拜占庭将军问题的提出者 Leslie Lamport 所发明。谷歌的分布式锁服务 Chubby 就是以 Paxos 算法为基础。

 

 

ZAB 算法:

Zookeeper 所使用的一致性算法,在流程上和 Raft 算法比较接近。

 

 

PBFT 算法:

区块链技术所使用的共识算法之一,适用于私有链的共识。


 

 

 

 

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

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

相关文章

欢乐纪中某A and B组赛【2019.1.23】

前言 翻车的更惨 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC2929292017myself2017myself2017myself1601601607070700009090903636362017zyc2017zyc2017zyc1401401407070701010106060605454542017lw2017lw2017lw10010010050505000…

2019年度总结

还有两天就是2020年了,因此写一篇年度总结吧,以后争取每年都会写一篇的。 2019年回顾: 收获 2019年真是神奇的一年,对我而言,这一年收获的东西非常多,是我真正的入门编程的一年。 从二月份入门java到现在…

SQL Server 审计

审计(Audit)用于追踪和记录SQL Server实例或数据库中发生的事件,审计主要包括审计对象(Audit)和审计规范(Audit Specification),创建审计首先需要创建一个SQL Server 实例级的审计对…

Hadoop入门(十九)Mapreduce的最大值程序

一、简介 最大值是统计中最常使用到的,现在使用Mapreduce在海量数据中统计数据的最大值。 二、例子 (1)实例描述 给出三个文件,每个文件中都存储了若干个数值,求所有数值中的最大值。 样例输入: …

jzoj3913-艰难的选择【差分,统计】

正题 题目大意 一个01串&#xff0c;求最长的子串使得0和1都相等。 解题思路 维护差分数组zzz&#xff0c;vixv_ixvi​x表示iii最早出现在差分数组的那个数字。枚举尾部&#xff0c;用viv_ivi​ codecodecode #include<cstdio> #include<algorithm> #include<…

ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理

本博文翻译自&#xff1a; https://dotnetcoretutorials.com/2017/10/16/owasp-top-10-asp-net-core-broken-authentication-session-management/ 在我们之前关于OWASP Top 10的文章中&#xff0c;我们讨论了SQL注入。SQL注入有一个非常明确的解释和例子&#xff0c;但这次我们…

Hadoop入门(二十)Mapreduce的最小值程序

一、简介 最小值是统计中最常使用到的&#xff0c;现在使用Mapreduce在海量数据中统计数据的最小值。 二、例子 &#xff08;1&#xff09;实例描述 给出三个文件&#xff0c;每个文件中都存储了若干个数值&#xff0c;求所有数值中的最小值。 样例输入&#xff1a; …

jzoj3914-人品问题【树形dp】

正题 题目大意 一棵树每个点有权值&#xff0c;选择kkk个点&#xff0c;要求选子节点之前必须要选父节点。求最大权值。 解题思路 树形背包限制一下必须选kkk个就好了 codecodecode #include<cstdio> #include<algorithm> #include<cstring> #define N 11…

Docker部署运行微服务

1、环境准备&#xff1a; 主机&#xff1a; X-shell X-ftp jar包 这里只说下jar包&#xff0c;另外两个到官网下载即可 Idea打包jar包流程 先按这四步走 先点击左下的框框&#xff0c;再点击maven&#xff0c;出现右边的窗口&#xff0c;点击clean&#xff0c;再点击package&…

Hadoop入门(二十一)Mapreduce的求和程序

一、简介 求和是统计中最常使用到的&#xff0c;现在使用Mapreduce在海量数据中统计数据的求和。 二、例子 &#xff08;1&#xff09;实例描述 给出三个文件&#xff0c;每个文件中都存储了若干个数值&#xff0c;求所有数值中的求和。 样例输入&#xff1a; …

欢乐纪中某B组赛【2019.1.24】

前言 划水AKAKAK 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017myself2017myself2017myself3003003001001001001001001001001001001112017xjq2017xjq2017xjq3003003001001001001001001001001001009992017zyc2017zyc2017zyc26…

.net ef core 领域设计代码转换(上篇)

一、前言 .net core 2.0正式版已经发布几个月了&#xff0c;经过研究&#xff0c;决定把项目转移过来&#xff0c;新手的话可以先看一些官方介绍 传送门&#xff1a;https://docs.microsoft.com/zh-cn/dotnet/core/ 由于在领域设计模型上遇到了一些坑&#xff0c;故给大家分享出…

NAT是什么?它有什么功能?值不值得我们去学习?我们该如何去学习呢?

NAT是网络地址转换&#xff08;Network Address Translation&#xff09;的缩写&#xff0c;是一种用于将私有网络内部IP地址转换为公共网络IP地址的技术。NAT最初被设计用于解决IPv4地址短缺的问题&#xff0c;但现在也被广泛用于在家庭和企业网络中共享单个公共IP地址。 NAT…

Hadoop入门(二十二)Mapreduce的求平均值程序

一、简介 求平均值是统计中最常使用到的&#xff0c;现在使用Mapreduce在海量数据中统计数据的求平均值。 二、例子 &#xff08;1&#xff09;实例描述 给出三个文件&#xff0c;每个文件中都存储了若干个数值&#xff0c;求所有数值中的求平均值。 样例输入&#xff1a; …

mysql添加新用户

新建用户 create user ‘kejin’‘localhost’ identified by ‘123456’; 删除用户 DROP USER ‘kejin’‘localhost’; 为所有数据库/表赋予 CREATE 和 INSERT 权限&#xff1a; GRANT CREATE, INSERT ON . TO ‘myuser’‘localhost’; 验证给用户赋予的全权限&#xff…

jzoj1610(初中)-导弹【最大匹配,最短路,二分答案】

正题 题目大意 有KKK个点&#xff0c;NNN个点a∈Aa\in Aa∈A&#xff0c;MMM个点b∈Bb\in Bb∈B。 给x∈Bx\in Bx∈B点集匹配一个y∈Ay\in Ay∈A点集的点&#xff0c;使他之间的最长最短路径最短。 解题思路 FlodyFlodyFlody暴力预处理最短路&#xff0c;然后二分答案midmidmi…

Debug ASP.NET Core 2.0源代码

首先你的VS必须为VS 2017 15.3或以上版本。 打开你的Startup类&#xff0c;在ConfigureServices方法上设置个断点&#xff0c;按F5 Debug应用。 在Call Stack&#xff08;调用堆栈&#xff09;窗口&#xff0c;我们只能看到自己的代码。打开VS tools&#xff08;工具&#xff…

Hadoop入门(二十三)Mapreduce的求数量最大程序

一、简介 在文件中统计出现最多个数的单词&#xff0c;将其输出到hdfs文件上。 二、例子 &#xff08;1&#xff09;实例描述 给出三个文件&#xff0c;每个文件中都若干个单词以空白符分隔&#xff0c;需要统计出现最多的单词 …

解决微服务在docker上部署后无法连接数据库的问题

在利用docker部署完应用程序后&#xff0c;就接着考虑如何将程序连接到数据库。 但是过程中发现一些问题&#xff1a; 本地程序在打包后连接的是本地的数据库&#xff0c;在服务器上部署之后必须提供相同的环境才能部署成功。 这里博主用的是宝塔安装的mysql&#xff0c;并尝…

P3365,jzoj3894-改造二叉树【LIS,BST】

正题 题目大意 一棵二叉树&#xff0c;有点权。求修改最少的点使得这是一个BSTBSTBST。 解题思路 二叉查找树满足点权的中序单调递增。 所以跑一遍中序遍历&#xff0c;就变为了求修改多少遍使一个序列单调递增。 求最长上升就好了。可是要求修改的是整数&#xff0c;所以需…