共识(raft)算法_共识算法-程序员宅基地

技术标签: 算法  

一、引言

Raft是一个共识算法(consensus algorithm),所谓共识,就是多个节点对某个事情达成一致的看法,即使是在部分节点故障、网络延时、网络分割的情况下。这些年最为火热的加密货币(比特币、区块链)就需要共识算法,而在分布式系统中,共识算法更多用于提高系统的容错性。

二、算法介绍

【百度百科】Raft是一种共识算法,旨在替代Paxos。 它通过逻辑分离比Paxos更容易理解,但它也被正式证明是安全的,并提供了一些额外的功能。Raft提供了一种在计算系统集群中分布状态机的通用方法,确保集群中的每个节点都同意一系列相同的状态转换。Raft 通过选举一个高贵的领导人,然后给予他全部的管理复制日志的责任来实现一致性。

Raft通过当选的领导者达成共识。集群中的服务器是领导者或追随者,并且在选举的精确情况下可以是候选者(领导者不可用)。领导者负责将日志复制到关注者。它通过发送心跳消息定期通知追随者它的存在。每个跟随者都有一个超时(通常在150到300毫秒之间),它定期接收领导者的心跳。接收到心跳时重置超时时间。如果没有收到心跳,则关注者将其状态更改为候选人并开始领导选举。

