图解Raft协议

2023-09-20 15:32:31

前言

分布式系统设计中,在极大提高可用性、容错性的同时,带来了一致性问题(CAP理论),Raft协议就是解决分布式中的一致性问题。最近研究了 Raft协议,谈谈自己对 Raft 协议的理解。希望这篇文章能够帮助大家理解。

raft协议是什么?

Raft协议是一种分布式一致性算法(共识算法),共识就是多个节点对某一个事件达成一致的算法,即使出现部分节点故障,网络延时等情况,也不影响各节点,进而提高系统的整体可用性。Raft是使用较为广泛的分布式协议,我们熟悉的etcd注册中心就采用了这个算法;

Raft算法将分布式一致性分解为多个子问题,包括Leader选举(Leader election)、日志复制(Log replication)、安全性(Safety)、日志压缩(Log compaction)等。raft将系统中的角色分为领导者(Leader)、跟从者(Follower)和候选者(Candidate)。

  • Leader:接受客户端请求,并向Follower同步请求日志,当日志同步到大多数节点上后高速Follower提交日志。
  • Follower:接受并持久化Leader同步的日志,在Leader告知日志可以提交后,提交日志。当Leader出现故障时,主动推荐自己为候选人。
  • Candidate:Leader选举过程中的临时角色。向其他节点发送请求投票信息,如果获得大多数选票,则晋升为Leader。

Raft要求系统在任意时刻最多只有一个Leader,正常工作期间只有Leader和Follower,Raft算法将时间划分为任意不同长度的任期(Term),每一任期的开始都是一次选举,一个或多个候选人会试图称为Leader,在成功选举Leader后,Leader会在整个任期内管理整个集群,如果Leader选举失败,该任期就会因为没有Leader而结束,开始下一任期,并立刻开始下一次选举。

Leader选举

Raft使用心跳机制来触发领导者选举,当服务器启动时,初始化都是Follower身份,由于没有Leader,Followers无法与Leader保持心跳,因此,Followers会认为Leader已经下线,进而转为Candidate状态,然后Candidate向集群其他节点请求投票,同意自己成为Leader,如果Candidate收到超过半数节点的投票(N/2 +1),它将获胜成为Leader。

Leader向所有Follower周期性发送heartbeat,如果Follower在选举超时时间内没有收到Leader的heartbeat,就会等待一段随机的时间后发起一次Leader选举。

日志同步

Raft算法实现日志同步的具体过程如下:

  1. Leader收到来自客户端的请求,将之封装成log entry并追加到自己的日志中;
  2. Leader并行地向系统中所有节点发送日志复制消息;
  3. 接收到消息的节点确认消息没有问题,则将log entry追加到自己的日志中,并向Leader返回ACK表示接收成功;
  4. Leader若在随机超时时间内收到大多数节点的ACK,则将该log entry应用到状态机并向客户端返回成功。

总结

Raft协议是解决分布式中的一致性问题的算法,包括Leader选举(Leader election)、日志复制(Log replication)、安全性(Safety)、日志压缩(Log compaction)等。

Raft算法会先选举出Leader,Leader完全负责replicated log的管理,Leader负责接受所有客户端更新请求,然后复制到Follower,并在“安全”的时候执行这些请求,如果Leader故障,Follower会重新选举出新的Leader,保证一致性。

更多推荐

python 二手车数据分析以及价格预测

二手车交易信息爬取、数据分析以及交易价格预测引言一、数据爬取1.1解析数据1.2编写代码爬1.2.1获取详细信息1.2.2数据处理二、数据分析2.1统计分析2.2可视化分析三、价格预测3.1价格趋势分析(特征分析)3.2价格预测引言本文着眼于车辆信息,结合当下较为火热的二手车交易市场数据,对最近二手车的交易价格进行分析

服务器租用机房机房的类型应该如何选择

服务器租用机房机房的类型应该如何选择1.单电信机房单电信服务器机房业务模式比较固定,访问量也不是很大,适合新闻类网站或政务类网站。如果网站的PV流量持续增加,建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题。2.双线机房双线机房在单线机房上有所升级,主要是因为机房接入了两个运营商带宽线路。因为国内两大网

nodejs、web3js开发以太坊

nodejs、web3js开发以太坊目录nodejs、web3js开发以太坊环境依赖详解安装并运行ganache创建一个web服务器实例创建web3erver.js文件路由模块路由函数处理模块测试完整代码本案例主要利用nodejs和web3搭建一个供前端直接调用的接口,主要包含以下功能获取地址余额获取一个新的钱包转账获

Python终端优化:提高工作效率的关键步骤

💂个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】导言:Python是一种强大的编程语言,广泛用于数据分析、Web开发、自动化脚本等各种领域。对于许多开发人员和数据科学家来说,Python

MyBatis 反射模块

文章目录前言反射模块实现ReflectorReflectorFactoryInvokerMetaClassMetaObject反射模块应用SqlSessionFactory执行SQL前言MyBatis在进行参数处理、结果集映射等操作时会使用到大量的反射操作,Java中的反射功能虽然强大,但是代码编写起来比较复杂且容易出

pywinauto:Windows桌面应用自动化测试(三)

前言上一篇文章地址:pywinauto:Windows桌面应用自动化测试(二)_LionKing的博客-CSDN博客下一篇文章地址:暂无一、win应用的后端技术1、官方文档安装了pywinauto后,如何开始使用呢?首先必须确定哪种辅助技术(pywinauto的后端)可以用于你的应用程序,注意粗体部分。在Windows

【LittleXi】第四章 Process Intro exercise

目录【LittleXi】第四章ProcessIntroexercise第四章实验准备问题【LittleXi】第四章ProcessIntroexercise第四章实验准备下载实验所需代码wgethttp://pages.cs.wisc.edu/~remzi/OSTEP/Homework/HW-CPU-Intro.tgz解

ArcGIS10.1软件安装教程

ArcGIS10.1中英文(32/64位)下载地址:链接:https://pan.baidu.com/s/1Ksm112WaKMMk6La9ircCng密码:t70f安装步骤:1、我们对安装包进行解压,直接鼠标右击解压即可。2、打开我们解压的文件夹,点击Desktop3、鼠标右击setup.exe图标,选择以管理员的身

电压放大电路的作用有哪些(电压放大器)

电压放大电路是电子电路中常见且重要的组件,其主要作用是将输入信号的电压放大到所需的输出电压级别,并保持输入信号的形状和准确度。电压放大电路广泛应用于各种电子设备和系统中,具有以下几个重要的作用:信号放大:电压放大电路可以将微弱的输入信号放大到较大的输出信号。在许多应用中,输入信号的电压太小无法直接应用,例如音频信号的放

Talk | KDD‘23 Best Paper 港中文孙相国:All in One - 提示学习在图神经网络中的探索

本期为TechBeat人工智能社区第532期线上Talk!北京时间9月20日(周三)20:00,香港中文大学博后研究员—孙相国的Talk已准时在TechBeat人工智能社区开播!他与大家分享的主题是:“提示学习在图神经网络中的探索”,他分享了提示学习基本概念,并介绍了他的团队提出的图模型多任务提示方法。Talk·信息▼

在Windows环境下,使用VS2013配置FFmpeg+OpenCV开发环境

在Windows环境下,使用VS2013配置FFmpeg+OpenCV开发环境的步骤如下:1.下载FFmpeg和OpenCV库,可以到官网或者其他网站下载最新稳定版的库。2.安装FFmpeg库,将FFmpeg安装目录添加到系统环境变量中。例如,将FFmpeg安装到C:/ffmpeg,则需要将C:/ffmpeg/bin路

热文推荐