Raft 5.4.2 Committing entries from previous terms的理解

2023-10-09 19:50

本文主要是介绍Raft 5.4.2 Committing entries from previous terms的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Raft: Committing entries from previous terms

RAFT论文中5.4.2节的Committing entries from previous terms大概是整篇文章中最难理解的一部分,Diego Ongrao应该也意识到了这个问题,在他的博士论文中把这张图改了一下:

A time sequence showing why a leader cannot determine commitment using log entries from older terms. 
– In (a) S1 is leader and partially replicates the log entry at index 2. 
– In (b) S1 crashes; S5 is elected leader for term 3 with votes from S3, S4, and itself, and accepts a different entry at log index 2. 
– In (c) S5 crashes; S1 restarts, is elected leader, and continues replication. At this point, the log entry from term 2 has been replicated on a majority of the servers, but it is not committed. 
– If S1 crashes as in (d1), S5 could be elected leader (with votes from S2, S3, and S4) and overwrite the entry with its own entry from term 3. 
– However, if S1 replicates an entry from its current term on a majority of the servers before crashing, as in (d2), then this entry is committed (S5 cannot win an election). At this point all preceding entries in the log are committed as well.

其中a,b,c是问题出现的背景,d1和d2是这个前提下可能出现的两种结果。作者想要表达的意思是,在图c中,term 4的leader S1不能直接根据多数派提交前任leader留下的log(即S1,S2,S3三个节点上index 为2的三个黄色格子,虽然阿它们已经形成多数派)。为什么呢?因为后续可能会有d1和d2两种走向:

d1: 假如term 4的leader S1在commit 了 index 2的内容,这个值就会被提交到状态机执行,并且返回给客户端。此时S1 crash了,S5重新当选为leader(它的term 可能是5,或者更大的值,因为S1在图c能当选为leader的话,多数派节点肯定至少把自己term更新为4,因此S5要在d1当选的话必须是term 5或更高。图中没有表现出这一点,但是不影响我们的讨论)。根据Raft Log Replicate的规则(In Raft, the leader handles inconsistencies by forcing the followers’ logs to duplicate its own. This means that conflicting entries in follower logs will be overwritten with entries from the leader’s log.),leader会直接用自己的log覆盖所有follower的log来消除这种不一致。那么此时问题就出现了,一条commit了、提交到状态机执行、并返回给客户端的命令被新的leader覆盖了,S4和S5不会执行这条命令,跟S1、S2、S3形成了不一致的情况。因此term 4的leader S1绝对不能直接根据多数派commit前任(term 2)的log。那么,假设term 4的leader S1没有crash,它什么时候能commit这些前任的log?这就是d2的走向:

d2: 假如term 4的leader S1在当前任期满足多数派的情况下commit当前term 4 index为3的三个红色格子,这时候去commit log index 3就是安全的(提交log index 3的时候follower会拒绝,因为它们不知道log index 2,leader 接着再依次发log index 2 和 3完成同步)。为什么这时候就是安全的呢?因为多数派上已经有term 4的log,S5不可能当选为新的leader,这就避免了d1的情况。注意,d1也是一种合法的,只是在当前条件下不会出现。

换句话说,raft只有在当前term 形成多数派commit时,才会最终间接的提交前任term的log。

加上了leader只commit当前term log的限制后,无论走向d1和d2,结果都是一致的。(To eliminate problems like the one in Figure 8, Raft never commits log entries from previous terms by counting replicas. Only log entries from the leader’s current term are committed by counting replicas; once an entry from the current term has been committed in this way, then all prior entries are committed indirectly because of the Log Matching Property.)

为什么会出现这种情况?

因为raft leader选举不完备,一个节点要当选为leader有两种情况

a、它的term >= 多数派的 term

b、他的term == 多数派的term,它的log长度 >=  多数派

在情况a中,新leader可能缺一些多数派中存在的log,raft通过前面的限制绕过了这个问题

参考: https://www.zhihu.com/question/68287713

这篇关于Raft 5.4.2 Committing entries from previous terms的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175166

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

理解java虚拟机内存收集

学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation(属性编辑)、disentanglement(解纠缠)常用的两种做法:线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中,有一种非常简单的方法来引导G向某个方向进行生成,然后我们通过向不同的方向进行行走,那么就会得到这个属性上的图像。那么你利用多个方向进行生成,便得到了各种方向的图像,每个方向对应了很多