每个 server 都可能会在 3 个身份之间切换:

  • 领导者(Leader
  • 候选者(Candidate
  • 跟随者(Follower

而影响他们身份变化的则是选举。
当所有服务器初始化的时候,都是跟随者,这个时候需要一个领导者,所有人都变成候选者,直到有人成功当选领导者。
在这里插入图片描述

每个节点上都有一个倒计时器 (Election Timeout),时间随机在 150ms 到 300ms 之间。有几种情况会重设 Timeout:

  1. 收到选举的请求
  2. 收到 Leader 的 Heartbeat (后面会讲到)

在 Raft 运行过程中,最主要进行两个活动:

  1. 选主 Leader Election
  2. 复制日志 Log Replication

三、算法详解

1.Raft 算法选主的具体流程:

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

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

第三步,其他收到投票请求且还未投票的Follower节点会向发起者投票,发起者收到反馈通知后,票数增加。
在这里插入图片描述

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

这里需要说明一点,每个节点的超时时间都是不一样的。比如A节点的超时时间是3秒,B节点的超时时间是5秒,C节点的超时时间是4秒。这样一来,A节点将会最先发起投票请求,而不是所有节点同时发起。为什么这样设计呢?设想如果所有节点同时发起投票,必然会导致大家的票数差不多,形成僵局,谁也当不成老大。那么,成为Leader的节点是否就坐稳了老大的位置呢?并不是。Leader节点需要每隔一段时间向集群其他节点发送心跳通知,表明你们的老大还活着。
一旦Leader节点挂掉,发不出通知,那么计时达到了超时时间的Follower节点会转变为Candidate节点,发起选主投票,周而复始…
在这里插入图片描述

2.Raft 算法数据同步流程:

第一步,由客户端提交数据到Leader节点。
在这里插入图片描述

第二步,由Leader节点把数据复制到集群内所有的Follower节点。如果一次复制失败,会不断进行重试。
在这里插入图片描述

第三步,Follower节点们接收到复制的数据,会反馈给Leader节点。
在这里插入图片描述

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

第五步,由Leader节点通知集群内所有的Follower节点提交数据,从而完成数据同步流程。
在这里插入图片描述

四、参考代码

蚂蚁金服开源的JRaft实现比较完美大家可以去看看

这里提供一个简易版的:Raft算法 最简易Java实现

五、总结

Raft 是能够实现分布式系统强一致性的算法,每个系统节点有三种状态 Follower,Candidate,Leader。实现 Raft 算法两个最重要的事是:选主和复制日志。

  1. 每一个 server 最多在一个任期内投出一张选票(有任期号约束),先到先得。
  2. 要求最多只能有一个人赢得选票。
  3. 一旦成功,立即成为领导人,然后广播所有服务器停止投票阻止新得领导产生。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42255430/article/details/128110804

智能推荐

汽车UDS诊断详解及Vector相关工具链使用说明——1.3 诊断响应规则汇总_uds 功能寻址 怎么知道谁响应-程序员宅基地

文章浏览阅读2.1k次。第一篇文章中我们简要提到过服务器接收到客户端的诊断请求后的响应规则,上一篇文章我们详细介绍了诊断请求和响应的流程,现在我们来完整归纳一下服务器的诊断响应规则,即ECU接收到诊断仪的诊断请求后,应该按照哪些规则来决定给出肯定响应还是否定响应,如果给出否定响应,应该使用哪些否定响应码(后文统称NRC)。这部分内容在14229-1-2013版本的7.5章节。一、通用服务响应规则上图是标准给出的通用诊断响应规则。图中被划分为三部分:mandatory 强制的:这部分的规则是标准强制要求遵守的optio_uds 功能寻址 怎么知道谁响应

java web 项目总结_【javaWeb开发工作总结_javaWeb开发个人年终总结】-看准网-程序员宅基地

文章浏览阅读165次。java实训个人总,java实训个人总范文实训已经进行两周多了,还有一周就要正式了,突然发现自己似乎又重蹈覆辙了,再一次一次的不经意中和某些人的就距离却是越来越来大,总是想偷一下懒,总是想着马马虎虎过去算了,没有那么精打细算过。果不经意有些人人开始脱颖而出,有些人开始展露锋芒,而我也开始黯淡下去。我是想好好学学别人的,果画虎不成反类犬。原来我也是不轻易臣服的人,我即便不去领导他们也没有人可以领导我..._web项目工作总结

Linux服务器出现大量的CLOSE_WAIT的问题_linux tomcat close_wait 详情-程序员宅基地

文章浏览阅读5.4k次。Linux服务器出现大量的CLOSE_WAITLinux服务器tcp socket常见的几种状态:ESTABLISHED、TIME_WAIT、CLOSE_WAIT。TCP协议中描述,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。提供网络服务时,需要特别关注两种状态:CLOSE_WAI_linux tomcat close_wait 详情

SystemVerilog学习-03-设计特性与接口_system verilog常用的特性-程序员宅基地

文章浏览阅读763次。设计特性添加接口,将通信和协议检查进一步封装。添加类似c语言的数据类型。添加用户自定义类型,如枚举类型、结构体类型。添加类型转换。添加包(package)从而使得多个设计之间可以共享公共类型和方法。添加方便的赋值操作符和运算操作符,例如++、十=、===。添加priority和uniquecase语句。添加always_comb、always_latch和always_ff等过程语句块。过程语句块SV添加了新的面向硬件的过程语句块,从而使得该语句块可以更清楚地表达设计者的意图。alw_system verilog常用的特性

[email protected]: Permission denied (publickey)_日出东方vs唯我不败博客-程序员宅基地

文章浏览阅读2.8w次,点赞7次,收藏20次。今天在使用命令ssh -T [email protected]测试公钥是否添加成功时,提示:[email protected]: Permission denied (publickey)解决方法方法一:使用默认名字 重新生成密钥对,不指定名字,使用默认名字方法二:使用ssh-agent代理管理git私钥 如果使用的是自己定义的名字 添加本地私钥:ssh-add ~/.ssh/自己定义的名字..._日出东方vs唯我不败博客

No pending exception expected: java.lang.NoClassDefFoundError: Not a primitive type: ‘L‘-程序员宅基地

文章浏览阅读811次。转为Android X 后报错 ,在gradle中引用的是 implementation 'com.jakewharton:butterknife:10.0.0' annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'在使用 10.0 的版本的时候 , 需要添加android { compileOptions { sourceCompatibility..._java.lang.noclassdeffounderror: not a primitive type: 'l

随便推点

java静态绑定&动态绑定详解_java静态绑定概念-程序员宅基地

文章浏览阅读2.2k次。程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定静态绑定: 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。 针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定动态绑定: 后期_java静态绑定概念

学习go语言国内最全资料链接_七米 golang-程序员宅基地

文章浏览阅读571次,点赞5次,收藏4次。就最近和各位大佬认识下来,以前觉得学习go语言,可能资料比较少,可是后来才发现,原来资料并不少,甚至可以说通过大家的努力,go社区已经非常包容且完善了接下来会推荐一些资料,以及大佬社区微软go语言中文网Gopher China golang中国LearnKu自建博客:boyacch码农桃花源七月天面向信仰编程less is betterPure White煎鱼mzh鸟窝峰云就她了luozhiyun`s BlogVincent Blanchon地鼠导航go夜读g_七米 golang

linux+tar怎样解压zip文件内容,linux tar压缩解压文件-程序员宅基地

文章浏览阅读1.7w次。时间:2016-08-30作者:admin 阅读:次-c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。下面的参数-f 是必须的-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。# tar -cf..._tar怎么解压zip文件

一名双非程序媛面试蚂蚁、美团、携程等大厂拿 offer 分享面试过程_双非女后端大厂面经-程序员宅基地

文章浏览阅读184次。今天小编给大家带来一个优秀妹子的后台面试经验总结,希望对正在面试或者以后需要面试的人提供一些参考和帮助。具体如下:本人妹子,985 硕士,211 本科,专业都是软件工程,一直投的是 Java 后台开发,只投过一次网易的测试,技术不是大牛,但是比较努力。实验室没有项目,so 项目经验是 0,在去年这个时候看到实验室师兄找工作的艰难,因此开始复习的时间比较早。最开始先看的 java 基础,看的马某某的视频,后面就看框架视频,后来也看过某某学院的视频,都是在网上找的免费的。..._双非女后端大厂面经

运行成功:char转换为wchar_t的代码_char 转换成 wchar_t-程序员宅基地

文章浏览阅读593次。  具体代码是:int charTowchar(char* pSrc, wchar_t* pDest){ if (pSrc == NULL || pDest == NULL) { return 0; } setlocale(LC_CTYPE, "zh_CN.utf8"); int w_size = mbstowcs(NULL, pSrc, 0) + 1; //w_size=0说明出错了。可能有非法字符,也可能是locale设置不对。_char 转换成 wchar_t

Spring Security最难的地方就是这个了-程序员宅基地

文章浏览阅读3.6k次,点赞6次,收藏6次。本篇摘自胖哥最新的基于Spring Security 5.6.x的《Spring Security干货》教程。旧版的教程将在2022年1月1日下线,请需要的同学尽快通过本公众号回复“202..._configurer.addobjectpostprocessor

推荐文章

热门文章

相关标签