Raft 领导者选举

zookeeper学习笔记之-Raft算法(一):如何选举领导者? Raft算法(一):如何选举领导者? 参考动画更容易理解:http://thesecretlivesofdata.com/raft/(自备梯子) Raft算法官网:https://raft.github.io/ (官网上也有动画教程) Raft 算法属于 Multi-Paxos 算法,它是在兰伯特 Multi-Paxos 思想的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理解和算法实现上都相对容易许多。 除此之外,Raft 算法是现在分.. 阅读详情

Raft基础

由于Paxos算法过于复杂,需要一艘具有R{eliable|eplicated|edundant} And Fault-Tolerant的原木(log)组成的木筏(raft)驶出帕加索斯(Paxos)小岛。

Leader 领导者 处理客户端请求和日志复制,同一时刻最多只有一个领导者
Follower 跟随着 被动处理请求,不主动发送RPC请求,只响应收到的RPC请求
Candidate 候选者 用于选举出新的领导者,处于领导者和跟随者之间的暂存状态

Raft算法选举出领导者意味进入一个新任期(Term),实际上任期就是一个逻辑时间。Raft用任期解决分布式系统中的时序问题。任期单调递增且永不重复。

一个正常的任期至少有一个领导者,任期通常分为两部分,任期开始时的选举和任期正常运行的部分。
raft运行

每个服务器需要维护一个currentTerm变量,记录当前已知最新任期号,必须持久化存储currentTerm变量,以便服务器宕机重启后能够知道最新任期。

Raft服务器之间的通信通过2个RPC调用,RequestVote RPC用于领导者选举,AppendEntries RPC用于复制日志和发送心跳。

领导者选举

Raft算法启动时,每个节点都是跟随者,被动接受领导者或候选者的RPC请求。在经过超时时间后(一般每个节点不同,随机在100ms-500ms范围内)没有接受到领导者发送的RPC请求,跟随者会进入候选者状态,请求获取其他跟随者的投票,获得超过半数投票后,该节点成为领导者,向其他节点发送心跳,维持自己的领导者身份。

状态转换

raft中的角色转换

当一个节点开始竞选时,流程如下图所示,第一步,节点转换为候选者状态,目的是获取选票,成为领导者;第二步,增加自己的当前任期变量currentTerm,表示进入新的任期;第三步,先给自己投一票;第四步,并行向其他节点方式RequestVote消息索要选票,如果没有收到,会反复尝试,直到发生以下情况:
候选者参与选举
候选者选举过程

(1)获得超过半数的选票。该节点成为领导者,并向其他节点每隔一段时间发送心跳信息(空的AppendEntries),维持自己的领导者身份。
(2)收到来自领导者的AppendEntries心跳消息,说明系统中已经存在领导者,节点转换为跟随者。
(3)选举超时,说明此时没有领导者产生,重新开始新一轮选举。

选举过程需要保证共识算法中的两个特性:安全性和活性。安全性指一个任期内只有一个领导者被选举出来;活性指最终会选举出一个领导者。
安全性需要保证:
(1)每个节点在一个任期内只能投一次票,将投给第一个满足条件的RequestVote请求的发送者,然后拒绝其他候选者的请求。需要在每个节点增加一个votedFor变量(需要持久化),表示当前任期投给哪个候选者,如果没有投票,则votedFor为空。votedFor需要持久化,当节点重启恢复后,需要恢复投票信息,否则可以将票投给其他候选者。
(2)只有获取超过半数的选票才能成为领导者,即无法存在两个不同候选者在同一任期内同时成为领导者(因为无法获取 n÷2+1n{\div} 2 +1n÷2+1的选票)。

=>问题
如果选举从同一时间开始,没有一个候选者拿到多数票,比如8个节点,3个候选者,获得选票为3,3,2,触发超时,继续进行选举,循环往复。为了解决这个问题,可以通过活锁解决问题:每个节点随机选取超时时间,通常在[T,2T]范围内(比如150ms-300ms)。通过活锁,先到达超时时间的节点,转换为候选者,向其他节点请求投票。

如果T远大于网络广播时间,效果更佳。

简单实现

package go_raft

import (
	"sync"
	"time"
)

const (
	Follower = iota
	Candidate
	Leader
)

