为了账号安全,请及时绑定邮箱和手机立即绑定

goraft中所有节点的状态

goraft中所有节点的状态

Go
慕标5832272 2021-12-13 18:51:46
我有 4nodes 2001、2002、2003 和 2004 的集群。它们是使用 goraft 绑定的。假设 2001 是主服务器。现在当它失败时,另一个节点成为服务器。现在我想要的是,成为当前服务器的节点应该发送消息,我是新的领导者。那么如何实现呢?我正在将 GORAFT 与 GORAFD 实现一起使用。我在这里附上源代码。main.go - 对于客户端package mainimport (    "flag"    "fmt"    "github.com/goraft/raft"    "github.com/goraft/raftd/command"    "github.com/goraft/raftd/server"    "log"    "math/rand"    "os"    "time"    "strconv")var verbose boolvar trace boolvar debug boolvar host stringvar port intvar join stringfunc init() {    flag.Parse()    flag.BoolVar(&verbose, "v", false, "verbose logging")    flag.BoolVar(&trace, "trace", false, "Raft trace debugging")    flag.BoolVar(&debug, "debug", false, "Raft debugging")    flag.StringVar(&host, "h", "localhost", "hostname")    p,_:=strconv.Atoi(flag.Arg(1))    flag.IntVar(&port, "p", p, "port")    flag.StringVar(&join, "join", "", "host:port of leader to join")    flag.Usage = func() {        fmt.Fprintf(os.Stderr, "Usage: %s [arguments] <data-path> \n", os.Args[0])        flag.PrintDefaults()    }}func main() {    log.SetFlags(0)    flag.Parse()    if verbose {        log.Print("Verbose logging enabled.")    }    if trace {        raft.SetLogLevel(raft.Trace)        log.Print("Raft trace debugging enabled.")    } else if debug {        raft.SetLogLevel(raft.Debug)        log.Print("Raft debugging enabled.")    }    rand.Seed(time.Now().UnixNano())    // Setup commands.    raft.RegisterCommand(&command.WriteCommand{})    // Set the data directory.    if flag.NArg() == 0 {        flag.Usage()        log.Fatal("Data path argument required")    }    path := flag.Arg(0)    if err := os.MkdirAll(path, 0744); err != nil {        log.Fatalf("Unable to create path: %v", err)    }    log.SetFlags(log.LstdFlags)    s := server.New(path, host, port)    log.Fatal(s.ListenAndServe("localhost:2001"))    fmt.Println("I am changing my status");}
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我做的。


我刚刚在 goraft-library 代码中插入了新行,其中发生了领导者选择。


因此,只需转到 goraft 的 server.go 文件并进行以下更改即可。


原始 Server.go - 行 [287-309]


// Sets the state of the server.

func (s *server) setState(state string) {

    s.mutex.Lock()

    defer s.mutex.Unlock()


    // Temporarily store previous values.

    prevState := s.state

    prevLeader := s.leader


    // Update state and leader.

    s.state = state

    if state == Leader {

        s.leader = s.Name()

        s.syncedPeer = make(map[string]bool)

    }


    // Dispatch state and leader change events.

    s.DispatchEvent(newEvent(StateChangeEventType, s.state, prevState))


    if prevLeader != s.leader {

        s.DispatchEvent(newEvent(LeaderChangeEventType, s.leader, prevLeader))

    }

}

编辑 Server.go


// Sets the state of the server.

func (s *server) setState(state string) {

    s.mutex.Lock()

    defer s.mutex.Unlock()


    // Temporarily store previous values.

    prevState := s.state

    prevLeader := s.leader


    // Update state and leader.

    s.state = state

    if state == Leader {

        s.leader = s.Name()

        s.syncedPeer = make(map[string]bool)

    }


    // Dispatch state and leader change events.

    s.DispatchEvent(newEvent(StateChangeEventType, s.state, prevState))


    if prevLeader != s.leader {

        fmt.Println("I am the Leader..!!  ",s.connectionString,"   ",s.path)

        s.DispatchEvent(newEvent(LeaderChangeEventType, s.leader, prevLeader))

    }

}

所以它会在活动主服务器的控制台上打印连接Stirng以及当前服务器的存储路径。


查看完整回答
反对 回复 2021-12-13
  • 1 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号