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

启动一个三节点群集

etcd raft library的更多相关文章

  1. etcd raft library设计原理和使用

    早在2013年11月份,在raft论文还只能在网上下载到草稿版时,我曾经写过一篇blog对其进行简要分析.4年过去了,各种raft协议的讲解铺天盖地,raft也确实得到了广泛的应用.其中最知名的应用莫 ...

  2. etcd raft如何实现成员变更

    成员变更在一致性协议里稍复杂一些,由于不同的成员不可能在同一时刻从旧成员组切换至新成员组,所以可能出现两个不相交的majority,从而导致同一个term出现两个leader,进而导致同一个index ...

  3. etcd raft如何实现leadership transfer

    leadership transfer可以把raft group中的leader身份转给其中一个follower.这个功能可以用来做负载均衡,比如可以把leader放在性能更好的机器或者离客户端更近的 ...

  4. 彻底搞懂etcd raft选举、数据同步

    etcd raft选举机制 etcd 是一个分布式的k/V存储系统.核心使用了RAFT分布式一致性协议.一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服 ...

  5. etcd raft 处理流程图系列1-raftexample

    最近在看raft相关的代码和实现,发现etcd的raft模块在实现上还是比较灵活的,但缺点就是需要用户实现比较多的功能,如存储和网络等,同时带来的优点就是不会对用户的存储和传输作限制.网上对该模块的描 ...

  6. etcd raft如何实现Linearizable Read

    Linearizable Read通俗来讲,就是读请求需要读到最新的已经commit的数据,不会读到老数据. 对于使用raft协议来保证多副本强一致的系统中,读写请求都可以通过走一次raft协议来满足 ...

  7. etcd raft 处理流程图系列3-wal的存储和运行

    存储和节点的创建 raftexample中的存储其实有两种,一个是通过raft.NewMemoryStorage()进行创建的raft.raftStorage,关联到单个raft节点,另一个是通过ne ...

  8. etcd raft 处理流程图系列2-transport

    本章给出了raftexample中使用的传输层代码,补全了上一节中传输层与raft节点(raft server和channel server)的交互细节.下图中流程的核心在于传输层中的streamRt ...

  9. etcd raft 处理流程图系列2-wal的读写

    本文仅介绍wal的基本处理,如create.open.close.read等操作.鉴于篇幅原因,下面介绍replayWAL(启动raft节点时执行)函数涉及的读文件操作:从wal目录中加载snapsh ...

随机推荐

  1. PHP---如何修改域名的指定的根目录

    如何修改域名的指定的根目录 环境:linux 使用工具:xShell 修改域名指定的文件根目录需要修改nginx的配置文件 第一步:连接xShell 第二步:进入根路径找到nginx的配置文件 cd ...

  2. oracle 之 控制oracle RAC 进行并行运算

    RAC的一大优点就是可以跨节点进行并行计算,那么如何控制并行运算?这就是这篇文章要讨论的内容. 10 g 中: 合理设置跨节点并行,需要先设置一些参数:instance_groups:这个参数主要是设 ...

  3. filter添加水印

    1filter写法 先定义自己的responseWrapper chain.doFilter(request,responseWrapper); responseWrapper来输出 package ...

  4. 将SQLite移植到ARM板上 (转)

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它, 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够 ...

  5. (转)JavaMail邮件发送-发送一个文本邮件和一些问题说明

    需要下载的JAR包: JavaMail:http://www.oracle.com/technetwork/java/javamail/index.html JAF:http://www.oracle ...

  6. RK3288 通过指令查看当前显示内容(framebuffer)

    $ adb shell root@xxx:/ # cd /dev/graphics cd /dev/graphics root@xxx:/dev/graphics # ls ls fb0 fb1 fb ...

  7. NanoPiM1开箱测试

    等了快一周了,终于那M1与那外壳一起给我寄过来了. 上午收到,开箱图就不亮了,来一上好电的图! 一同购买来的MSD卡里什么也没有,上电测试时只看到绿色的灯微微亮(这是一个BUG吗!!!!哈哈). 所以 ...

  8. Windows Restart Manager 重启管理器

    Restart Manager(以下简称RM)可以减少或避免安装或更新程序所需要的系统重启次数.安装(或更新)过程中需要重启的主要原因是需要更新的某些文件当前正被一些其它程序或服务所使用.RM允许除关 ...

  9. java代码---------再练习ChatAt()的用法

    总结: 没有理解方法的含义.瞎用 package com.mmm; //实现字符串中某个字符出现的次数 public class Mo { public static void main(String ...

  10. 仅用CSS3创建h5预加载旋转圈

    <head> <meta charset="UTF-8"> <title></title> <style type=" ...