当前位置: 首页 > news >正文

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

启动一个三节点群集

 

转载于:https://www.cnblogs.com/mhc-fly/p/8390531.html

相关文章:

  • jQuery数组去重复
  • Nginx 配置文件重写
  • python------并发编程
  • freebsd安装python2
  • js为什么是单线程的?10分钟了解js引擎的执行机制
  • 鸟哥的linux私房菜学习-(十)vim程序编辑器
  • Linux上vi编辑文件非正常退出后文件恢复
  • 常用网络技术
  • javascript脚本混淆
  • gf框架之grpool - 高性能的goroutine池
  • 谷歌浏览器如何调试JS
  • CocosCreator引擎修改与定制
  • 新年的展望,2018 hello world~
  • Collection---CopyOnWrite(应用于大量度 而少量写的场景)
  • 模块使用
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 2019年如何成为全栈工程师?
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • android图片蒙层
  • Android系统模拟器绘制实现概述
  • C++入门教程(10):for 语句
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • es6(二):字符串的扩展
  • Java面向对象及其三大特征
  • JS实现简单的MVC模式开发小游戏
  • Linux各目录及每个目录的详细介绍
  • php中curl和soap方式请求服务超时问题
  • Quartz初级教程
  • Vim Clutch | 面向脚踏板编程……
  • Vue UI框架库开发介绍
  • 不上全站https的网站你们就等着被恶心死吧
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 分布式任务队列Celery
  • 服务器从安装到部署全过程(二)
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 在Mac OS X上安装 Ruby运行环境
  • 在weex里面使用chart图表
  • 责任链模式的两种实现
  • ​水经微图Web1.5.0版即将上线
  • #{}和${}的区别是什么 -- java面试
  • #if #elif #endif
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #数学建模# 线性规划问题的Matlab求解
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (145)光线追踪距离场柔和阴影
  • (4)Elastix图像配准:3D图像
  • (ibm)Java 语言的 XPath API
  • (javascript)再说document.body.scrollTop的使用问题
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (九十四)函数和二维数组