Talent Plan:实现一个 Mini 版本的分布式 Key-value 数据库(二)

第一篇:https://blog.csdn.net/westbrookliu/article/details/107451683

project2 RaftKV——Leader election

这次实现的是Raft算法,该算法分为三部分实现:

  • Leader election
  • Log replication
  • Raw node interface

预备知识

  • 什么是Raft算法?
    可以看看下面这篇文章了解一下
    https://blog.csdn.net/westbrookliu/article/details/99713334
    还可以在Raft官网玩玩:https://raft.github.io/

第一步:看代码

基本上只要看raft目录下的几个文件:

  • raft.go:主要要补充的文件,实现了Raft算法
  • log.go:Raft日志的实现
  • raft_paper_test.go:测试用例
  • proto/pkg/eraftpb/eraft.pb.go:一些协议值

第二步:跑代码

make project2aa

不用看,肯定过不了=_=

第三步:写代码

当然,首先要理解Raft算法才能动手写。然后理解一下raft.go的几个函数:

tick()

看名字就和时间有关,调用一次这个函数说明过了一个时间单位,这个函数主要就是判断一些超时时间

func (r *Raft) tick() {
   
	// Your Code Here (2A).
	switch r.State {
   
	case StateFollower, StateCandidate:
		r.electionElapsed++
		if r.electionElapsed >= r.randomElectionTimeout {
   
			r.electionElapsed = 0
			_ = r.Step(pb.Message{
   
				MsgType: pb.MessageType_MsgHup,
				From:    r.id,
				Term:    r.Term,
			})
		}
	case StateLeader:
		r.heartbeatElapsed++
		if r.heartbeatElapsed >= r.heartbeatTimeout {
   
			r.heartbeatElapsed = 0
			_ = r.Step(pb.Message{
   
				MsgType: pb.MessageType_MsgBeat,
				To:      r.id,
				Term:    r.Term,
			})
		}
	}
}
becomeXXX

当角色转换时需要做的一些状态值的变更

func (r *Raft) resetTime() {
   
	r.electionElapsed = 0
	r.heartbeatElapsed = 0
	r.randomElectionTimeout = r.electionTimeout + rand.Intn
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值