Raft日志复制

快速理解Raft之日志复制(肝了两千五百字) Raft的日志复制,常见冲突以及对应的冲突解决方案。 阅读详情

Raft中的Log Entry包括以下内容
索引 Index 记录该日志条目在整个日志中的位置
任期号 Term 日志条目首次被领导者创建时的任期
命令 应用于状态机的命令

日志复制

Raft算法通过索引和任期号唯一标识一条日志记录

日志必须持久化存储,一个节点必须先把日志条目安全写入到磁盘中,才能向系统其他节点发送请求或回复请求。
如果一条日志条目被存储到超过半数节点上,则认为该记录已提交(committed)。如果一条记录已提交,状态机可以安全地执行该记录,这条记录就不能再改变了。
如图,第1条到第7条日志已提交,第8条未提交。
提交日志
Raft通过AppendEntries消息复制日志,与心跳消息共用同一个RPC,不过用于心跳时不附加日志信息。
Raft算法正常运行时,日志复制流程为:
(1) 客户端向领导者发送命令
(2) 领导者先将命令追加到自己的日志中,确保日志持久化存储
(3) 领导者向其他节点发送AppendEntries消息,等待相应
(4) 如果收到超过半数节点响应,则认为新的日志记录已提交。接着领导者将命令应用(apply)到自己的状态机,然后向客户端返回响应。此外,一旦领导者提交了一个日志记录,将在后续的AppendEntries消息中通过LeaderCommit参数通知跟随者,告知领导者已提交的最大日志索引,跟随者也提交索引小于LeaderCommit的日志,并将命令应用到自己的状态机。
(5) 如果跟随者宕机或请求超时,日志没有复制成功,那么领导者将反复尝试发送AppendEntries消息。
(6) 性能优化:领导者不必等待所有跟随者做出响应,只要半数的跟随者成功响应(日志已经存储到超过半数的节点上)就可以回复客户端了。这样保证即使存在一个很慢的或故障节点,也不会成为系统的瓶颈。

Raft算法的日志通过索引和任期号唯一表示一个日志条目,为了保证安全性,Raft维持以下两个特性:
(1) 如果两个节点的日志在相同的索引位置上的任期号相同,则认为它们具有一样的命令,并且从日志开头到这个索引位置之间的日志也完全相同。
(2) 如果给定的日志已提交,那么之前所有的日志都已提交 .
在这里插入图片描述

一致性保证

Raft通过AppendEntries消息来检测之前的一个日志条目,每个AppendEntries请求包含新的日志条目之前的一个日志条目的索引和任期(记为prevLogIndex和prevLogTerm),追随者收到请求后,会检查自己最后一条日志的索引和任期号是否与请求消息中的prevLogIndex和prevLogTerm相同,相同则接收记录,否则拒绝。
可以通过数学归纳法证明以上方式能保证AppendEntries消息之前的日志都是相同的。

代码框架

package go_raft

type LogEntry struct {
	Index   int
	Term    int
	Command interface{}
}

type AppendEntriesArgs struct {
	Term         int
	LeaderId     int
	PrevLogIndex int
	PrevLogTerm  int
	//需要复制的日志条目,发送心跳时为空
	Entries []LogEntry
	//领导者已提交最大日志索引,用于跟随着提交
	LeaderCommit int
}

type AppendEntriesReply struct {
	Term    int
	Success bool
}

func (rf *Raft) AppendEntries(args *AppendEntriesArgs, reply *AppendEntriesReply) {
	rf.mu.Lock()
	defer rf.mu.Unlock()

	reply.Term = rf.currentTerm
	reply.Success = false
	if args.Term < rf.currentTerm {
		return
	}

	if args.Term > rf.currentTerm {
		reply.Term = args.Term
		rf.currentTerm = args.Term
	}

	//重置选举超时时间
	rf.setState(Follower)

	//日志一致性检查
	lastLogIndex := len(rf.log) - 1
	if args.PrevLogIndex > rf.log[lastLogIndex].Index || rf.log[args.PrevLogIndex].Term != args.PrevLogTerm {
		return
	}

	reply.Success = true

	//处理重复的RPC请求
	//比较日志条目的任期,以确认是否能够安全地追加日志
	//否则会导致重复应用命令
	index := args.PrevLogIndex
	for i, entry := range args.Entries {
		index++
		if index < len(rf.log) {
			if rf.log[index].Term == entry.Term {
				continue
			}
			rf.log = rf.log[:index]
		}

		rf.log = append(rf.log, args.Entries[i:]...)
		break
	}

	if rf.commitIndex < args.LeaderCommit {
		lastLogIndex = rf.log[len(rf.log)-1].Index
		if args.LeaderCommit > lastLogIndex {
			rf.commitIndex = lastLogIndex
		} else {
			rf.commitIndex = args.LeaderCommit
		}
		//将命令应用到自己的状态机
		rf.apply()
	}

	//保险起见,再重置一次选举超时时间
	rf.setState(Follower)
	return
}

