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

mit6.824-lab2b日志一致性

目录

      • Start函数
      • AppendEntries函数
      • 整体架构&goroutine

主要内容:client调用start()添加日志后,raft如何保证日志如何被安全、可靠、快速的添加到raft集群中。

Start函数

客户端调用Start函数后应立即返回,无论raft添加结果如何。如果当前节点是leader的话,则更新自己的日志。

//客户端发送command消息
func (rf *Raft) Start(command interface{}) (int, int, bool) 
...
//leader: 更新日志
		log := Log{term, command, index}
		rf.entries = append(rf.entries, log)
		rf.matchIndex[rf.me] = len(rf.entries) - 1
		rf.cond.Signal() //通知发送更改包(心跳)

AppendEntries函数

leader通过调用AppendEntries rpc来更新follower的日志。

leader由nextIndex[i]可以知道要发送给该服务器的下一条日志索引,并将前一条日志的索引(prevLogIndex)、任期(prevLogTerm)、Entries[nextIndex[i]:]作为参数发送给follower,follower凭借上列参数更新自己的日志。
接收者(follower)具体流程

  1. 检测leader合法性
  2. 重置选举计时器
  3. 检测日志中是否包含与leader一致的Entries[prevLogIndex]
  4. 根据参数Entries更新自己的日志。
  5. 更新commitIndex

过程很简单,可是raft论文中有很多隐晦的地方没有讲清楚,算是有不少坑在这里。

快重传:在前三步的检测失败时,告知leader失败的原因,并且告知leader下一次发送的nextIndex[i]。
在reply中加入三个变量:Xterm(冲突的任期)、Xlen(日志空位)、Xindex(下次发送的index)。

如果follower存在prevLogIndex的日志,并且发生冲突的话,返回follower冲突日志所对应任期的第一条日志Index。
https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/lecture-07-raft2/7.3-hui-fu-jia-su-backup-acceleration

第四步中,需要注意:添加follower中没有的日志,需要处理已经包含、冲突、缺少的问题
如果leader的nextIndex=[2,2,2],follower的日志在更新完后必须为1234。

server当前日志接收的日志
leader1234
follower1123[3,4]
follower21256[3,4]
follower312[3,4]

整体架构&goroutine

	go rf.ticker()
	go rf.UpdateOtherLogsLoop()
	go rf.applier()
	go rf.UpdateOtherLogSignal()

ticker:lab2a选举相关
UpdateOtherLogs*:发送心跳包,发送心跳的时候顺带更新日志
applier:周期检查日志是否被提交,如果已经提交,则应用到状态机,<-Applych

发送心跳包用了两个goroutine:Loop和Signal。
Loop为周期性发送心跳,每隔100ms发送一次。
Signal为响应式发送心跳,包阻塞在sync.cond上,每当Client调用Start()时,leader成功添加command到自己的日志,就会调用cond.signal(),立即发送更新日志的请求。
如果只用Loop发送心跳包,运行lab2b:90s+,Loop+Signal:60s+。


http://www.kler.cn/a/3083.html

相关文章:

  • Mac Electron 应用签名(signature)和公证(notarization)
  • 详解python的修饰符
  • 第十四讲 JDBC数据库
  • Spring MVC 综合案例
  • 【C++题解】1393. 与7无关的数?
  • LangGraph系列-1:用LangGraph构建简单聊天机器人
  • TimesNet 代码阅读
  • Zabbix【部署 01】Zabbix企业级分布式监控系统部署配置使用实例(在线安装及问题处理)程序安装+数据库初始+前端配置+服务启动+Web登录
  • 学校官网的制作
  • HTTPS 的工作原理
  • Python数据结构与算法篇(四)-- 滑动窗口算法
  • 阿里邮箱发送邮件 Java
  • 【C语言进阶】 12. 假期测评①
  • go语言gin框架学习
  • Android开发-Android UI与布局
  • vue里面的 Object.defineProperty 和 Proxy使用优势
  • 【AR技术】AR教学机器人
  • 【Python语言基础】——Python 字典方法
  • 用Node.js实现一个HTTP服务器程序(文件服务器)
  • 【K哥爬虫普法】大众点评VS百度地图,论“数据权属”对爬虫开发的罪与罚!
  • JQuery
  • ESP32设备驱动-HDC1080温度湿度传感器驱动
  • 【Pytorch】利用PyTorch实现图像识别
  • 标准I/O
  • 用Pytorch搭建一个房价预测模型
  • 关于学习的一些网站(自用)