type Raft struct {
	mu sync.Mutex

	state int

	currentTerm int
	votedFor    int

	log []LogEntry

	heartbeatTime time.Time
}

type RequestVoteArgs struct {
	//候选者任期
	Term int
	//候选者id
	CandidateId int
	//候选者的最后一条日志的索引
	LastLogIndex int
	//候选者的最后一条日志的任期
	LastLogTerm int
}

type RequestVoteReply struct {
	//处理请求节点任期
	Term int
	//是否获得投票
	VoteGranter bool
}

func (rf *Raft) RequestVote(args *RequestVoteArgs, reply *RequestVoteReply) {
	rf.mu.Lock()
	defer rf.mu.Unlock()

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

	//收到更大的请求,更新自己的currentTerm,转变为Follower
	if args.Term > rf.currentTerm {
		rf.currentTerm = args.Term
		rf.state = Follower
		rf.votedFor = -1
	}

	if rf.votedFor == -1 || rf.votedFor == args.CandidateId {
		//增强选举限制
		lastIndex := len(rf.log) - 1
		if rf.log[lastIndex].Term > args.LastLogTerm ||
			(rf.log[lastIndex].Term == args.LastLogTerm && rf.log[lastIndex].Index > args.LastLogIndex) {
			return
		}

		rf.votedFor = args.CandidateId
		reply.VoteGranter = true
		rf.heartbeatTime = time.Now()
	}
	return

}

路径规划 | 图解A*、Dijkstra、GBFS算法的异同(附C++/Python/Matlab仿真) 图解A*、Dijkstra、GBFS算法原理,分析三种算法异同,提供C++/Python/Matlab仿真实现 阅读详情

相关推荐

WPS JS宏智能识别代码段并设置样式(完整可用版)

之前,我们已经经历了多次迭代,解决了许多问题,比如识别代码块、处理多行导入、调整样式等。现在他们需要一份全面的文档来解释整个代码的结构和工作原理。(5)智能行分析(含URL和注解检测优化)function analyzeLineEnhanced(rawText,trimmedText,codeSymbols,codePatterns, singleLinePatterns)该解决方案在保持高性能的同时,提供了良好的可扩展性,能够适应不同组织的代码规范需求,是WPS生态中专业文档处理的创新实践。

搏博的专栏 1822

Raft算法详解(二):领导者选举

下一篇会讲解Raft的日志复制机制对Raft算法感兴趣的朋友还可以阅读一下我翻译的Raft论文。

PYJTLK的博客 1149

芯片Tapeout前GDS Review | Calibre中如何切出gds中指定区域版图?

芯片Tapeout GDS Review 之Calibre中如何切出指定区域版图GDS

weixin_37584728的博客 1786

选举之Raft算法

Raft算法是基于Multi-Paxos 思想 提出的一种易于理解的共识算法,主要解决了分布式中的一致性问题。Raft算法中每个节点拥有三种状态: 跟随者状态 候选者状态 领导者状态 1、所有的节点初始都是在跟随者状态下 2、如果一个跟随者在一定时间内(150ms 至300ms,随机值)没有收到领导者的心跳信息,自己将变成候选者状态,先投自己一票,并向群体内的其它节点发送选举投票请求 3、群体内的其它节点如果在这一任期内没有投过票,收到投票请求后将投一票给候选者,并返回 4、如果一个候选者收到了群体内

旭旭1998的博客 2074

1.Fay-UE5数字人工程导入(UE数字人系统教程)

ue5数字人系列教程(含源文件工程)

1万+

python监听海康威视报警服务器

因为我使用海康威视摄像头是自带热成像的所以事件报警会上报两张图片,一张是RGB图像、另一张是热成像图像,因此使用。拿到的就是第一张RGB图像。可以点击测试,会显示。

qq_57018478的博客 1157

Raft算法之Leader选举

Raft 使用心跳(heartbeat)触发Leader选举。当服务器启动时,初始化为Follower。Leader向所有Followers周期性发送heartbeat。如果Follower在选举超时时间内没有收到Leader的heartbeat,就会等待一段随机的时间后发起一次Leader选举。Follower将其当前term加一然后转换为Candidate。它首先给自己投票并且给集群中的其他服务器发送 RequestVote RPC。结果有以下三种情况:1、赢得了多数的选票,成功选举为Leader。

