文章目录

  • 1. 整体介绍
  • 2. Raft 协议主要实现思路
  • 3. 基本概念介绍
    • 3.1 服务状态机
    • 3.2 任期(Term)
    • 3.3 脑裂
    • 3.4. Master-Slave模式
  • 4. Raft的3个独立子问题
    • 4.1 领导者选举(Leader Election)
    • 4.2 日志复制(Log Replication)
    • 4.3 安全性约束(Safety)

1. 整体介绍

  与Paxos不同,在满足类似一致性功能的前提下,Raft一致性协议的主要目标有2个,1是可理解性,2是系统的可实现性。Raft对于每个技术细节都有清晰的界定和描述,这也便于更加明确的进行系统的实现。

2. Raft 协议主要实现思路

  Raft 协议为了实现上述2个目标,主要有以下2个思路:

  1. 将整个一致性协议划分成明确的3个子问题,分别是:领导者选举、Log复制与安全性。
  2. 将Paxos的P2P模式改造为Master-Slave模式。

3. 基本概念介绍

  为了后续更加深入的理解,先了解以下基本概念。

3.1 服务状态机

  • 在任意时刻,集群中的服务器只会处于3种状态之一:Leader、Follower和Candidate;
  • 正常状态下,集群中只有1个处于Leader状态的服务器充当领导者,负责响应所有客户端;
  • 其他服务器都处于Follower状态,被动接收RPC消息,不主动发任何消息;
  • Candidate状态是Follower状态服务器准备发起新的领导者选举前需要转换到的状态;

  状态转换图如下:

3.2 任期(Term)

  Raft将整个系统执行时间划分为若干过不同时间间隔长度的时间片段构成的序列,每个片段成为1个Term,Term为递增数字。

  • 每个Term由选举(Election)开始,在这个时间内若干处于Candidate状态的服务器视图竞争新的领导者;
  • 如果某个服务器赢得了选举,则在这个Term接下来的时间里充当新的领导者;
  • 可能存在由于选票分流导致在某些Term内没有成功选举出新的领导者;
  • Raft协议可以保证在1个Term内最多会有1个服务器会被选举成新的领导者;

  Term序列图如下:

3.3 脑裂

  系统中同时有多余一个领导者,被称之为脑裂(brain split),这是非常严重的问题,会导致数据的覆盖丢失。

  Raft的以下两点保证了这个属性:

  1. 一个节点某一任期内最多只能投一票;
  2. 只有获得大多数投票的节点才会成为领导者;

3.4. Master-Slave模式

  前面有提到,Raft协议是将Paxos的P2P模式改造为Master-Slave模式,Paxos的复杂性一大部分原因是P2P模式造成的,多个并发进程间没有主次关系,具有同等地位,承担多种角色,Raft通过选举领导者,进行了模式转化,简化了一致性的维护问题,如果领导者失效,会重新选出新的领导者继续后续任务。

4. Raft的3个独立子问题

4.1 领导者选举(Leader Election)

  Raft的选举基于心跳机制,整个系统启动时所有服务器处于Follower状态,除非服务器接收到处于Leader或Candidate状态服务器发出的RPC命令,否则会一直维持之前的状态不变。

  Leader会周期性的向所有节点发送心跳包来维持自己的权威。如果Follower经过一个时间段(选举超时时间)没有接收到任何的心跳信息,可以认为领导者已经不复存在,触发新的Leader选举过程。

  选举前,准备以下事宜:

  1. Follower增加其Term编号,转入Candidate状态;
  2. 向所在集群内所有其他服务器发出RequestVote RPC消息;

  接下来会一直处于Candidate状态,等待以下情况发生:

  1. 赢得本次选举;
  2. 另外1个服务器S宣称并确认自己是新的领导者;
  3. 经过一定时间后,仍然没有新的领导者产生,进入下一个Term;

  下面对于以上3种情况,进行详细的解读

  • 情况1:如果Candidate接收到的大多数其他具有相同Term的服务器的投票,则赢得选举成为新的领导者,然后向其他服务器发送RPC心跳,宣布并维护其领导者地位。这里顺便说下,投票服务器智能将选票投给其中的一个选举者。

  • 情况2:Candidate在等待过程中可能会接收到新的RPC消息,这是另外一个服务器宣称自己是新的领导者而发出的。如果这个RPC里面的Term编号大于等于Candidate自身的Term编号,则Candidate承认这个新的领导者有效,自己转为Follower状态。否则Candidate拒绝承认新的领导者,并维持Candidate状态。

  • 情况3:如果出现平票的情况,大家都在等待,直到超时,然后重新发起选举。这样也延长了系统的不可用的时间,因此raft引入了领导者选举超时机制来尽量避免平票的情况,同时在leader-based共识算法中,节点的数目都是奇数个,也尽量保证了领导者的出现。

