etcd源码-阅读

前言

好久没写blog了,感觉过去自己太过浮躁,在没有自己内容的沉淀的时候就考虑做输出,往往给人的感觉是内容的东拼西凑。计算机本身是一门应用科学,实践的价值往往大于单纯地看一些别人的总结。后面估计会花更多时间真的去好好在开源项目上有一些输出,估计blog会尽量少写了。后面的方向估计还是往分布式存储的方向走。

checklist:

背景

最近1年多大部分时间时间都在写算法和mit6.824,算法和raft感觉基本是入门了,然后在尝试写tidb的tinykv的课程的时候又遇到了一些瓶颈。6.824本身是一个实验的项目,项目的实现当时是用paper提到的最直观的实现方式,比如rpc的处理都是采用同步的方式处理。然后tinykv项目用的是一个状态机的思路解决,请求的发起和接收处理都是纯异步的。优点很明显,会减少很多锁方面的处理,但是对于初学者而言,理解的成本也会更高。就在我头痛的时候,我居然发现tinykv项目的代码居然和etcd极其相似,不能说一模一样,但是几乎是拷贝过来,所以这里简单对etcd做个笔记。

Raft struct

删掉了一些跟leader election和log replication无关的参数

type raft struct {
	id uint64

	Term uint64
	Vote uint64
  
	// the log
	raftLog *raftLog

	maxMsgSize         uint64
	maxUncommittedSize uint64

	state StateType

	msgs []pb.Message

	// the leader id
	lead uint64

	// number of ticks since it reached last electionTimeout when it is leader
	// or candidate.
	// number of ticks since it reached last electionTimeout or received a
	// valid message from current leader when it is a follower.
	electionElapsed int

	// number of ticks since it reached last heartbeatTimeout.
	// only leader keeps heartbeatElapsed.
	heartbeatElapsed int

	checkQuorum bool
	preVote     bool

	heartbeatTimeout int
	electionTimeout  int
	// randomizedElectionTimeout is a random number between
	// [electiontimeout, 2 * electiontimeout - 1]. It gets reset
	// when raft changes its state to follower or candidate.
	randomizedElectionTimeout int
	disableProposalForwarding bool
}