Raft 共识算法基于Go实现, 能力列表:
- Leader Election √
- Log Replication √
- Log Recover √
- Log Compaction ❌
- Membership Management √
Raft介绍:
- https://www.jianshu.com/p/5aed73b288f7
- https://github.com/baidu/braft/blob/master/docs/cn/raft_protocol.md
- https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md
实现参考:
可以直接阅读源码来学习具体的实现, 如果实在懒得看, 可以按照下面做:
package main
func TestRaft(t *testing.T) {
//具体可参考TestMainFunctions
//创建日志回调记录
commit := make(chan raft.CommitEntry)
//开始监听所有服务
server := raft.NewServer(":0", commit, nil)
server.Server()
exit := make(chan interface{})
go func() {
for {
select {
case c := <-commit:
//如果有数据提交会通知
log.Println(c)
case <-exit:
return
}
}
}()
//提交一条日志(如果只有一个节点会提交失败)
fmt.Println(server.Commit("TEST-LOG"))
time.Sleep(time.Second)
//获取所有日志
fmt.Println(server.Logs(0))
//获取所有节点IP
fmt.Println(server.Nodes())
//获取节点当前状态
fmt.Println(server.Status())
//退出
server.Shutdown()
close(exit)
}
测试用例可以这样做:
$ go test -v -race -run @XXXXX(具体方法名)
PASS / FAILED
或测试全部用例:
$ go test -v -race
- Log Compaction(日志快照与压缩)
- 缩容场景处理