当前位置: 首页 > news >正文

Raft协议

文章目录

  • 一、目的(与Paxos相同)
  • 二、名字来源
  • 三、服务器状态
  • 四、基本实现
    • 1、任期
    • 2、RPC调用
    • 3、领导者选举
    • 4、日志复制
    • 5.领导者更替
  • 三、Raft与Paxos的区别
    • 1.表现形式
    • 2.简单性
    • 3.领导选举算法

一、目的(与Paxos相同)

保证日志完全相同地复制到多台服务器上,以实现状态机复制的算法。
解决了Paxos的难理解性和工程上的难以实现。

二、名字来源

可靠Reliable、复制Replicated、冗余Redundant、容错Fault-Tolerant——>
R{eliable|eplicated|edundant} And Fault-Tolerant 取首字母Raft。

三、服务器状态

1、领导者:处理所有的客户端请求和日志复制,同一时刻最多只能有一个正常工作的领导者。
2、跟随者
3、候选者:领导者与跟随者之间的状态。

四、基本实现

1、任期

是一个逻辑时间,用来解决时序问题。
每台服务器维护一个currentTerm变量,表示最新任期号,持久化存储。

2、RPC调用

Raft算法中服务器通信主要通过两个RPC调用实现
(1)RequestVoteRPC 领导者选举
(2)AppendEntriesRPC领导者用来复制日志和发送心跳

3、领导者选举

(1)领导者需要周期性向跟随者发送心跳包(空的AppendEntries消息),如果跟随者在选举超时时间(electionTimeout,一般为100-500ms)没有收到任期更大的RPC请求,认为集群中没有领导者,开始新选举。

(2)节点开始竞选流程如下图:

(3)选举过程中需要保证共识算法的两个特性:安全性(只会有一个领导者被选举出来)和活性(最终能选出一个领导者)。
保证安全性:a.每个节点在同一任期只能投一次票,给第一个满足条件的RequestVote请求。需要每个节点新增一个投票信息变量votedFor,表示当前任期头拍给了哪个候选者,为空表示没有投票。votedFor需要持久化存储,否则会导致一个节点投票给不同候选者。
b.获得超过半数投票的才能成为领导者。
保证活性:如果选举失败,使用活锁,即节点随机选择超时时间重试。

4、日志复制

(1)日志格式
每个节点存储自己的日志副本(log[ ]), 日志中的每个日志条目(Log Entry)包括:
索引:该日志条目在整个日志中的位置。
任期号:日志条目首次被领导者创建时的任期。
命令:应用于状态机的命令。

(2)Raft算法通过索引和任期号唯一标识一条日志目录。

(3)日志必须持久化存储
一个节点必须先将日志条目安全写到磁盘中,才能向系统中其他节点发送请求或回复请求。

(3)记录已提交(committed)
如果一条日志被存储在超过半数的节点上,则认为该记录已提交(committed),意味着状态机可以安全的执行该记录。类似Paxos中的已批准(chosen)。

(4)日志复制流程
客户端发送命令——领导者追加该日志并持久化存储——领导者发送AppendEntries消息——a.超过半数响应,领导者认为该日志已提交,应用apply到自己的状态机,向客户端返回响应。注:领导者位置LeaderCommit参数,一旦提交了一个日志记录,会在后续的AppendEntries消息中通知跟随者。该参数代表领导者已提交的最大日志索引,跟随者也提交小于该值的日志,并应用到自己的状态机。
b.不成功,领导者反复尝试发送AppendEntries消息。

(5)Raft日志特性
a.如果两个节点日志在相同索引位置上任期号相同,认为命令相同,并且从日志开头到这个索引位置之间的日志也都相同。
b.如果给定的记录已提交,那么所有前面的记录也已提交。注:这条是Raft算法和Paxos算法的不同之处,Paxos算法允许日志不连续地提交,但Raft算法的日志必须连续地提交。
一致性检查:为了实现日志特性,Raft算法通过AppendEntries消息来检测之前的一个日志条目——每个AppendEntries消息请求包含新日志条目之前的一个日志条目的索引(prevLogIndex)和任期(prevLogTerm);跟随者收到请求后,会检查自己最后一条日志的索引和任期号是否与请求消息中的prevLogIndex和prevLogTerm相匹配,如果匹配则接收该记录,否则拒绝。

5.领导者更替

Paxos选举领导者是选id最大的服务器
Raft选择最有可能包含所有已提交日志的节点,即日志最新并且最完整
方法:候选者C在RequestVote消息中包含自己最后一条日志的索引lastIndex和任期lastTerm,收到投票请求的服务器V,比较谁的日志更完整 (lastTermV > lastTermC ) || (lastTermV == lastTermC) && (lastIndexV > lastIndexC).表示V更新,将拒绝C的投票请求。

三、Raft与Paxos的区别

1.表现形式

Raft提出的目标是可理解性,尝试寻找一种比Paxos更容易学习和理解的方式来描述算法。

2.简单性

