在 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 中待处理的信息ÿ