深入理解Raft算法

深入理解分布式系统中的一致性算法:Raft 与 Paxos 原理及实践 Paxos是一种解决分布式一致性问题的算法,由 Leslie Lamport 于 1989 年提出。Paxos 算法的核心目标是确保在多个分布式节点之间,只有一个值能够被选择作为一致的决策。Paxos 算法的基本思想是通过投票和协议达成一致,确保即使有部分节点失败,系统仍然能够维持一致性。Proposer(提议者):负责提出一个提议,通常是一个值。Acceptor(接受者):接受提议并投票,只有在满足条件时才会接受提议。Learner(学习者):负责学习最终的决策结果。Prepare 阶段。 阅读详情

前言

最近在分布式系统一致性方面,Raft算法比较火啊。所以就抽时间看了下这个算法。

之前已经有Paxos算法,用于解决分布式系统最终一致性问题,而且已经有了zookeeper这个成熟的开源实现。那么这个Raft算法有啥用呢?按照Raft官网的说法,这个算法的错误容忍和性能和Paxos算法类似,但是拥有更加简单易懂的设计。

看过Paxos算法的童鞋们都知道,这货复杂地和屎一样,为了实现去中心化而考虑了各种复杂的边界条件和时序下的可靠性。而Raft算法则根据实际应用中的需要,简化了设计模型,不采用去中心化设计,而是自动选择中心阶段,并且在各种情况和时序下可以保证能够正确的选择出中心节点并保证数据的一致性。而且也正是由于能够选举出唯一的主节点(Leader)使得整个通信流程非常地简单,并且易于理解和维护。

那么它是如何做到这些的呢?

基本算法设计

Raft的基本设计可以参照官网介绍 https://raft.github.io/

官方网站上的图例可以点击节点,然后模拟节点crash或者超时或者收到请求时的通信流程。其实也是一个javascript的简单实现,有利于我们理解Raft算法的流程。

另外还有一个基本要点的流程有点像PPT的东东也能帮助我们理解 http://thesecretlivesofdata.com/raft/

当然最完整的就是这篇Paper了,《In Search of an Understandable Consensus Algorithm (Extended Version)》。大体翻译提取下这篇论文里的核心内容吧。

基本思路是每个节点分为Leader、Follower、Candidate三个状态。

  • Leader: 主节点
  • Follower: 从节点
  • Candidate: 正在竞选主节点(参选节点)

消息状态分为:

  1. Uncommit: 未提交转态(Client发到主节点,主节点还没有得到大多数从节点的提交回执)
  2. Commited: 已提交转态(从节点收到主节点的消息提交,还未收到确认报文)
  3. Applied: 已确认转态(从节点收到主节点的确认报文,或主节点已收到大多数从节点的提交回执)

所有的节点中都要记录以下信息

  • CurrentTerm: 节点的当前选举版本号(发起竞选主节点时要更新这个值),后面的Term指代消息中的选举版本号或者生产消息时的选举版本号
  • Voted For: 主节点投票给谁
  • Log: log是论文里的描述,其实也就是消息的内容,后面用消息指代这里提到的Log
  • Commit Index: 提交序号(每次收到客户端消息时要更新这个值)
  • LastApplied: 最后确认的消息序号
  • 下面是仅主节点需要记录的数据
  • NextIndex[]: 预估的每个从节点下一个的Log的序号(初始化为最后的log索引+1)
  • MatchIndex[]: 已经确认的每个从节点的下一个Log的序号(初始化为0)

RPC消息有两种:

AppendEntries RPC(心跳、消息同步RPC)

RPC请求:

RPC回复:

收方判定条件

  1. 如果请求包内Term < CurrentTerm,回复失败
  2. 如果节点内不包含Term等于PrevLogTerm但CommitIndex不等于PrevLogIndex的消息,则回复失败
  3. 如果存在消息和拿到的请求包里的冲突(CommitIndex相同但Term不同),则移除所有冲突之后的消息,并用新的消息覆盖
  4. 如果消息不在已有消息集合中,追加数据
  5. 如果LeaderCommit大于本地的CommitIndex,CommitIndex要设置成LeaderCommit和最后一条消息(Entries)的CommitIndex里的最小值

RequestVote RPC(竞选主节点RPC)

RPC请求:

学习分布式一致性协议:自己实现一个Raft算法 前言 MIT6.824是麻省理工学院开设的一个很棒的分布式系统公开课程,课程的Schedule在这里,这门课程的学习方式主要是通过教授的 lecture 讲解、Paper阅读、FAQ答疑,以及实践lab来完成的,是一个学习理论知识,然后动手实践的过程,个人认为是很好的学习方式,而MIT6.824公开课让更多不是麻省理工的学生也能很好的学习分布式系统知识,免费学习MIT课程学到就是赚到! MIT6.824主要围绕以下4个lab进行学习 lab1->MapReduce:实现一个MapReduce系. 阅读详情

相关推荐

raft理论与实践[3]-lab2a讲解

lab2a实验讲解 1、raft.go 的raft结构体 补充字段。 字段应该尽量与raft论文的Figure2接近。 type Raft struct { mu sync.Mutex // Lock to protect shared access to this peer's state peers []*labrpc.ClientEnd // RP...

weishixianglian的博客 433

Raft协议详解与实战

文章目录一致性一致性算法的特性Raft状态和状态的转化Raft定义Raft状态的转化过程Raft实例初始化Raft的一些规则Leader ElectionCandidate选举过程与相应处理Receiver投票策略Log ReplicationLeader 复制log请求与响应Receiver对AppendEntries的处理复制日志的优化状态持久化 一致性 分布式系统最核心问题:维持多个节点副本的一致性。一致性协议通常基于replicated state machines,即所有结点都从同一个state出

weixin_42615068的博客 1738

Java最新分布式一致性之raft算法,西安富士通Java笔试题

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来。

weixin_43747371的博客 1218

MIT 6.824 lab ——1.项目简介

6.824个人项目简介1 项目结构图2 项目介绍3 Raft介绍 1 项目结构图 2 项目介绍 3 Raft介绍

ekxavol的博客 7530

UIView的bounds属性小记

UIView的bounds

shuai265的博客 1025

云原生领域Raft协议的选举算法详解

本文旨在全面解析Raft协议中的选举算法,特别关注其在云原生环境中的应用。我们将深入探讨选举过程的核心机制、异常处理以及性能优化策略,帮助读者理解Raft如何成为云原生基础设施中实现分布式一致性的关键技术。文章首先介绍Raft协议的基本概念,然后重点解析选举算法。我们将通过数学建模、代码实现和实际案例分析,全方位展示Raft选举机制。最后讨论其在云原生生态系统中的应用和优化方向。Raft:一种用于管理复制日志的共识算法Leader:集群中处理所有客户端请求的节点Follower。

AI天才研究院 1040

Raft算法在TiDB与Kafka中的工程实践与面试深度解析

分布式共识算法是构建高可用分布式系统的核心技术基础,Raft算法通过领导选举和日志复制机制实现了强一致性保证。在工程实践中,Raft的价值在于为分布式系统提供可靠的数据一致性和故障容错能力,广泛应用于数据库、消息队列等关键场景。以TiDB和Kafka为例,TiDB采用Multi-Raft架构实现数据分片管理,每个Region对应独立的Raft组,确保分布式事务的ACID特性;而Kafka通过KRaft模式替代ZooKeeper,将元数据管理内置化,显著提升集群扩展性和运维效率。本文通过对比分析两大系统的Ra

weixin_30443813的博客 372

Raft算法模拟:深入理解共识算法

Raft算法是一种常用的共识算法,它的设计简单、易于理解,并且具备良好的可扩展性。本文将详细介绍Raft算法的原理,并提供一个简单的Raft算法模拟实现的源代码。通过以上的代码实现,我们可以实现一个简单的Raft算法模拟。但是,本文提供的代码可以作为学习和理解Raft算法的起点,帮助读者更好地掌握共识算法的核心原理。当一个节点的选举超时时间到达时,它将转变为候选人状态,并开始选举过程。一旦选出领导者,它将负责接收客户端的请求,并将其附加到自己的日志中。在Raft算法中,节点通过相互通信来选举一个领导者。

loop_code966的博客 137

hashicorp/raft 介绍与源代码分析(一): Raft 介绍

Raft 协议 Raft 是一种为了管理复制日志的一致性算法 由斯坦福的两位教授 Diego Ongaro 和 John Ousterhout 发表的一篇论文提出来的 中英文论文地址,可以参考网友的链接: https://github.com/maemual/raft-zh_cn 论文中主要阐述了,在节点失效是常态化的环境下,一种便于理解的、不失性能的,使所有节点日志数据一致的方法 是分布式算法、一致性算法非常好的入门教材 目前 golang 的比较有名的实作有: hashicorp/raft Cons

范安崇的博客 1216

【人工智能 Open AI】解释一下 Raft 分布式一致性协议算法,并用伪代码实例说明。

Raft 分布式一致性协议算法是一种分布式一致性算法,用于管理分布式系统中的服务器之间的日志复制。其主要目的是确保所有服务器的状态一致,以确保系统的稳定性和可靠性。

AI天才研究院 5444

raft共识算法动态演示

Raft 分布式共识算法动画演示

MyySophia的博客 655

raftjava:分布式一致性算法raft的java实现

raftjava 分布式一致性算法raft的java实现

lego-loam featureAssociation 源码注释(五)

上一次我们已经看完了特征提取,这次我们进入特征匹配的内容!!!systemInitedLM的初始值为false。

Joeybee的博客 889

中小公司无线组网实战:用一台H3C AC和普通三层交换,实现办公网AP统一管理

本文详细介绍了中小型企业如何利用H3C AC控制器与普通三层交换机实现无线AP统一管理的实战方案。通过VLAN规划、DHCP配置和AC控制器设置,构建经济高效的办公网络,解决信号覆盖和连接稳定性问题,特别适合50-200人规模的企业部署。

weixin_42531516的博客 382

AnyGrasp实战指南:从环境配置到抓取检测与跟踪

本文详细介绍了AnyGrasp从环境配置到抓取检测与跟踪的实战指南。涵盖硬件要求、关键依赖安装避坑、抓取检测与跟踪的实战技巧,以及常见问题解决方案和性能优化建议,帮助开发者快速掌握这一高精度物体抓取检测与跟踪技术。

weixin_33712987的博客 274

逆向攻防世界CTF系列40-ReverseMe-120

注意sub_401000main中只传了两个参数,但是跟进后发现四个(可能是隐式传递,放在寄存器里传递了),调试发现a4是输入长度,与最终的you_know_how_to_remove_junk_code比较的是v12(但是并没有被传入),开始怀疑是不是隐式传递了。_mm_xor_si128用于计算128位(16字节)的按位异或,然后通过v14控制循环结束的条件,可以看到v14增长的步长为16,而且通过上面得到的flag值解码得到的字符串为32个字节大小,正好是16的整数倍。

LH1013886337的博客 1410

十五天学会Autodesk Inventor,看完这一系列就够了(七),工程图纸

不管哪种绘图软件,二维或三维绘图,最终均需要转换成工程图纸,才能交给现场人员进行制作,这是任一产品图都要经历的过程。那本章开始,我们一起看一下Inventor是如何实现工程图纸?

Crazydoubao的博客 4910

yolov11使用记录(训练自己的数据集)

本文介绍了如何安装和使用Ultralytics YOLOv11进行目标检测。首先,通过Anaconda创建并激活虚拟环境,安装必要的依赖库如PyTorch和Ultralytics。接着,从GitHub下载YOLOv11源码,并在PyCharm中配置环境。下载预训练的YOLOv11模型后,通过编写简单的Python脚本进行图片检测,验证环境配置的正确性。最后,文章提到可以基于此环境训练自定义模型。整个过程涵盖了从环境搭建到模型应用的完整流程,适合初学者快速上手YOLOv11。

IT菜鸟 7548

宜搭,高级认证实操2,FaaS连接器指导教程

找到FaasEntry.java将如下代码整体替换,注意引包。如图所示在util下新建EDSUtil.java代码如下。回到连接器界面点击右上角测试-->测试。连接器工厂-->新建FaaS连接器。保存-->前往云IDE开发。返回如图所示代码,部署成功。

2301_80286061的博客 3343

Unity物理引擎实战:从刚体重心到碰撞体,打造真实不倒翁交互

刚体(Rigidbody)是Unity物理系统的核心组件,它定义了游戏对象的物理属性,如质量、阻力和碰撞响应。其原理基于牛顿力学,通过物理引擎(如PhysX)实时计算物体的运动状态。在游戏开发中,刚体的价值在于能够模拟真实世界的物理行为,为玩家提供沉浸式的交互体验。碰撞体(Collider)则定义了物体的形状边界,用于检测与其他物体的接触。通过精细调整刚体的重心(Center of Mass)和碰撞体形状,开发者可以模拟出各种有趣的物理现象,例如低重心物体的动态平衡。这在休闲游戏、物理玩具模拟等场景中尤为实

weixin_33976326的博客 355

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: MyBatis源码解析
下一篇: 为什么大厂对35岁以上的程序员都充满了恶意
java架构师小芷
博客等级 码龄6年 216粉丝 519原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值