(1)Raft按顺序提交日志,Paxos允许日志不按顺序提交,但需要一个协议来填补可能因此出现的日志漏洞。
(2)Raft中的所有日志副本都有相同的索引、任期和命令,而Paxos中这些任期可能有所不同。

3.领导选举算法

Paxos中选举算法是比较服务器id的大小,服务器id较大的节点胜出。

相关文章:

Raft协议

文章目录一、目的(与Paxos相同)二、名字来源三、服务器状态四、基本实现1、任期2、RPC调用3、领导者选举4、日志复制5.领导者更替三、Raft与Paxos的区别1.表现形式2.简单性3.领导选举算法一、目的(与Paxos相同) 保证日志完全相同…...

动态规划概述

动态规划概述动态规划的两个要求: 1.最优子结构 例:现有一座10级台阶的楼梯,我们要从下往上走,每次只能跨一步,一步可以往上走1级或者2级台阶,请问一共有多少种解法呢? 台阶数12345678910走法数…...

CPU缓存架构+Disruptor内存队列

文章目录CPU缓存架构Disruptor内存队列CPU缓存架构介绍缓存一致性问题缓存一致性协议MESI协议伪共享问题高性能内存队列DisruptorCPU缓存架构Disruptor内存队列 CPU缓存架构 介绍 cpu与内存的交互数据之间,有一个高速缓存层。有些处理器有3层缓冲,有些…...

Spark SQL join操作详解