一直在努力的小渣渣 1244

计算机网络自顶向下(第八版)第一章课后习题

电路交换网络具有以下优点:资源独占性,在建立连接时,电路交换网络为通信双方独占一条物理路径,不会受到其他用户的影响。低时延,由于建立了专用路径,数据传输时延较小,适合对时延敏感的应用,如实时语音和视频通信。数据链路层:提供节点之间可靠的数据传输,主要任务是错误检测和纠正,以及数据帧的传输和访问控制。移动蜂窝网络:如4G LTE和5G,通过移动基站提供的无线信号实现移动设备的互联网接入。网络层:负责数据包的路由和转发,主要任务是通过网络选择最佳路径,进行流量控制和拥塞控制。手机,服务器,路由器,电脑;

hiahiakk的博客 2255

Raft学习笔记【二】——领导者选举

昨天晚上在优快云上找到了一篇Raft详解的文章,写的非常好,比我的文章好多了。分布式共识算法 —— Raft详解_raft共识-优快云博客,可能有同学要问了,都有那么好的文章了,比你的都写的好多了,那你还写什么?对于这个问题,我觉得我最近在网上看到的一句话说的挺好,也很适合作为这个问题的答案——”了解靠看,熟练靠用,真的掌握要靠教“。我现在觉得这句话说的特别好,之前我学习新知识,最多就靠看,靠用,但很少去教。一方面是因为没有适合教的对象,另一方面是教是件很耗费精力的事。

meeiuliuus的博客 1133

QML从入门到实战 - 完整学习路线

想入门 QML 开发?来 “从零开始学 QML” 专栏,海量源码 + 实战案例 + 大型项目拆解,手把手教你搞定跨平台 UI 设计,小白也能轻松掌握!

BenBierBa的博客 3478

数学建模之0—1规划(Python)

目录 1、概述 (1)知识框架 (2)线性整数规划模型 (3)分支定界法 2、案例 (1)案例1​ (2)案例2 3、遗传算法—sko-GA包实现 (1)代码 (2)结果 4、PuLp实现 (1)代码 (2)结果 5、致谢 1、概述 (1)知识框架 (2)线性整数规划模型 (3)分支定界法 2、案例 (1)案例1 (2)案例2 3、遗传算法—sko-GA包...

weixin_46039719的博客 4109

Raft算法基本工作原理

Raft算法基本工作原理

fucheng的博客 1407

《YOLO11魔术师专栏》专栏介绍 & 专栏目录

【原创自研模块】【多组合点优化】【注意力机制】【主干篇】【neck优化】【卷积魔改】 【block&多尺度融合结合】【损失&IOU优化】【上下采样优化】【小目标性能提升】【前沿论文分享】【训练实战篇】

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1万+

Raft-领导者选举

本文主要分析了raft算法领导者选举的原理和NuRaft库关于这部分的源码分析。源码分析这里主要探讨了Pre Vote阶段的原因,以及选举大体上的流程。还有很多细节上的点需要再研究。

qq_51950769的博客 1370

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Raft共识算法领导者选举流程揭秘

Raft算法是现代分布式系统开发首选的共识算法,Raft算法属于Multi-Paxos算法,是在兰伯特Multi-Paxos思想的基础上,做了一些简化和限制。Raft算法的应用非常广泛掌握这个算法,可以得心应手的处理大部分场景的容错和一致性需求。关于 Raft 算法分三期讲解,分别介绍领导者选举、日志复制、成员变更,这篇文章首先讲解领导者选举。

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Raft 算法详解(一)领导者选举

Raft 算法属于 Multi-Paxos 算法,它是在兰伯特 Multi-Paxos 思想的基础上,做了一些简 化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理 解和算法实现上都相对容易许多。 除此之外,Raft 算法是现在分布式系统开发首选的共识算法。绝大多数选用 Paxos 算法的 系统(比如 Cubby、Spanner)都是在 Raft 算法发布前开发的,当时没得选;而全新的系统大多选择了 Raft 算法(比如 Etcd、Consul、CockroachDB)。 对你

林木森的博客 4405

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Raft 共识算法学习笔记 一:领导者选举

