分布式学习:Raft算法以及具体实现

news/2024/9/19 6:03:33/文章来源:https://www.cnblogs.com/pinoky/p/18415050

Raft算法

一致性算法的要求:

  • 安全性,网络延迟、分区、丢包、重复和乱序等错误需要保证正确
  • 可用性:集群中只需要大多数机器即可运行
  • 不依赖时序保证一致性

三种状态:follower,candidate,leader

任期:逻辑时钟的作用,每一段任期从一次选举开始

  • 分票可能会导致一个任期没有leader

  • 用于检测一些过期的信息,比如说过期的leader(term小于candidate的term)

leader选举

什么时候选举:follower一段时间内没有收到任何消息(leader的追加日志,或candidate的投票请求),超过选举超时时间

什么情况投票:先来先服务 + candidate的日志必须和大多数服务节点的日志至少一样新

这是为了保证,成为leader的人必然拥有之前所有任期内已经被commit的日志,避免不同的状态机执行不同的指令序列

体现在代码上:使用log最后一个条目的term和idx来判断哪个是更新的日志

什么时候成为leader:获取大多数服务器节点针对同一任期号的选票

成为leader后做什么:立刻发送一轮心跳包维护自己权威,阻止发起新的选举

如果有旧leader从宕机恢复,并发送追加日志给candidate怎么办:比较两者的任期大小

如果产生分票,怎么避免:随机选举超时时间,把服务器的选举时间都分散开,对选举超时时间的基本要求为:大于 发送RPC一去一回的总时间, 小于 单个server平均故障间隔的时间

日志复制

什么时候追加日志给follower:

当leader接收到上层服务下发的命令后:将命令放到自己的log中,并行将应发送给各follower的日志条目发送给follower

体现在代码上:

在leader中维护了matchidx数组,记录每个follower现在更新到的日志下标;

nextidx数组,记录了要发送给每个follower的下个日志的下标;

prelogindex 和 prelogterm 指向 leader要发送日志的前一个日志,用以判断follower之前的日志是否与leader冲突,如果冲突则追加日志失败,follower返回Xterm,Xindex,Xlen

  • Xterm = -1, Xindex = -1, Xlen = follower全部日志长度:全部日志冲突
  • Xterm = 冲突log的term,Xindex = 冲突term内的第一条log的下标

帮助leader快速修改nextidx数组,定位到下一批应该追加给该follower的日志

什么时候返回结果:

当leader收到了大多数follow的追加成功回复后,leader会commit该日志,然后尝试apply该日志给上层存储服务,让上层执行并返回结果给客户端;

如果leader crash怎么办:follower太久没有收到heartbeat消息,触发选举超时,转变成candidate开始选举

如果follower crash怎么办:leader会无限重试发送追加日志给它们,直到它们重启

体现在代码上:

leader中有个专门的协程遍历matchindex数组,更新commitindex

并会在追加日志的时候附带发送commitindex,让follower更新该值;

leader和follower中都有个专门的协程,在commitindex更新时被唤醒,开始执行日志的apply

日志持久化

该部分较简单,只需在需要持久化的状态currentTerm,votedFor,log三者任一发生变化时,立刻调用persist()保存raftstate即可

其中currentTerm保存leader的当前任期值,votedFor保存follower的投票选择,log保存节点的日志,而诸如commitindex、lastapplied、nextindex[]、matchindex[]等状态,都可以通过保存的log,在Append Entries RPC的发送和返回中逐步调整恢复,故不需要保存

日志快照

  • 为了防止日志随着增长越来越大重放时间越来越长,所以使用snapshot,对一部分早期的日志进行快照

  • 快照内容除了包括应用数据信息,还包括了一些元数据信息:如快照中最后一个日志包含的term以及index

  • 一旦系统将快照持久化到了磁盘上,就可以删除快照最后一个日志之前的日志以及快照

  • 有时候,follower的进度太慢了,leader已经把应该发给它的日志给删除了,这个时候leader必须通过installsnapshot RPC给follower发送快照

    • 如果这个快照里包含了follower所没有的日志信息(也就是快照里的日志进度比follower所有的日志进度快),follower就会接收该快照,更新到自己的快照信息中

    在本处实现上,我选择follower在接收installsnapshot RPC时并不直接删除快照中所包含的日志,而是在上层应用调用CondInstallSnapshot判断成功应用快照后,才真正进行日志的裁剪

    因为在实现逻辑上,只有当上层应用调用CondInstallSnapshot判断可以安装快照之后,raft节点上快照所包含的日志信息才真正失效

该部分较为繁琐,涉及到很多关于日志的判断和操作,由于在该部分中日志的Index0也将发生变化,故也需要重构之前的日志追加功能,包括follower日志为空时的处理、包括leader日志为空时的处理等等

