etcd源码-阅读
前言
好久没写blog了,感觉过去自己太过浮躁,在没有自己内容的沉淀的时候就考虑做输出,往往给人的感觉是内容的东拼西凑。计算机本身是一门应用科学,实践的价值往往大于单纯地看一些别人的总结。后面估计会花更多时间真的去好好在开源项目上有一些输出,估计blog会尽量少写了。后面的方向估计还是往分布式存储的方向走。
checklist:
- 算法(leetcode 800题达成)
- Mit6.824(基本完成)
- tidb(有点难,希望不要轻易放弃)
背景
最近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
}