https://github.com/coreos/etcd/tree/master/raft

import "github.com/coreos/etcd/raft"

---------------------------------------------------------------------------

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从某个初始状态启动一个节点。

启动一个三节点群集