猿问

goraft中所有节点的状态

我有 4nodes 2001、2002、2003 和 2004 的集群。它们是使用 goraft 绑定的。假设 2001 是主服务器。现在当它失败时,另一个节点成为服务器。现在我想要的是,成为当前服务器的节点应该发送消息,我是新的领导者。那么如何实现呢?我正在将 GORAFT 与 GORAFD 实现一起使用。我在这里附上源代码。


main.go - 对于客户端


package main


import (

    "flag"

    "fmt"

    "github.com/goraft/raft"

    "github.com/goraft/raftd/command"

    "github.com/goraft/raftd/server"

    "log"

    "math/rand"

    "os"

    "time"

    "strconv"

)


var verbose bool

var trace bool

var debug bool

var host string

var port int

var join string


func 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");

}


慕标5832272
浏览 201回答 1
1回答

米琪卡哇伊

我做的。我刚刚在 goraft-library 代码中插入了新行,其中发生了领导者选择。因此,只需转到 goraft 的 server.go 文件并进行以下更改即可。原始 Server.go - 行 [287-309]// Sets the state of the server.func (s *server) setState(state string) {&nbsp; &nbsp; s.mutex.Lock()&nbsp; &nbsp; defer s.mutex.Unlock()&nbsp; &nbsp; // Temporarily store previous values.&nbsp; &nbsp; prevState := s.state&nbsp; &nbsp; prevLeader := s.leader&nbsp; &nbsp; // Update state and leader.&nbsp; &nbsp; s.state = state&nbsp; &nbsp; if state == Leader {&nbsp; &nbsp; &nbsp; &nbsp; s.leader = s.Name()&nbsp; &nbsp; &nbsp; &nbsp; s.syncedPeer = make(map[string]bool)&nbsp; &nbsp; }&nbsp; &nbsp; // Dispatch state and leader change events.&nbsp; &nbsp; s.DispatchEvent(newEvent(StateChangeEventType, s.state, prevState))&nbsp; &nbsp; if prevLeader != s.leader {&nbsp; &nbsp; &nbsp; &nbsp; s.DispatchEvent(newEvent(LeaderChangeEventType, s.leader, prevLeader))&nbsp; &nbsp; }}编辑 Server.go// Sets the state of the server.func (s *server) setState(state string) {&nbsp; &nbsp; s.mutex.Lock()&nbsp; &nbsp; defer s.mutex.Unlock()&nbsp; &nbsp; // Temporarily store previous values.&nbsp; &nbsp; prevState := s.state&nbsp; &nbsp; prevLeader := s.leader&nbsp; &nbsp; // Update state and leader.&nbsp; &nbsp; s.state = state&nbsp; &nbsp; if state == Leader {&nbsp; &nbsp; &nbsp; &nbsp; s.leader = s.Name()&nbsp; &nbsp; &nbsp; &nbsp; s.syncedPeer = make(map[string]bool)&nbsp; &nbsp; }&nbsp; &nbsp; // Dispatch state and leader change events.&nbsp; &nbsp; s.DispatchEvent(newEvent(StateChangeEventType, s.state, prevState))&nbsp; &nbsp; if prevLeader != s.leader {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("I am the Leader..!!&nbsp; ",s.connectionString,"&nbsp; &nbsp;",s.path)&nbsp; &nbsp; &nbsp; &nbsp; s.DispatchEvent(newEvent(LeaderChangeEventType, s.leader, prevLeader))&nbsp; &nbsp; }}所以它会在活动主服务器的控制台上打印连接Stirng以及当前服务器的存储路径。
随时随地看视频慕课网APP

相关分类

Go
我要回答