Raft协议详解(三)日志复制 在这一部分,我们讲Raft几个子问题中的日志复制问题。主要内容是讲Raft为什么要进行日志复制,以及如何进行日志复制的。日志复制(log replication)是leader的主要工作之一。在前面的第一、二部分,我们讲到了日志(log)是Raft的一致性保证非常重要的组成部分,很大程度Raft是利用log做的数据一致性。那么我们就来说说日志。 日志是啥 上图是Raft论文中的图片... 阅读详情

相关推荐

Raft 实现日志复制同步

Raft 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频及 ppt 为蓝本,深入分析 Raft 的内部机制,并以日志复制同步(Replicated Logs)为背景,详细介绍使用 Raft 协议实现日志复制的共识性问题。 目标:日志复制同步 R

平夫博客 1293

Raft算法之日志复制

在Leader选举过程中,集群最终会选举出一个Leader节点,而集群中剩余的其他节点将会成为Follower节点。Leader节点除了向Follower节点发送心跳消息,还会处理客户端的请求,并将客户端的更新操作以消息(Append Entries消息)的形式发送到集群中所有的Follower节点。当Follower节点记录收到的这些消息之后,会向Leader节点返回相应的响应消息。当Leader节点在收到半数以上的Follower节点的响应消息之后,会对客户端的请求进行应答。

一直在努力的小渣渣 2285

Raft算法日志复制与选主机制源码分析

Raft算法的选主机制是其高可用性和一致性的重要保障,通过选举过程确保集群中始终有一个领导者节点来协调日志复制和其他操作。选举状态:每个节点在Raft算法中可以处于三种状态之一:跟随者、候选人或领导者。跟随者节点负责接收领导者的指令并执行;候选人节点在选举过程中尝试成为领导者;领导者节点负责协调日志复制和处理客户端请求。在正常运行时,大多数节点处于跟随者状态,只有当跟随者在超时时间内未收到领导者的心跳消息时,才会转变为候选人并发起选举。选举超时。

qq_40552871的博客 785

Raft协议--日志复制--03

一、日志复制的过程 客户端的一条指令到达,Leader把将指令作为日志条目(Log entries)加入到它的日志中,然后并行的向其他Follower发起 AppendEntries(附加条目) RPC复制日志条目。当这条日志被复制到大多数服务器上,Leader将这条日志应用到它的状态机(比如如果是mysql的insert,那么就是执行insert操作),并向客户端返回执行结果。 客户端的每一个请求都包含被复制状态机执行的指令。 leader把这个指令作为一条新的日志条目添加到日志中,然后并行发起

zhou920786312的博客 1370

2024年淘宝平板电脑销售数据分析

本项目的目标是从淘宝电商平台上自动化爬取商品信息,并通过数据分析帮助了解价格、销量等相关指标,为商业决策提供支持。使用Selenium实现数据爬取,结合Python的数据处理与可视化工具,进一步分析和展示结果。

2301_76728517的博客 1474

【图神经网络】从0到1使用PyG手把手创建异构图

异构图的准确定义如下:异构图(Heterogeneous Graphs):一个异构图GGG有一组节点V=v1,v2,...,vnV=v_1,v_2,...,v_nV=v1​,v2​,...,vn​和一组边E=e1,e2,...,emE=e_1,e_2,...,e_mE=e1​,e2​,...,em​组成,其中每个节点和每条边都对应着一种类型,用TvT_vTv​表示节点类型的集合,TeT_eTe​表示边类型的集合,一个异构图有两个映射函数,分别将每个节点映射到其对应的类型ϕv:V→Tv\phi_v:V\rig

