https://github.com/coreos/etcd/tree/master/raftgit
import "github.com/coreos/etcd/raft"github
---------------------------------------------------------------------------算法
raft是一个协议,一个节点集群能够维护一个复制状态机。状态机经过使用复制日志保持同步。有关Raft的更多详细信息,请参阅Diego Ongaro和John Ousterhout的“寻找可理解的一致性算法”(https://ramcloud.stanford.edu/raft.pdf)。
这个raft库是稳定和功能齐全。截至2016年,它是生产中使用最普遍的raft库,天天服务数万个集群。它支持分布式系统,如etcd,Kubernetes,Docker Swarm,Cloud Foundry Diego,CockroachDB,TiDB,Project Calico,Flannel等等。
大多数Raft实现具备单片设计,包括存储处理,消息序列化和网络传输。这个库只是经过实现核心筏算法来遵循简约的设计理念。这种极简主义得到了灵活性,肯定性和性能。
为了保持代码库的小并且灵活,库只实现了Raft算法;网络和磁盘IO都留给用户。库用户必须实现他们本身的传输层,以便经过电报在Raft对端之间传递消息。一样,用户必须实现本身的存储层来坚持木筏日志和状态。
为了方便测试Raft库,其行为应该是肯定性的。为了实现这个决定论,库将raft做为一个状态机来模拟。状态机将消息做为输入。消息能够是本地定时器更新,也能够是远程对等体发送的网络消息。状态机的输出是一个三元组{{Messages,[] LogEntries,NextState},它由一系列消息,日志条目和raft状态变化组成。对于状态相同的状态机,相同的状态机输入应始终生成相同的状态机输出。
一个简单的示例应用程序raftexample也能够帮助说明如何在实践中使用这个包:https://github.com/coreos/etcd/tree/master/contrib/raftexample数据库
Feature安全
这个raft实现是Raft协议的一个全功能实现。功能包括:
领导选举
日志复制
日志压缩
会员变动
领导转移延期
由领导者和追随者提供高效的线性化只读查询
在处理只读查询以前,领导检查法定人数并绕过Raft日志
追随者要求领导在处理只读查询以前得到安全的读取索引
更高效的基于租约的可线性化只读查询由领导者和追随者提供服务
领导者绕过Raft日志并在本地处理只读查询
追随者要求领导在处理只读查询以前得到安全的读取索引
这种方法依赖于筏组中全部机器的时钟
这个raft执行还包括一些可选的加强功能:
乐观流水线减小日志复制延迟
日志复制的流量控制
批处理Raft消息以减小同步的网络I / O调用
批处理日志条目以减小磁盘同步I / O
并行写入领导者的磁盘
内部提案从追随者到领导者重定向
领导失去法定人数时自动减小网络
Notable Users
cockroachdb一个可扩展,可生存,高度一致的SQL数据库
dgraph可扩展,分布式,低延迟,高吞吐量图形数据库
etcd一个分布式可靠的键值存储
tikv由Rust和Raft提供支持的分布式事务密钥值数据库
swarmkit用于编排任何规模的分布式系统的工具包。
链核心软件,用于运营许可的多资产区块链网络分布式
Usage
raft中的主要对象是一个节点。 使用raft.StartNode从头开始一个节点,或使用raft.RestartNode从某个初始状态启动一个节点。工具
启动一个三节点群集性能