ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

thor雷神项目Raft进阶:持久化、快照与日志压缩一文搞懂

thor雷神项目Raft进阶:持久化、快照与日志压缩一文搞懂 thor雷神项目Raft进阶持久化、快照与日志压缩一文搞懂【免费下载链接】thor项目地址: https://gitcode.com/gh_mirrors/thor3/thorthor 雷神项目是一个专注于 MIT 6.824 分布式系统课程的中文字幕翻译项目。在这篇文章中我们将借助该项目整理的课程资料一次性搞懂Raft 持久化、快照Snapshot与日志压缩Log Compaction这三大进阶主题。无论你是刚接触分布式系统的新手还是正在刷 6.824 Lab 3 的实验党这篇通俗易懂的指南都能帮你建立清晰的心智模型。为什么 Raft 需要持久化先理解重启这个难题想象一下一个 Raft 集群里的服务器突然断电重启它该如何重新融入集群答案是——它必须记住一些绝对不能丢的信息。如果服务器重启后失忆就可能发生重复投票、任期错乱甚至产生两个 leader 同时发号施令的严重问题脑裂。Raft 论文的 Figure 2 明确给出了答案整个 Raft 协议中只有三样东西需要持久化。记住这一点你就能理解 6.824 Lab 3 中大部分persist()代码的动机。需要持久化的状态作用丢失的后果日志Log记录所有已提交、待提交的客户端指令无法恢复应用状态currentTerm当前任期防止旧任期节点干扰选举可能造成重复投票、选票错乱votedFor投票给谁保证一个任期只投一票同一任期可能投出两票导致两个 leader 有意思的是应用层状态比如 KV 存储的键值表反而不要求持久化——因为它可以由日志重放完整重建。这正是日志是应用状态的唯一记录这一设计哲学的体现。日志为什么必须落盘一次崩溃就明白了假设一个 follower 刚收到 leader 发来的日志条目还没来得及落盘就崩溃了。重启后它的日志里没有这条记录那它在下一次选举中投出的票、做出的决定就可能基于残缺的历史——这会让集群的一致性大打折扣。所以 Raft 的规则是日志条目必须持久化到磁盘后才算安全。在 thor 项目的课程字幕中老师专门强调在真实的 Raft 实现里持久化是性能的关键瓶颈——因为磁盘写入哪怕是 SSD也比内存慢几个数量级每次落盘可能消耗约 10 毫秒。日志会无限增长快照与日志压缩登场现在进入今天的主角日志压缩与快照。如果系统运行几个月甚至几年日志会怎样按照 Raft 的基本规则日志只会不断增长——可能积累数百万条记录这会导致三个问题 占用巨大的磁盘空间每次持久化都是一次昂贵的 I/O 占内存所有条目都要在内存中保留⏳ 重启恢复极慢服务器需要从头重放数百万条日志才能重建状态可能要花几个小时而快照Snapshot就是解决这个问题的优雅方案。思路很简单既然日志里大部分旧指令的效果已经体现在应用状态里了为什么不直接保存一份应用状态的副本然后把旧日志扔掉呢举例来说如果日志里依次写着X1、X2、Y7那么只要保存最终状态X2, Y7前面两条关于 X 的记录就可以丢弃了。快照的创建流程三步走Raft 的快照机制可以概括为三步向应用层要状态Raft 层请求应用层如 KV 存储生成一份当前状态的快照副本打标签快照必须和日志中的某个位置某个日志条目的索引对应这样才知道这份快照代表执行到哪一步的状态落盘并清理把快照保存到磁盘同时把该位置之前的日志全部删除日志被压缩成一条精简记录之后服务器重启时就不需要从头重放日志了——先加载最近的快照再重放快照之后的少量日志即可恢复速度大幅提升。落后的 follower 如何追赶InstallSnapshot RPC集群中难免有节点落后太多比如宕机很久的节点或者新加入集群的节点。此时 leader 需要的日志可能已经被快照压缩掉了怎么办Raft 为此设计了InstallSnapshot RPC安装快照请求leader 直接把自己保存的最新快照发给落后的 followerfollower 接收快照后直接丢弃自己过时的日志加载这份快照就能快速追上集群进度。整个过程无需逐条同步旧日志非常高效。值得一提的是快照必须带有任期与索引标签这样接收方才能判断快照是否过期、是否可以安全接受从而保证一致性不被破坏。用 thor 项目资料系统学习 Raft 进阶知识理论讲完实战学习资源来了thor 雷神项目已经将这些内容整理成了双语字幕配合视频观看效果最佳 lec06/tolerance_raft_1.srtRaft 基础、复制状态机与领导者选举 lec07/tolerance_raft_2.en.srt持久化、日志压缩与快照专题本文章节核心来源 lec05/threads_and_raft.en.srt多线程编程与 Raft 入门 lec04/primary_backup_replication.en.srt主备复制理解 Raft 之前的容错方案配套资料同样值得收藏 glossary.md分布式系统术语对照表帮助统一术语理解 doc/manual.md字幕翻译规范细节了解项目组织方式 doc/how_to_do.md字幕翻译入门指南想参与贡献的同学必读课程中老师也明确指出日志压缩与快照正是 MIT 6.824 Lab 3B 的核心考点。如果你正在做 Lab 3把上面 lec07 的字幕反复听几遍很多实现细节比如何时调用快照、如何保存 lastIncludedIndex都会豁然开朗。小结一张图记住核心要点概念一句话理解持久化日志、currentTerm、votedFor 三样必须落盘日志应用状态的唯一记录重启靠它重放快照保存应用状态副本丢弃旧日志日志压缩用快照机制让日志瘦身InstallSnapshotleader 把快照发给落后节点帮它快速追赶Raft 的持久化、快照与日志压缩本质上都是在回答同一个问题如何在节点崩溃、网络分区等故障下依然保证数据不丢、状态一致理解了这三个机制你就掌握了 Raft 进阶的钥匙。配合 thor 雷神项目的双语字幕资料把 MIT 6.824 的经典内容啃下来分布式系统的功底会扎实很多。祝学习顺利【免费下载链接】thor项目地址: https://gitcode.com/gh_mirrors/thor3/thor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表