一、 数据准备 本文主要介绍 Spark SQL 的多表连接,需要预先准备测试数据。分别创建员工和部门的 Datafame,并注册为临时视图,代码如下: val spark SparkSession.builder().appName("aggregations").master("lo…...

设计模式-day04

5,结构型模式 5.6 组合模式 5.6.1 概述 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,…...

线段树的学习(2023.4.5)

今天我来学习线段树 首先它是树有着树的结构,线段树由于本身是专门用来处理区间问题的 它的作用可以处理区间的问题拥有更快的速度. 对于每一个子节点而言,都表示整个序列中的一段子区间;对于每个叶子节点而言,都表示序列中的单个元素信息…...

Java 实现excel、word、txt、ppt等办公文件在线预览功能

相信大家在开发的过程中都会遇到在线预览功能,有没有想过如何通过java来实现excel、word、txt、ppt等办公文件在线预览功能?今天我们就来解决这一疑问! 其实,网上还是有些公司对这一功能提供了收费服务。那么,如何实现…...

《Vue3实战》 第九章 路由

1、安装路由 cnpm install vue-router42、router-link应用 2.1、创建views/OrderList.vue组件 <template> <h1>订单列表页面......</h1> </template> <script> export default{name: OrderList,data(){return{arr:[4,2,5]} } …...

ToBeWritten之物联网Zigbee协议

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

【万象奥科】RZ/G2UL网关内存压力测试

测试目的 内存压力测试的目的是测试系统内存的稳定性和可靠性&#xff0c;以便确定系统是否能够在各种负载情况下正常运行。其主要目的有&#xff1a; 测试内存的正确性&#xff1a;通过模拟各种内存负载情况&#xff0c;例如写入随机数据、重复写入相同数据、使用指定的模式…...

C++中的继承

面向对象的三大特性 封装继承多态 继承的概念和定义 继承的本质就是类层次的复用。 继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段.它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xf…...

SpringRetry接口异常优雅重试机制

场景&#xff1a; 某些场景下&#xff0c;如果接口出现异常需要进行重试&#xff0c;例如网络抖动、调用接口超时等并非接口代码导致的报错&#xff0c;此时可以进行接口重试机制 1、导入 spring retry 重试依赖 <!-- spring retry --><dependency><groupId>…...

2023年全国最新高校辅导员精选真题及答案46

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 27.充沛的精力和顽强的毅力是教师意志品质的体现。 答案&#xff1a;正确 28.规范与约束…...

程序员为了女朋you进了华为,同学去了阿里,2年后对比收入懵了

什么样的工作才是好工作&#xff1f;每当遇到这个问题&#xff0c;我们的答案总是出奇的一致&#xff1a;钱多事少离家近。 然而现实总是残酷的&#xff0c;日前&#xff0c;有网友在某社交论坛发帖称&#xff1a;自己为了女朋友留在了成都进入华为工作&#xff0c;而自己的同…...

Linux中的算法分离手段

0. 简介 参数分离对于绝大多数算法开发来说收益是非常大的&#xff0c;因为我们都知道&#xff0c;随着平台的更替&#xff0c;很多时候如果说数据流和算法交叠在一起&#xff08;即接口与实现合在一起&#xff09;。这将有可能会导致在迁移平台时候会导致代码难以维护&#x…...

机器学习实战:Python基于Logistic逻辑回归进行分类预测

目录1 前言1.1 Logistic回归的介绍1.2 Logistic回归的应用2 iris数据集数据处理2.1 导入函数2.2 导入数据2.3 简单数据查看3 可视化3.1 条形图/散点图3.2 箱线图3.3 三维散点图4 建模预测4.1 二分类预测4.2 多分类预测5 讨论1 前言 1.1 Logistic回归的介绍 逻辑回归&#xff…...

Leetcode.404 左叶子之和

题目链接 Leetcode.404 左叶子之和 easy 题目描述 给定二叉树的根节点 root&#xff0c;返回所有 左叶子 之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以…...

Android 11.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(二)

1.前言 在11.0的系统rom定制化开发中,在原生系统SystemUI下拉状态栏的下拉通知栏的背景默认是白色四角的背景, 由于在产品设计中,在对下拉通知栏通知的背景需要把四角背景默认改成圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景, 然后通过systemui的通知…...

C语言CRC-16 IBM格式校验函数

C语言CRC-16 IBM格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同厂家通过对输入数…...

Maven高级-聚合和继承

Maven高级-聚合和继承3&#xff0c;聚合和继承3.1 聚合步骤1:创建一个空的maven项目步骤2:将项目的打包方式改为pom步骤3:pom.xml添加所要管理的项目步骤4:使用聚合统一管理项目3.2 继承步骤1:创建一个空的Maven项目并将其打包方式设置为pom步骤2:在子项目中设置其父工程步骤3:…...

弱引用TWeakObjectPtr原理

弱引用的原理&#xff1a;从通用思路到 UE TWeakObjectPtr 原理总结&#xff1a; !!#ff0000 UE 的 GC 体系有一张全局对象表 GUObjectArray&#xff0c;弱引用存了一个索引&#xff0c;以及这个物体创建时的序列号&#xff0c;简单来说是不是弱引用先拿着索引去序列号找一下&am…...

Hackintool:黑苹果配置不再复杂,这款工具让你轻松搞定所有难题

Hackintool&#xff1a;黑苹果配置不再复杂&#xff0c;这款工具让你轻松搞定所有难题 【免费下载链接】Hackintool The Swiss army knife of vanilla Hackintoshing 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintool 还在为黑苹果的配置问题头疼吗&#xff1f;…...

【2026最新】应对维普算法升级,5大降AI工具横测,一次稳降至25%(附手改秘籍)

知网和维普的AIGC检测系统又更新了&#xff01; 在当下的关口&#xff0c;如何在不牺牲质量的前提下&#xff0c;优化初稿表达&#xff0c;安全地降低AI痕迹&#xff0c;成了所有小伙伴们必须解决的一个问题。网络上各种“降AI神器”铺天盖地&#xff0c;这些工具到底靠不靠谱…...

告别龟速采样!用DDIM加速你的扩散模型推理(附PyTorch代码)

加速扩散模型推理&#xff1a;DDIM核心原理与实战优化指南 在图像生成领域&#xff0c;扩散模型以其卓越的质量表现迅速成为研究热点&#xff0c;但传统DDPM&#xff08;Denoising Diffusion Probabilistic Models&#xff09;的致命缺陷在于其缓慢的采样速度——生成一张图片往…...

用ZYNQ和LWIP搞定8路ADS8681数据采集:从Vivado Block Design到上位机TCP通信的完整流程

ZYNQ与LWIP构建的8通道高速数据采集系统实战指南 在工业自动化、测试测量和科研领域&#xff0c;多通道高精度数据采集系统正变得越来越重要。本文将详细介绍如何利用Xilinx ZYNQ SoC和LWIP协议栈&#xff0c;构建一个支持8路ADS8681同步采集的实时数据传输系统。不同于简单的代…...

深度集成AI的VSCode扩展:从代码生成到调试的全流程实战指南

1. 项目概述&#xff1a;一个为VSCode注入AI灵魂的扩展如果你和我一样&#xff0c;每天有超过8小时的时间是在Visual Studio Code&#xff08;VSCode&#xff09;里度过的&#xff0c;那么你一定对提升编码效率有着近乎偏执的追求。从代码补全、语法高亮到调试、版本控制&#…...

NVIDIA Profile Inspector终极显卡优化工具:简单易用的性能调校完整指南

NVIDIA Profile Inspector终极显卡优化工具&#xff1a;简单易用的性能调校完整指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专业的显卡优化工具&#xff0c;专为…...

低温预警!固化慢、易开裂……密封胶冬季施工手册

低温预警!固化慢、易开裂……密封胶冬季施工手册 硅酮耐候密封胶主要作用是保障幕墙的气密性、水密性。其出现问题,可能会导致耐候密封失效,从而造成幕墙漏水漏气,影响幕墙的正常使用。耐候密封胶由于考虑到现场施工,几乎都是单组分硅酮密封胶产品。进入冬季,气候变化明…...

百度网盘直链解析工具:告别限速,实现高速下载的Python解决方案

百度网盘直链解析工具&#xff1a;告别限速&#xff0c;实现高速下载的Python解决方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在数字资源共享日益频繁的今天&#xff…...

DeepSeek LeetCode 2421. 好路径的数目 Python3实现

给你 Python3 版本的代码&#xff0c;思路和之前的 Java 实现一致&#xff1a; 完整代码 python class Solution: def numberOfGoodPaths(self, vals: List[int], edges: List[List[int]]) -> int: n len(vals) # 1. 构建邻接表 gr…...