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

【万象奥科】RZ/G2UL网关内存压力测试
测试目的 内存压力测试的目的是测试系统内存的稳定性和可靠性,以便确定系统是否能够在各种负载情况下正常运行。其主要目的有: 测试内存的正确性:通过模拟各种内存负载情况,例如写入随机数据、重复写入相同数据、使用指定的模式…...

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

SpringRetry接口异常优雅重试机制
场景: 某些场景下,如果接口出现异常需要进行重试,例如网络抖动、调用接口超时等并非接口代码导致的报错,此时可以进行接口重试机制 1、导入 spring retry 重试依赖 <!-- spring retry --><dependency><groupId>…...
2023年全国最新高校辅导员精选真题及答案46
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 27.充沛的精力和顽强的毅力是教师意志品质的体现。 答案:正确 28.规范与约束…...

程序员为了女朋you进了华为,同学去了阿里,2年后对比收入懵了
什么样的工作才是好工作?每当遇到这个问题,我们的答案总是出奇的一致:钱多事少离家近。 然而现实总是残酷的,日前,有网友在某社交论坛发帖称:自己为了女朋友留在了成都进入华为工作,而自己的同…...

Linux中的算法分离手段
0. 简介 参数分离对于绝大多数算法开发来说收益是非常大的,因为我们都知道,随着平台的更替,很多时候如果说数据流和算法交叠在一起(即接口与实现合在一起)。这将有可能会导致在迁移平台时候会导致代码难以维护&#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回归的介绍 逻辑回归ÿ…...

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

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

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

Maven高级-聚合和继承
Maven高级-聚合和继承3,聚合和继承3.1 聚合步骤1:创建一个空的maven项目步骤2:将项目的打包方式改为pom步骤3:pom.xml添加所要管理的项目步骤4:使用聚合统一管理项目3.2 继承步骤1:创建一个空的Maven项目并将其打包方式设置为pom步骤2:在子项目中设置其父工程步骤3:…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...