etcd raft library
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的更多相关文章
- etcd raft library设计原理和使用
早在2013年11月份,在raft论文还只能在网上下载到草稿版时,我曾经写过一篇blog对其进行简要分析.4年过去了,各种raft协议的讲解铺天盖地,raft也确实得到了广泛的应用.其中最知名的应用莫 ...
- etcd raft如何实现成员变更
成员变更在一致性协议里稍复杂一些,由于不同的成员不可能在同一时刻从旧成员组切换至新成员组,所以可能出现两个不相交的majority,从而导致同一个term出现两个leader,进而导致同一个index ...
- etcd raft如何实现leadership transfer
leadership transfer可以把raft group中的leader身份转给其中一个follower.这个功能可以用来做负载均衡,比如可以把leader放在性能更好的机器或者离客户端更近的 ...
- 彻底搞懂etcd raft选举、数据同步
etcd raft选举机制 etcd 是一个分布式的k/V存储系统.核心使用了RAFT分布式一致性协议.一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服 ...
- etcd raft 处理流程图系列1-raftexample
最近在看raft相关的代码和实现,发现etcd的raft模块在实现上还是比较灵活的,但缺点就是需要用户实现比较多的功能,如存储和网络等,同时带来的优点就是不会对用户的存储和传输作限制.网上对该模块的描 ...
- etcd raft如何实现Linearizable Read
Linearizable Read通俗来讲,就是读请求需要读到最新的已经commit的数据,不会读到老数据. 对于使用raft协议来保证多副本强一致的系统中,读写请求都可以通过走一次raft协议来满足 ...
- etcd raft 处理流程图系列3-wal的存储和运行
存储和节点的创建 raftexample中的存储其实有两种,一个是通过raft.NewMemoryStorage()进行创建的raft.raftStorage,关联到单个raft节点,另一个是通过ne ...
- etcd raft 处理流程图系列2-transport
本章给出了raftexample中使用的传输层代码,补全了上一节中传输层与raft节点(raft server和channel server)的交互细节.下图中流程的核心在于传输层中的streamRt ...
- etcd raft 处理流程图系列2-wal的读写
本文仅介绍wal的基本处理,如create.open.close.read等操作.鉴于篇幅原因,下面介绍replayWAL(启动raft节点时执行)函数涉及的读文件操作:从wal目录中加载snapsh ...
随机推荐
- flask第十一篇——自定义url转换器
首先和大家说一下flask的组成,flask其实是werkzeug(路由和http处理)+SQLAlchemy(数据库)+Jinja2(模板)组成的,今天我们要看到的东西就是`werkzeug`里面的 ...
- BZOJ4565 [Haoi2016]字符合并
题意 有一个长度为\(n\)的\(01\)串,你可以每次将相邻的\(k\)个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这\(k\)个字符确定.你需要求出你能获得的最大分数. \(n ...
- 在MEF中实现延迟加载部件(转)
在MEF的宿主中,当我们通过Import声明导入的对象时,组装(Compose)的时候会创建该对象.例如: interface ILogger { void Log(string ...
- iptables规则绑定在port而不是拦截在协议栈
版权声明:本文为博主原创,无版权.未经博主同意能够任意转载,无需注明出处,任意改动或保持可作为原创! https://blog.csdn.net/dog250/article/details/2417 ...
- OpenStack_Swift源代码分析——Ring的rebalance算法源代码具体分析
1 Command类中的rebalnace方法 在上篇文章中解说了,创建Ring已经为Ring加入设备.在加入设备后须要对Ring进行平衡,平衡 swift-ring-builder object.b ...
- [转]使用tcpdump抓取HTTP包
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 0x4745 为"GET"前两个字母"G ...
- 军哥LNMP优化
http://bbs.vpser.net/thread-8914-1-1.html http://www.zxsdw.com/index.php/archives/881/ 修改/usr/local/ ...
- IMAP简单研究
IMAP的相关详细介绍: http://www.imapwiki.org/ClientImplementationhttp://tools.ietf.org/html/rfc3501 1.连接服务器 ...
- Snippet取表字段说明和详细信息
IF OBJECT_ID (N'dbo.GetDetails', N'IF') IS NOT NULL DROP FUNCTION dbo.GetDetails; GO create function ...
- ubuntu 进入单用户模式
进入单用户模式: 按shift进入 1.开机到grub时,用上下键移到第二行的恢复模式,按e(注意不是回车) 即Ubuntu,With Linux 3.2.0-23-generic(recovery ...