ETCD 源码学习--Raft 节点实现的代码结构(十一)

本文聚焦于ETCD中Raft节点的实现,重点介绍了raft、node和raftNode三个模块的功能。raft模块实现了底层的Raft协议;node模块作为中间层,负责消息传递;raftNode模块处理raft消息并广播到其他节点。文章概述了各模块的主要数据结构和goroutine,阐述了节点如何根据状态机进行状态切换和消息处理。
摘要由CSDN通过智能技术生成

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

Raft 节点在代码上主要通过三个模块,他们包括:

1.raft 模块,用于实现底层的 raft 协议。

2.node 模块,封装 raft 模块,作为中间层,即将外部的消息提案传递到底层 raft 模块,同时将 raft 模块中,待上层模块处理的消息传递到 raftNode 中。

3.raftNode 模块,用于处理 raft 底层的消息,将消息应用到自身节点,同时将消息广播到其他节点(Leader)。

主要文件 

/raft/raft.go   raft模块

/raft/node.go  node 模块

/etcdserver/raft.go  raftNode 模块

raftNode

数据结构:

type raftNode struct {

	raftNodeConfig 
    //快照消息,最终被server处理
	msgSnapC chan raftpb.Message
	//待应用的消息,最终被server处理
	applyc chan apply

	//ReadyC.ReadStates中封装了只读请求相关的ReadState实例
	//其中最后一项被写入readState通道中等待上层处理
	readStateC chan raft.ReadState
	//逻辑时钟,每触发一次就会推进底层的选举计时器和心跳计时器
	ticker *time.Ticker
	//检测发往同一个节点的两次心跳消息是否超时
	td *contention.TimeoutDetector
	stopped chan struct{}
	done    chan struct{}
}
type raftNodeConfig struct {
	lg *zap.Logger
	isIDRemoved func(id uint64) bool
	raft.Node //node 节点
	raftStorage *raft.MemoryStorage
	storage     Storage
	heartbeat   time.Duration // 
	transport rafthttp.Transporter //网络消息发送模块
}

主要 goroutin start():

1.推进 raft 心跳和选举计时器

2.处理 raft 中待处理的信息ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值