我选择在节点创造后的最开始时,在日志下标为0处保存一个空日志(方便还未接收上层应用的command时,可以顺利实现leader所发送的心跳包逻辑),而在日志进行快照而裁剪后,日志下标为0处即为有效日志,此时有两种情况

  • 日志不为空,该情况不影响心跳包逻辑的处理
  • 日志为空,在该情况下,我选择持久化lastsnapshotIndex、lastsnapshotTerm,使用此两个变量代行心跳包逻辑处理中prevLogIndex,prevLogTerm的功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/797527.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过API接口获取下来的数据需要怎样应用?

在当今数字化时代,通过API接口获取数据已成为企业获取、处理和分析信息的重要手段。API接口不仅能够提高数据交互的效率,还能促进数据的安全性和灵活性。以下是如何将通过API接口获取的数据有效应用的一些方法和策略。数据整合与分析 企业可以通过API接口将不同来源的数据整合…

OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia

OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia在不受支持的 Mac 上安装 macOS Sequoia (OpenCore Legacy Patcher v2.0.0) Install macOS on unsupported Macs 请访问原文链接:https://sysin.org/blog/install-macos-on-unsuppo…

校园食堂明厨亮灶智能视频监控

校园食堂明厨亮灶智能视频监控对餐厅摄像头拍照视频监控画面进行实时分析,校园食堂明厨亮灶智能视频监控针对厨师不穿厨师服、不戴厨师帽口罩、陌生人员进入后厨、厨师工作时间玩手机打电话、后厨出现猫狗老鼠等异常行为现象,系统会自动识别抓拍报警,进而实现食品卫生安全日…

.NET 的 Native AOT 现在是什么样的?

今天要写的这篇文章源自昨天在朋友圈发的文章《UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化》[1],一位小伙伴的对话让我想全面梳理下Native AOT的现在的进展。.NET 9 的 Native AOT(Ahead-of-Time Compilation)是微软在.NET 9版本中重点发展的一项技术,旨在提…

工地车辆未冲洗识别抓拍系统

工地车辆未冲洗识别抓拍系统主要是对施工工地的出入的车辆进行冲洗监管、冲洗识别、未冲洗告警。工地车辆未冲洗识别抓拍系统 由现场监控摄像头与后台系统构成。利用前端摄像头(不分品牌)正对施工工地进出口对来往车辆实时分析识别清洗情况,将违规未清洗车辆,抓拍报警,并上…

秸秆焚烧视频监控系统

秸秆焚烧视频监控系统借助现场已经安装的视频监控摄像头,运用边缘+Ai视觉、深度学习、视频ai分析技术,对监控地区的秸秆燃烧行为进行7*24小时不间断识别监控。秸秆焚烧视频监控系统自动识别现场出现烟火时,自动生成预警信息发送到监控后台中心提醒工作人员及时确认,并能够及…

循环语句与条件语句的细节与思想 --进阶C语言

目录if-else组合if的执行顺序操作符的执行顺序测试方法C语言的布尔类型switch case组合(补充) 屏蔽警告的方法在case中执行多条语句,建议case后都带上花括号.多个case执行同样语句do、while、for循环的基本结构continue跳转的位置循环设计的思想推荐推荐使用for的前闭后开写法n…

通过API接口获取数据:高效、灵活的数据交互之道

在数字化时代,数据已成为企业最宝贵的资产之一。企业和开发者对于数据的获取、处理和分析的需求日益增长。API(应用程序编程接口)接口作为连接不同系统和应用程序的桥梁,提供了一种高效、灵活的方式来获取和交换数据。本文将探讨为什么通过API接口获取数据是现代应用程序开…

【工具使用】【Shell脚本】【gitlab】下拉所有的仓库代码并指定分支推送给客户仓库

1 前言 这不是项目要结束了么,项目验收要交付源代码,客户在阿里云上买了个云效,需要把我们公司的代码同步上去。 首先云效支持各种导入,比如直接贴上你的 gitlab地址,再加个token 他就会自己同步,但我不能这么做,主要是因为我们公司有的别的项目代码也在一块,只是分支…

南沙C++信奥老师解一本通题: 1361:产生数(Produce)

​[题目描述】给出一个整数n(n≤2000)和k个变换规则(k≤15)。规则: ① 1个数字可以变换成另1个数字; ② 规则中,右边的数字不能为零。 例如:n=234,k=2规则为 2 → 5 3 → 6 上面的整数234经过变换后可能产生出的整数为(包括原数)234,534,264,564共4种不同的产生数…

Switch大气层游戏下载服务及实测列表

朗读全文Your browser does not support the audio element. 有什么用/怎么用 更新实测的Switch大气层中安装的游戏列表, 分享安装和测试体验, 列表会不定时更新 已记录实测了的Switch游戏会在本地存储, 方便客户直接从本地快速获取 (请联系博主, 提供线上线下有偿安装服务…

WIFI远程无线中继之K2P刷机Padavan无线桥接功能

WI-FI无线中继, 无线桥接, 扩大WIFI信号覆盖范围/面积朗读全文Your browser does not support the audio element. 有什么用/怎么用 本文仅围绕着有限的硬件投入情况下, 如何扩大WIFI信号覆盖范围/面积. 抛砖引玉, 如果您有更好的方案, 请大方地留言告诉我, 提前感谢 需求…