4.2 日志复制(Log Replication)

  所有的客户端请求都由领导者来负责响应。

  1. 领导者接收到客户端的操作命令后,将其作为新项目追加到Log尾部;
  2. 向集群内所有其他服务器发出AppendEntries RPC请求,引发其他服务器复制新的操作命令;
  3. 当其他服务器安全复制了新的操作命令后,领导者将这个操作命令应用到内部状态机,将执行结果返回给客户端;

  服务器的Log结构图如下:

  上图每个Log中包含2项内容:

  • 操作命令
  • Term编号:这是领导者接收到操作命令时的Term标识

  同时,还有一个全局索引来指示Log项目在Log中的顺序编号。

  领导者会决定哪些Log项目可以安全的应用到状态机上,应用到状态机上的项目被称为已经提交的项目。

  Raft保证了这些已提交项目的持久化存储以及让所有的服务器都按相同的顺序执行这些操作命令。

  Raft通过以下2个措施来保证一致性协议的安全要求:

  1. 不同服务器的Log中,如果2个Log项目具有相同的全局索引编号以及相同的Term编号,则这2个项目对应的操作命令也一定相同;
  2. 不同服务器的Log中,如果2个Log项目具有相同的全局索引编号以及相同的Term编号,那么Log中这个项目之前的所有前趋Log项目都完全相同;

4.3 安全性约束(Safety)

  虽然以上2个措施能够保证一般情况下Raft的正常运行,但无法做到完全的安全性保证,即无法保证每个状态机都按相同的顺序执行相同的操作命令。

  我们举例来说明,假设在领导者提交几个操作命令期间某个Follower处于失效状态,这个Follower回复后被选举成了新的领导者,这个时候新的领导者就会用自己的Log覆盖旧的领导者的Log信息,此时就无法达到安全性保证,旧的领导者已经将其新增的操作命令体现到了自己的状态机上,新的领导者并未存储这些操作命令,所以其他服务器也不可能应用这些操作序列,导致状态机出现不一致状态。

  为了达到真正的安全性,Raft增加了如下2个约束条件:

  1. 约束条件限制了哪些服务器可以被选举成为领导者,要求只有其Log包含了所有已经提交的操作命令的那些服务器才有权被选举成为新的领导者;
  2. 约束条件限制了哪些操作命令的提交可以被认为是真正的提交,对于新的领导者来说,只有它自己已经提交过当前Term的操作命令,才被认为是真正的提交;

  当然,Raft协议可能仍然存在特殊情况下安全性无法保证的情况,它依旧有能够进一步改善和完善的地方。


  参考文章

https://zhuanlan.zhihu.com/p/404786050
https://blog.csdn.net/yangmengjiao_/article/details/120191314
https://www.cnblogs.com/sfzlstudy/p/16015450.html
https://blog.csdn.net/joyblur/article/details/119323442
https://github.com/etcd-io/etcd/tree/main/raft

