2025年分布式系统——Raft的实现

分布式系统——Raft的实现接上一个对于 Raft 的分析 这是文章的链接地址 https blog csdn net karry zzj article details 我们这一文章主要分析一下我们的作业的代码 作业主要就是在一个框架下实现相关算法 论文中提供了一张简要的 raft 算法总结图 论文 figure 2

大家好,我是讯享网,很高兴认识大家。

作业主要就是在一个框架下实现相关算法。

论文中提供了一张简要的raft算法总结图(论文figure 2),可以作为我们代码实现的指导。

讯享网

从这张图我们可以具体分析一下有如下几个主要内容:

  • State:即服务器的状态
  • RequestVote RPC:投票请求的RPC
  • AppendEntries RPC:附加日志的RPC
  • Rules for Servers:服务器的规则

等会我们具体来分析。


项目结构

首先我们来看一下这个作业项目的结构:

其中我们主要用到如下文件:

  • labrpc 文件夹下的 labrpc.go, test_test.go
  • raft 文件夹下的 config.goraft.go

我们首先打开test_test.go 文件,我们可以发现有如下函数,而此函数就是整个项目测试leader election的入口处

func TestInitialElection(t *testing.T) { 
    servers := 3 cfg := make_config(t, servers, false) defer cfg.cleanup() fmt.Printf("Test: initial election ...\n") // is a leader elected? cfg.checkOneLeader() // does the leader+term stay the same there is no failure? term1 := cfg.checkTerms() time.Sleep(2 * RaftElectionTimeout) term2 := cfg.checkTerms() if term1 != term2 { 
    fmt.Printf("warning: term changed even though there were no failures") } fmt.Printf(" ... Passed\n") } 

讯享网

我们看到有这一行代码:

讯享网cfg := make_config(t, servers, false) 

当我们点进去make_config这个函数,其实就进入到了 config.go 这个文件中。

其中有三行是创建 Rafts :

 // create a full set of Rafts. for i := 0; i < cfg.n; i++ { 
    cfg.logs[i] = map[int]int{ 
   } cfg.start1(i) } 

我们再点进去 start1 这个函数,发现有这样的一行:

讯享网rf := Make(ends, i, cfg.saved[i], applyCh) 

而这个Make函数就是在 raft.go 文件中写的,所以我们这样便知道了整个项目的一个运行流程:

小讯
上一篇 2025-01-16 18:21
下一篇 2025-01-25 15:15

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/12367.html