Raft 算法是现在分布式系统开发首选的共识算法。文章 《图解 Paxos 算法》 介绍了 Paxos 共识算法,绝大多数选用 Paxos 算法的系统(比如 Cubby),都是在 Raft 算法发布前开发的,当时没得选。新系统绝大多数选择了 Raft 算法,例如,Etcd,Consul,等。就像作者 Diego Ongaro 在 Raft 论文 In Search of an Understandable Consensus Algorithm 说的,Paxos 太难理解了,无论是对于学生还是系统开发者来说

Leo的博客 1779

Raft 共识算法2-领导者选举

我们发现这种方法在可用性方面产生了微妙的问题(如果排名较高的服务器出现故障,排名较低的服务器可能需要超时并再次成为候选者,但如果时间过早,它可能会重置选举领导者的进程 ). 我们对算法进行了多次调整,但每次调整后都会出现新的极端情况。如果跟随者在称为选举超时(election timeout)的一段时间内没有收到任何通信,那么它会假定没有可行的领导者并开始选举以选择新的领导者。如果领导者的任期(包含在其 RPC 中)至少与候选者的当前任期一样大,则候选者承认领导者是合法的并返回到追随者状态。

serene的博客 506

Raft算法(一):如何选举领导者?

分布式协议Raft算法选主过程介绍

AllenChan_的博客 350

07 | Raft算法(一):如何选举领导者?

我们知道,议会选举中的领导者是有任期的,领导者任命到期后,要重新开会再次选举。Raft 算法中的领导者也是有任期的,每个任期由单调递增的数字(任期编号)标识,比如节点 A 的任期编号是 1。任期编号是随着选举的举行而变化的,这是在说下面几点。1. 跟随者在等待领导者心跳信息超时后,推举自己为候选人时,会增加自己的任期号,比如节点 A 的当前任期编号为 0,那么在推举自己为候选人时,会将自己的任期编号增加为 1。

qq_37756660的博客 2926

07 | Raft算法(一):如何选举领导者

07 | Raft算法(一):如何选举领导者 原文链接 链接 详解内容 参考文档- 极客时间分布式协议

weixin_38805083的博客 2269

从ZooKeeper到ETCD:图解Raft算法如何用Go语言实现领导者选举

本文深入剖析了Raft算法在ETCD中的Go语言实现,重点图解了其领导者选举机制,特别是随机化超时窗口的精妙设计。通过对比ZooKeeper的ZAB协议,阐述了Raft在工程实现上的优势,并给出了在Kubernetes生产环境中调优ETCD选举参数(如心跳间隔与选举超时)的实战建议。

chair的专栏 840

分布式算法raft系列(2)-领导者选举

RAFT的领导者选举通过任期号、投票机制和随机超时确保分布式系统中只有一个领导者,并能快速应对故障。选举过程简单高效,依赖多数节点的共识来保证一致性和容错性。

weixin_43837016的博客 522

图解Raft之领导者选举

图解Raft领导者选举,这里通过五张图来解答Raft选举的全过程;   Raft集群各个节点之间是通过RPC通讯传递消息的,每个节点都包含一个RPC服务端与客户端,初始时启动RPC服务端、状态设置为Follower、启动选举定时器,每个Raft节点的选举定时器超时时间都在100-500毫秒之间且并不一致;   Raft节点启动后在一个选举定时器周期内未收到心跳和投票请求,则状态转为候选者can...

weixin_30924239的博客 1172

【分布式共识】Raft算法 选举一个领导者

Raft算法 选举一个领导者

芝兰生于深谷,不以无人而不芳 367

Raft协议解析:领导者选举与日志复制

该协议将系统节点明确分为领导者(Leader)、跟随者(Follower)和候选者(Candidate)三类角色,通过心跳驱动选举和日志强制同步两大核心机制,既规避了传统算法Paxos的复杂性,又保证了网络分区或节点故障时的快速恢复能力。其任期递增(Term)规则与多数派承诺(Quorum)策略,确保了集群在领导者宕机时能通过严格的选举超时竞争机制快速切换新主节点,而日志连续性校验与状态机复制规则则为跨节点数据一致性提供了数学证明级别的可靠性支撑。

小红的布丁的博客 1312
上一篇: 商人过河问题
下一篇: Raft日志复制
yumWant2debug
博客等级 码龄7年 27粉丝 26原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值