大数据基础(5) - Raft协议相关推荐

  1. 大数据基础(4) - Paxos协议

    文章目录 1. 整体介绍 2. Paxos 协议产生的背景 3. 副本状态机模型 4. 基本概念 5. Paxos 协议过程 5.1 准备阶段(占坑阶段) 5.2 接受阶段(提交阶段) 5.3 Pax ...

  2. hawk大数据基础知识总结(1)

    一.大数据概述 1.1大数据的概念 大数据一共具有三个特征:(1)全样而非抽样:(2)效率而非精确:(3)相关而非因果. (1)在过去由于缺乏获取全体样本的手段,人们发明了"随机调研数据&q ...

  3. 大数据基础——Hadoop大数据平台搭建

    文章目录 前言 Hadoop大数据平台搭建 一.Hadoop原理和功能介绍 二.Hadoop安装部署 三.Hadoop常用操作 总结 前言 分布式机器学习为什么需求大数据呢?随着海量用户数据的积累,单 ...

  4. 大数据基础教程丨TiDB数据库从入门到实践

    TiDB 是一款定位于联机事务处理/联机分析处理( HTAP: Hybrid Transactional/Analytical Processing)的融合型数据库产品,实现了一键水平伸缩,强一致性的 ...

  5. 大数据基础知识(上)

    大数据基础知识:技巧与概念 什么是大数据 数量多 流转快 种类多 大数据需要具备全部三个特征吗? 如何使用大数据 了解消费者大数据 了解企业大数据 了解科学研究大数据 大数据与数据科学 大数据与小数据 ...

  6. 大数据基础之Hadoop(三)—— MapReduce

    作者:duktig 博客:https://duktig.cn (文章首发) 优秀还努力.愿你付出甘之如饴,所得归于欢喜. 本篇文章源码参看:https://github.com/duktig666/b ...

  7. 星环科技将上市:募资近20亿 成国产大数据基础软件第一股

    雷递网 雷建平 9月23日 星环信息科技(上海)股份有限公司(简称:"星环科技")已进入发行阶段,准备在科创板上市. 一旦在科创板上市,星环科技将成为国产大数据基础软件第一股. 星 ...

  8. 大数据基础入门 ------文章来源于:某个入门课程

    文章目录 第一课:大数据基础入门 什么是大数据? java和大数据的关系 学习大数据需要的基础和路线 第二课:Hadoop的背景起源 一 分布式存储 如何解决大数据的存储?(HDFS) 第三课: ha ...

  9. 大数据基础技术和应用

    大数据概述 数据的表现形式: 线下数据信息化:数据库.文字记录.照片-- 互联网-移动互联网:网页数据.用户行为记录.数字图像-- 传感器:设备监控.智能家居.摄像头-- 大数据的4V特征: 大量化( ...

最新文章

  1. CSS 布局:40个教程、技巧、例子和最佳实践
  2. Hibernate 缓存
  3. QT的QAssociativeIterable类的使用
  4. Android之项目推荐使用的第三方库
  5. cannot load php5,Cannot load php5apache2_4.dll into server解决办法
  6. java scri p t_深入浅析JavaScript中数据共享和数据传递_javascri
  7. android studio第三方调试,Android Studio直接运行调试签名包
  8. 【Java】图解 Spring 循环依赖,写得太好了
  9. protobuf android ndk,直接在Android NDK端使用tensorflow(不使用JAVA api)
  10. spring注解方式配置以及spring4的泛型注入 (4)
  11. catalina.log localhost.log localhost_access_log.txt manager.log tomcat-stdout.log 文件占用过大,处理方式
  12. 心理很难受,无法平静!
  13. 工薪族巧理财之定期存款中整存整取、零存整取、存本取息之间的微妙区别
  14. 效果图网站、外包平台接单平台有哪些?
  15. 本周杭州程序员工资大调查,高于深圳和广州
  16. vsftpd写入延误_技术债务造成的延误成本,第4部分
  17. 【TI-mmWave】三、CCS Projects导入报错:This project requires product SYS/BIOS v6.73.1.01, or equivalent......
  18. Apache Kylin在百度地图的实践
  19. 把Foxmail里的邮件导入到Office Outlook里
  20. android监控手机使用次数,原来手机还自带监控功能,手机使用记录一清二楚,赖也赖不掉...

热门文章

  1. 3DSlicer导入锥束CT图像
  2. 免费1G全功能虚拟主机空间,稳定,能外链,不错
  3. 理解SSL/TLS系列 (五)握手协议
  4. MOOC 翁恺C语言 第五周编程练习2 念整数
  5. MOOC程序设计入门——C语言(翁恺)第五周编程作业“念整数”
  6. Git图形化界面客户端大汇总
  7. Centos卸载软件方法
  8. 百度谷歌都作恶,但到底哪家技术更厉害?你会选择用哪个?
  9. 51单片机实现蜂鸣器播放小星星
  10. WkHtmlToPdf使用记录