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

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

什么是拜占庭将军问题?

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

 

 

 

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

 

 

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

 

莱斯利·兰伯特( 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,一经查实,立即删除!

相关文章

SQL Server 审计

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

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

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

Docker部署运行微服务

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

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

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

Debug ASP.NET Core 2.0源代码

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

我心中的ASP.NET Core 新核心对象WebHost(一)

以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬。(虽然不知道前辈现在在干什么)。一晃就6年过去了,那首 郝云 的《回到那一天》怎么唱来着? 时光一晃,你就三十了。 而我们都变成了老了的程序员 ASP.NET …

Scaffolding Template on Asp.Net Core Razor Page

Scaffolding Template Intro 我们知道在Asp.Net MVC中,如果你使用的EF的DBContext的话,你可以在vs中通过右键解决方案-添加控制器-添加包含视图的控制器,然后vs会根据你选择的Model自动生成相应的CURD的控制器和View,非常便利&…

Hadoop生态hive(一)介绍

一、Hive是什么 起源自facebook由Jeff Hammerbacher领导的团队,构建在Hadoop上的数据仓库框架。设计目的是让SQL技能良好,但Java技能较弱的分析师可以查询海量数据。2008年facebook把hive项目贡献给Apache。 由facebook开源,最初用于解决海量…

使用混合云的SQL Server

近期发布的Microsoft SQL Server 2017,表明Microsoft公司正寻求不断降低其所交付的工具对平台的绑定。在SQL Server 2017中,这一趋势可以从“混合云”(Hybrid Cloud)术语和多平台本质这两个方面得以证实。下面让我们分别一窥这两个…

.NET Core多平台项目模板eShopOnContainers编译手记

之前写了一个功能性的文件上传asp.net core的小程序,加上点七七八八的东西,勉强能够应付了,打算学习一下微软的官方.NET CORE微服务示例https://github.com/dotnet-architecture/eShopOnContainers。这个例子很全面地展现了微服务、docker以及…

如何改变Idea的背景

进入Idea 按下ctrlshifta 点击set background 选择自己准备好的图片地址,就可以更改背景了 更改后效果 关于接口的插件 GsonFormat插件 安装还是和别的插件一样,在plugin里搜索GsonFormat,下载并重启 然后在model里的类 按下alts 出现 将…

TFS在项目中Devops落地进程(上)

作为一名开发,经过近2年折腾,基于TFS的Devops主线工程大体落地完毕。 在此大体回忆下中间的各种历程。 开始之前简单说下什么是TFS(Team Foundation Server)。 TFS是微软推出的一款ALM(Application Lifecycle Management)管理工具。 透过TFS你将能获取到从代码版本管…

Hadoop生态hive(三)Hive QL介绍

一、表 创建表 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name CREATE TABLE 创建一个指定名字的表。Hive 创建内部表时,会将数据移动到数据仓库指向的路径; EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实…

抖音上非常火的旋转图快速部署

本教程不需要你有服务器! 本教程不需要你有服务器! 本教程不需要你有服务器! 点击我看旋转图 总共两步 1、注册一个码云账号 2、新建一个仓库,上传文件即可 1、注册账号的话,直接浏览器搜索码云,手机号…

Microsoft的现代数据管理

PASS 2017峰会是面向SQL Server及Microsoft相关数据技术用户的大会。在大会的第一天,Microsoft的Rohan Kumar先生到场做了开幕式的主题演讲,并借此机会展示了Microsoft在SQL Server和Azure数据库方面的最新进展。 Kumar的演讲涉及数据、人工智能和云这三…

vue 3.4x以上如何改变项目运行端口号

我用3.4版本的vue-cli构建了一个vue项目,然后我想修改项目运行之后的访问端口 在网上查了一下,很多都是2.0的版本,查来查去都说是什么在 config目录下index.js文件中修改端口号。。。。。。。 都抄来抄去的 新的vue项目目录结构下并没有con…

Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

转载自 Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient hive初始化(mysql为元数据库)完成后,执行SQL语句报错 经过各种查询资料,找到了一种解决办法,大家可以参考。 首先进…

Asp.net core应用在 Kubernetes上内存使用率过高问题分析

原文:https://blog.markvincze.com/troubleshooting-high-memory-usage-with-asp-net-core-on-kubernetes/ ps:我不是死板翻译原文的,尽量的通俗一点,如有不对欢迎指出,谢谢哈。 在生产环境中,我们把asp.ne…

vue cli 4.x打包后如何部署到tomcat服务器上

使用npm run build打包好dist后,不能直接打开里面的index.html,否则页面是一片空白 这时候我们就需要用服务器来代理我们的页面,可以使用ningx,tomcat,或者apache,这里我们使用tomcat当作范例 找到tomcat的…

依赖注入和控制反转

概念 IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依赖于谁?为什么需要依赖? 注入:…