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 ...
随机推荐
- sqlopsstudio 微软开源跨平台sql server 连接工具
sqlopsstudio 微软开源的sql server 连接工具,跨平台,基于vscode 分之代码. 项目地址: https://github.com/Microsoft/sqlopsstudi ...
- FastAdmin 的 API 可以分级吗?
FastAdmin 的 API 可以分级吗? 有小伙伴问 FastAdmin 的API 可以分别吗,使用 / 出现错误. Karson 的说明是: 完全支持的,默认是使用.进行分隔的,如果需要/,请开 ...
- Hadoop 2.7.4 关闭与启动
环境说明:[root@hadp-master sbin]# hadoop versionHadoop 2.7.4 一. 脚本封装全部一起启动.关闭1.1 启动[root@hadp-master sbi ...
- 什么是Spark(三)数据的加载和保存
Spark内置了一些常见的文件格式的处理,包括text/json,csv,sequence等:Spark对于文件处理保持了开放性,还提供了可以通过InputFormat,OutputFormat来进行 ...
- 研究ecmall一些流程、结构笔记 (转)
index.phpECMall::startup() //ecmall.php object //所有类的基础类 ecmall.phpBaseApp //控制器基础类 app.base.phpECBa ...
- flask之bootstrap4
pip install bootstrap-flask from flask_bootstrap import Bootstrap from flask import Flask bootstra ...
- 带ssl的websocket例子
还是在那个websocket_demo的例子 rebar-creator create-app websocket_demo tree一下看看大概目录 ├── cert │ ├── cowboy- ...
- xss 攻击 sql 注入
XSS测试 "/><script>alert(document.cookie)</script><!-- <script>alert(docu ...
- 阻塞队列之二:LinkedTransferQueue
一.LinkedTransferQueue简介 TransferQueue是一个继承了BlockingQueue的接口,并且增加若干新的方法.LinkedTransferQueue是TransferQ ...
- SQL Server、Oracle和MySQL判断NULL的方法
SQL Server.Oracle和MySQL判断NULL的方法 本文讲述SQL Server.Oracle.MySQL查出值为NULL的替换. 在SQL Server Oracle MySQL当数据 ...