ETCD 源码学习--Raft log 的实现(十)

本文聚焦于ETCD中Raft Log的实现,详细阐述了unstable和stable两个关键组成部分,以及它们在节点状态维护中的作用。重点讨论了log的追加、提交和截断过程,同时提到了ApplySnapshot、CreateSnapshot和Compact等关键操作。通过对主要源码文件的概览,揭示了Raft Log如何确保数据一致性和可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。

Raft log 主要有两部分组成,一是已提交但未被上层模块处理的 unstable 消息,另一部分是已被上层处理的 stable 消息。

 

主要文件

/raft/log.go  raft log 对 stable 和 unstable 的封装

/raft/log_unstable.log  unstable 存储的实现

/raft/storage.log  stable 存储的实现

log 

log 主要维护几个主要状态来维护节点的 log 的信息,committed (已提交的 Index)、applied(已被上层应用的 Index)、storage(已被上层模块处理的entries消息) 和 unstable(已提交未处理的消息)

数据结构:

type raftLog struct {
	storage Storage //持久化存储
	unstable unstable //未持久化存储
	committed uint64 //当前节点已提交的最大Index
	applied uint64 //当前节点已应用的最大Index
	logger Logger
	maxNextEntsSize uint64
}

追加:

func (l *raftLog) maybeAppend(index, logTerm, committed uint64, ents ...pb.Entry) (lastnewi uint64, ok bool) {
	if l.matchTerm(index, logTerm) { //查看 index 的 term 与 logTerm 是否
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值