Raft library介绍
Raft library是etcd中的raft实现,只实现了Raft算法,使用者需要自己提供transportation层用于节点间通信,storage层用于持久化Raft log和state.
Raft library实现如下特性:
- Leader election
- Log replication
- Log compaction
- Membership changes
- Leadership transfer extension
使用Raft library的项目:
- etcd
- tikv
- cockroachdb
- dgraph
使用方法
启动三个节点的集群
|
|
启动单节点
|
|
重启节点
|
|
Propose新的请求
|
|
请求处理逻辑
|
|
- 等待s.Node.Ready channel新的请求
- append日志
- 发送给其它节点
- apply日志
- 调用s.Node.Advance继续接收新的请求
定期循环调用Node.Tick()
,用于发送心跳消息和选举消息.
消息处理
|
|
接收消息后,调用Step方法触发Ready处理逻辑。
Raft Example
分为三个部分
- 对外展示的kv存储层
- 用于raft library的存储层
- raft library
kv storage
kv层通过RESTFul接口可以进行PUT/GET操作。
raftexample/httpapi.go
|
|
PUT通过Propose方法,进行raft请求。
kvstore.go
|
|
应用raft log,写到kv store里面。对于空信号,表示初始化,需要从snapshot中装载数据
Transport
用于raft节点间通信
raftexample/raft.go
|
|
以及接收消息后的处理逻辑:
coreos/etcd/rafthttp/peer.go
|
|
raftexample/raft.go
|
|
raft storage
raft storage层借助snap
,wal
,MemoryStorage
,完成日志,快照以及内存存储。
Replay WAL
|
|
处理请求
raft.go
|
|
先写WAL,然后append日志,Send给其它节点,最后publishEntries进行应用。