Goelect is an open-source Go (Golang) library for leader election. It is heavily influenced by the election component of the Raft implementation. For more details, you can refer to Raft Wiki.
- Independent Operation: No third-party services are required. You don't need to set up or rely on external systems like ZooKeeper or etcd.
- Simplified Integration: Easy to integrate into your existing Golang projects with minimal configuration.
- Supports Novote role:The no-vote node does not participate in the election.
- Highly Available: Built to be fault-tolerant, suitable for systems that require high availability.
// ElectConfig is a struct that represents the configuration for an election.
type ElectConfig struct {
// Timeout for heartbeat messages, in milliseconds
HeartBeatInterval uint
// Timeout for election messages, in milliseconds
ElectTimeout uint
// Timeout for connecting to peers, in seconds
ConnectTimeout uint
// List of peers in the network
Peers []Node
// Node represents the information of this node
Node Node
// State callbacks
CallBacks *StateCallBacks
// Timeout for callbacks, in seconds
CallBackTimeout int
}
examples/onenode/node.go
is a great example of using this goelect package.
Create an Elect instance:
// use the built-in RPC as the transport layer.
rpcTransport, err := rpc.NewRPC(logger)
if err != nil {
return nil, err
}
e, err := goelect.NewElect(
rpcTransport,
// rpc transport config
&rpc.Config{},
&goelect.ElectConfig{
ElectTimeout: 200,
HeartBeatInterval: 150,
ConnectTimeout: 10,
Peers: peerNodes,
// state transition callbacks
CallBacks: &goelect.StateCallBacks{
EnterLeader: enterLeader,
LeaveLeader: leaveLeader,
EnterFollower: enterFollower,
LeaveFollower: leaveFollower,
EnterCandidate: enterCandidate,
LeaveCandidate: leaveCandidate,
},
// self node
Node: goelect.Node{
Address: *nodeAddress,
ID: *nodeAddress,
},
}, logger)
Start the Elect:
err = e.Run()
This is everything we need to do :)