小哲的博客 7833

超详细教程!手把手带你使用Raft分布式共识性算法

导语|从头理一遍Raft会给你带来新的体验与收获,让你从根本上理解Raft,理解它被提出的背景,在此背景下又是如何解决实际问题的,这才是从头实现一个Raft所带来的真正收益。本文聚焦在R...

QcloudCommunity的博客 1693

ArcGIS图解建模工具与DEM提取山脊、山谷线(水文分析、表面分析)

参考汤国安、杨昕等编著的《地理信息系统空间分析实验教程第二版》 利用水文分析(流量)和表面分析(坡向变率)得到山脊和山谷线 文章目录1、基本概念1.1 正地形1.2 负地形正负地形的影响2、水文分析方法2.1 基本思想原理2.2 技术路线2.3 操作步骤2.3.1 正负地形的提取2.3.2 利用水文分析思想和工具提取研究区域的山脊线2.3.3 利用水文分析思想和工具提取研究区域的山谷线2.3.4 利用水文分析提取山脊线和山谷线结果3、表面分析方法3.1 基本思想原理3.2 技术路线3.3 操作步骤4、图.

fungis 1万+

08 | Raft算法(二):如何复制日志?

通过上一讲的学习,你应该知道 Raft 除了能实现一系列值的共识之外,还能实现各节点日志的一致,不过你也许会有这样的疑惑:“什么是日志呢?它和我的业务数据有什么关系呢?想象一下,一个木筏(Raft)是由多根整齐一致的原木(Log)组成的,而原木又是由木质材料组成,所以你可以认为日志是由多条日志项(Log entry)组成的,如果把日志比喻成原木,那么日志项就是木质材料。

qq_37756660的博客 1406

用 CDS View I_APARToleranceGroup 管理客户与供应商收付差异容差:配置语义、字段解读与 ABAP 落地实践

财务共享服务中心常面临小额差异处理的挑战,SAP通过"客户/供应商容差组"机制实现自动清账规则配置。CDS视图I_APARToleranceGroup将配置数据转化为可查询维度,包含宽限天数、固定现金折扣等关键业务参数。该视图支持按公司代码和容差组查询差异处理策略,可用于报表开发、主数据校验和接口合规检查,帮助财务团队高效管理海量小额交易差异,减少手工操作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 127

第4章-07-将WebDriver获取的Cookie传递给Requests

在使用Selenium WebDriver获取了浏览器的Cookies之后,你可以将这些Cookies传递给requests库,以便在后续的HTTP请求中使用这些Cookies。这样做可以让你模拟浏览器会话,使得请求看起来像是从之前使用Selenium WebDriver控制的浏览器发出的。

黑夜开发者的博客 692

Raft 日志复制

Raft 日志复制的目标是让所有副本维护一致、有序的日志副本。它通过 AppendEntries、任期与索引校验、日志回退与快照恢复等机制,在保证一致性的同时提供高性能、高可靠的副本同步能力。Leader 选举机制快照发送的详细过程如何避免脑裂Raft 与 Paxos 的对比。

喝醉酒的小白 822

数学建模学习(120):使用Python实现基于AHP的供应商选择分析

使用Python实现基于AHP的供应商选择分析

全栈川川 912

Raft 算法详解(二)日志复制

在 Raft 算法中,副本数据是以日志的形式存在的,领导者接收到来自客户端写请求后,处 理写请求的过程就是一个复制和提交日志项的过程。 那 Raft 是如何复制日志的呢?又如何实现日志的一致的呢?这些内容是 Raft 中非常核心 的内容,首先,咱 们先来理解日志,这是你掌握如何复制日志、实现日志一致的基础。 如何理解日志? 刚刚我提到,副本数据是以日志的形式存在的,日志是由日志项组成,日志项究竟是什么样 子呢? 其实,日志项是一种数据格式,它主要包含用户指定的数据,也就是指令(Command), 还包含一些

林木森的博客 2413

SAP BTP ABAP environment 集成本地系统实践:Cloud Connector、Connectivity service 与隧道通信全解析

