raft, Raft协议的Golang实现

分享于 

6分钟阅读

GitHub

  繁體 雙語
Golang implementation of the Raft consensus protocol
  • 源代码名称:raft
  • 源代码网址:http://www.github.com/hashicorp/raft
  • raft源代码文档
  • raft源代码下载
  • Git URL:
    git://www.github.com/hashicorp/raft.git
    Git Clone代码到本地:
    git clone http://www.github.com/hashicorp/raft
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/hashicorp/raft
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    raft Build Status

    raft是管理复制日志并可以与FSM一起管理复制状态机的转到库。 它是一个提供一致性协议的库。

    当复制状态机是许多分布式系统的关键组件时,这种库的使用情况非常接近。 它们支持构建一致。分区容错的( CP ) 系统,同时具有有限的容错能力。

    建筑

    如果你想构建 raft,你将需要安装 1.2 + 版。

    请检查你的安装:

     
    go version
    
    
    
     

    文档

    有关完整文档,请参见关联 Godoc

    To cgo的主后端 MDBStore 位于一个称为 raft的独立存储库中,从而避免了cgo的麻烦。 这是 LogStoreStableStore的推荐实现。

    使用 BoltDB的纯转后端也可以使用 raft BoltDB。 它也可以用作 LogStoreStableStore

    标记的发行版

    就 2017年09月 而言,Hashicorp将开始使用这个库的标签来明确表示主要版本更新。 我们建议你在这里库上提供你的应用程序依赖关系。

    • v0.1.0是最初的稳定版本的库,并且已经保持不变的API更改。 这是在版本 0.7.0之前由领事使用的。

    • v1.0.0接受在library-v2-stage-one分支中执行的更改。 这里版本使用UUID管理服务器标识,因此引入一些中断API更改。 它同时版本化,并且需要一些特殊步骤,当与运行较旧版本的( 有关版本兼容性,请参阅 config.go 中的详细注释) 服务器进行交互时。 你可以参考 https://github.com/hashicorp/consul/pull/2222,了解向这些新接口发送领事请求所需的内容。

      这个版本包括一些新特性,包括非投票服务器。传输层中的新地址提供者抽象和更多的弹性快照。

    协议

    raft是基于 : 在搜索一个可以理解的一致算法

    以下介绍Raft协议的高级概述,但有关详细信息,请阅读完整的Raft纸张以及Raft源 source。 关于raft协议的任何问题都应该发送到 raft开发邮件列表。

    协议描述

    Raft节点始终处于以下三种状态之一: 追随者。候选者或者领导者。所有节点最初作为追随者开始。 在这种状态下,节点可以接受来自领导者的日志条目,并。 如果某个时间没有收到任何条目,节点将自动提升到候选状态。 在候选状态节点中,从他们的节点请求投票。 如果一个候选人获得了投票的仲裁,那么它将被提升为领导者。 领导者必须接受新的日志条目并复制到所有其他的追随者。 此外,如果不接受陈旧读取,则还必须在主机上执行所有查询。

    一旦集群有了领导者,它就可以接受新的日志条目。 客户机可以请求引线附加一个新的日志条目,这是一个不透明的二进制 blob。 领导者然后将条目写入持久存储,并尝试复制到追随者的仲裁。 一旦日志条目被视为 committed,就可以将它应用于有限状态机。 有限状态机是应用特定的,并使用接口实现。

    一个明显的问题与复制日志的无限性质有关。 Raft提供了一个机制,通过该机制,当前状态被快照,并且日志被压缩。 由于有限状态机抽象,还原状态机状态必须与重播旧日志的状态相同。 这允许github在时间点捕获有关状态的状态,然后移除所有用于达到该状态的日志。 在没有用户干预的情况下自动执行这里操作,并防止无界磁盘使用情况以及在重播日志时。

    最后,当新服务器加入或者现有服务器离开时,更新对等集的问题。 只要一个节点的仲裁可以用,这不是一个问题,提供动态更新对等集的机制。 如果节点的仲裁不可用,那么这将成为一个非常有挑战性的问题。 例如假设只有 2个对等点,A 和B。 仲裁大小也是 2,这意味着两个节点必须同意提交日志条目。 如果一个或者B 失败,现在就无法到达仲裁。 这意味着群集无法添加或者删除 node,或者提交任何其他日志条目。 这将导致不可用。 这里时,需要手动干预,以便移除A 或者B,并在 Bootstrap 模式中重新启动它的余的node。

    一个Raft节点可以容忍单个 node 故障,而一个 5的集群可以容忍 2个故障。 建议的配置是运行 3或者 5 raft服务器。 这样可以最大化可用性而不会极大地牺牲性能。

    在性能方面,Raft与Paxos相当。 假设稳定领导,提交日志条目需要一次到一半集群的往返。 因此,性能受磁盘 I/O 和网络延迟的限制。


    相关文章