摘要: 随着ABAP开发者向云端扩展业务逻辑,如何安全访问企业内网SAP系统成为关键问题。本文基于SAP官方文档,解析通过Cloud Connector和Connectivity service实现云端ABAP环境与本地系统集成的方案。 架构上分为四个角色:ABAP环境、Connectivity服务、Cloud Connector和内网系统。Cloud Connector作为内网出口,通过TLS隧道主动连接云端,避免防火墙开放入站端口。Connectivity服务则作为子账户级“总机”,自动路由请求。 实施

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 311

STM32F407中文手册

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

Raft日志复制技术及成员变更原来是这样的

副本数据是以日志的形式存在的,日志是由日志项组成,日志项究竟是什么样子呢?其实,日志项是一种数据格式,它主要包含用户指定的数据,也就是指令(Commond),还包含一些附加信息,比如索引值(Log Index)、任期编号(Term)。指令:一条由客户端请求指定的、状态机需要执行的指令。可以将指令理解成客户端指定的数据。索引值:日志项对应的整数索引值,其实就是用来标识日志项的,是一个连续的、递增的整数号码。任期编号:创建这条日志项的领导者的任期编号。

我是一名热爱编程和分享知识的技术作者,在金融和教育领域有多年的研发管理经验,感谢您访问我的博客,一定会为您带来不一样的收货! 1718

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Raft 共识算法学习笔记 二:日志复制

文章 Raft 共识算法学习笔记 一:领导人选举 描述了 Raft 算法如何进行领导者选举,本文描述 Raft 共识算法如何进行日志复制。 复制状态机 在 Raft 集群中,每个服务器可以看成是一个复制状态机(Replicated State Machine),如下图。 复制状态机通常基于复制日志(replicated log)实现。每个服务器存储一个包含一系列指令的日志,并且按顺序执行指令。由于日志都包含相同顺序的指令,状态机会按照相同的顺序执行指令,由于状态机是确定的(deterministic),因此

Leo的博客 1689

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++实现Raft算法之日志复制

基于Raft的kv存储之日志复制部分

weixin_45962681的博客 1173

图解Raft之日志复制

日志复制可以说是Raft集群的核心之一,保证了Raft数据的一致性,下面通过几张图片介绍Raft集群中日志复制的逻辑与流程;   在一个Raft集群中只有Leader节点能够接受客户端的请求,由Leader向其他Follower转发所有请求日志,并且有那么两条规则:Leader不删除任何日志、Follower只接收Leader所发送的日志信息;   此图介绍了Raft集群中日志的组成结构,日志...

weixin_30699443的博客 1402

【Raft原理探究·日志复制详解】老大带头抄作业

Raft 是一套为理解和实现分布式一致性而设计的共识算法,本文通过类比开发团队“组长带队干活”的形象方式,深入浅出地讲解了 Raft 中日志复制的完整过程。包括从 Leader 写入日志、同步 Followers、副本确认、提交执行、补日志对齐等环节,并结合两阶段提交机制解析其强一致性保障。适合有一定基础的工程师查漏补缺,也适合初学者建立系统理解。

PragueJoker的博客 1054

Raft 共识算法3-日志复制

为了使跟随者的日志与其自己的一致,领导者必须找到在跟随者的日志中和自己一致的最新日志条目,然后在跟随者日志中删除该点之后的所有条目,并将该点之后的所有领导者日志条目发送给跟随者。当发生这种情况时,AppendEntries RPC 将成功,它会删除跟随者日志中的所有冲突条目并追加领导者日志中的条目(如果有的话)。一旦创建条目的领导者已将其复制到大多数服务器(例如,@fig6 中的条目 7),那么该日志就被称为已提交的(此时将该日志条目应用到状态机是安全的)。日志是由条目组成的,这些条目按顺序编号。

serene的博客 620

Raft算法的Leader选举和日志复制过程

Raft概念 Raft是一种为了管理复制日志的一致性算法。它提供了和Paxos算法相同的功能和性能,但是它的算法结构和Paxos不同,使得Raft算法更加容易理解并且更容易构建实际的系统。为了提升可理解性,Raft将一致性算法分解成了几个关键模块,例如Leader选举、日志复制和安全性。同时它通过实施一个更强的一致性来减少需要考虑的状态的数量。从一个用户研究的结果可以证明,对于学生而言,Ra...

Tyler_Zx的博客 1万+
上一篇: Raft 领导者选举
下一篇: Raft领导者变更的安全性
yumWant2debug
博客等级 码龄7年 27粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值