跳至主要内容

理解 Raft 分布式共识算法

0x00 简介

最近两年工作中对区块链技术接触较多,接下来可能要告一段落了。期间对 go-ethereum 进行过联盟链改造,使用 Raft 共识算法把以太坊的 TPS 提升到了 1K+。这里总结一下 Raft 算法,既是对自己经历对一种记录,也算是对他人对帮助。
Raft 算法是一个非常好理解(相比 Paxos 算法来说),也是一个非常受欢迎的共识算法,比如常用的服务发现、共享配置以及一致性保障的 etcd 和 Counsul 都使用了 Raft 算法来保证一致性。

0x01 什么是分布式共识算法

在分布式计算领域中有一个非常有名的 CAP 定理:一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)这三项中的两项。
一致性是指节点数据的一致,即所有节点在同一时间的数据完全一致。如果细分的话,一致性又可以分为强一致、弱一致和最终一致。比如我们经常使用的多副本关系型数据库满足的是强一致性,又因为要同时满足高可用,那么就弱化了分区容忍性(可以使用简单的网络拓扑来减少分区出错的可能);公有的比特币、以太坊网络是属于最终一致,因为它们必须优先满足可用性和分区容忍性。
分布式网络中所有节点要想达成一致,就需要一个算法来促成这个一致,这个算法就是共识算法。我们常听说的 挖矿、PoS、DPoS、PBFT、Raft 都属于解决一致性的算法。

0x02 理解 Raft

Raft 中,节点通过心跳消息来保持通信,一个节点只会处于以下三种状态中的一种:
  • Follower(跟从者)
  • Candidate(候选人)
  • Leader(领导者)
最开始时,所有的节点都是 follower,如果 follower 收不到 leader 的心跳消息,那么 follower 会变为 candidate,并向其他节点发起投票,如果该 candidate 节点收到了半数以上的选票(包括投给自己的一票),那么它就当选为新的 leader。这个过程被称为 leader 选举的过程。
接下来,leader 节点将带领所有节点对分布式网络中对数据更改达成一致,这个过程被称为日志同步。
日志同步的过程如下:
  1. Leader 收到客户端到数据提交请求,leader 把请求作为一个条目(entry)加入到它到日志中,这个时候它不会立刻更新数据;
  2. Leader 向所有的 followers 节点发送这个条目,这个发送的过程被称为 Append Entries;
  3. Followers 节点收到 leader 的 Append Entries 请求后,向 leader 回复条目响应;
  4. Leader 节点收集了半数以上的条目响应后,向客户端响应条目已确认,这时它才会更新自身节点的数据,同时向所有 fwllowers 节点发送条目确认的消息;

0x03 特殊情况

Leader 选举过程中,如果没有收到半数以上的选票,该怎么办?
Raft 中,有两种超时机制:选举超时和心跳超时。
每个 follower 会随机生成一个选举超时时间。任意节点当自身的选举超时时间结束后还没有收到 leader 的消息,那么它就重置这轮选举,变为 candidate 向其他节点发起新一轮投票。这样,最终总会选举出一个 leader 节点来。
正常运行过程中,如果 leader 节点挂掉,会出现什么情况?
这种情况下,会用到心跳超时机制。当 followers 在心跳超时后仍旧没有收到 leader 节点的心跳消息,那么 followers 节点就会发起新一轮投票,直到选举出新的 leader 来。
网络分区的情况下会发生什么?
网络故障导致导致节点被分隔到多个不连通的区域,在被隔离的区域中又会触发新的 leader 选举,对于隔离区域中包含半数以上的节点,选举就可能成功。当网络恢复后,followers 接受最大任期(term)和最新日志的 leader。这个思路蕾丝比特币、以太坊网络分叉后以最长区块为准的解决方案,确保了最终一致性。

0x04 Raft 参考资料

​

评论

此博客中的热门博文

终端折腾记

最新更新时间 2019-06-20 Oh-My-Zsh 安装 前提是需要安装 zsh git curl : sudo apt install zsh curl git sh -c " $(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh) " 比较推荐的插件如下,需要修改 ~/.zshrc 配置文件: plugins=( git z extract zsh-autosuggestions # 需要自己安装 zsh-syntax-highlighting # 需要自己安装 ) 为 oh-my-zsh 安装 zsh-autosuggestions: git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM /plugins/zsh-autosuggestions 为 oh-my-zsh 安装 zsh-syntax-highlighting: git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom} /plugins/zsh-syntax-highlighting Oh-My-Zsh 的主题 我更偏爱 powerlevel9k 主题,可以定制的地方很多 https://github.com/bhilburn/powerlevel9k 但是, powerlevel9k 主题对字体的配置比较麻烦,如果使用这个主题,一定要配置好下面提到的 必需的字体 。 主题安装 https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions#step-1-install-powerlevel9k 为 Oh-My-ZSH 安装主题: git clone https://github.com/bhilburn/powerlevel9k.git ~...

网盘端到端加密 Cryptomator

1. Crytomator 是什么 Cryptomator 是一款开源的文件加密工具,它支持在本地硬盘上创建多个加密仓库,这些加密仓库以文件卷(硬盘卷)的形式挂载到系统目录中,存放到文件卷中的文件都会自动加密。 如果把加密仓库的目录放到网盘的同步目录下,配合如 iCloud、Dropbox、OneDrive、坚果云 等云盘使用,就能达到端到端加密同步的效果。 2. 同类工具对比 同类的文件加密工具除 Cryptomator 之外,还有 gocryptfs、encfs 等。其中 Cryptomator 使用 Java 开发,而且提供了 macOS、Windows、Linux、iOS 和 Android 上个 GUI 版本,从易用性上来说体验最佳。 gocryptfs v1.7 encfs v1.9.5 ecryptfs v4.19.0 cryptomator v1.4.6 securefs v0.8.3 CryFS v0.10.0 First release 2015 ( ref ) 2003 ( ref ) 2006 ( ref ) 2014 ( ref ) 2015 ( ref ) 2015 ( ref ) Language Go C++ C Java C++ C++ License MIT ( ref ) LGPLv3 / GPLv3 ( ref ) GPLv2 GPLv3 ( ref ) MIT ( ref ) LGPLv3 ( ref ) Development hotspot Austria USA USA (RedHat) Germany China Germany Lifecycle Active Maintenance Active ( ref ) Active Active Active File interface FUSE FUSE In-kernel filesystem FUSE/WebDAV FUSE FUSE Platforms Linux, macOS, 3rd-party Windows port,3rd-party Android port Linux, macOS, 3rd-par...

VMware Workstation 10安装Mac OS X Mountain Lion 10.8.5

关于原版OS X Mountain Lion 10.8.5 Mac OS X Mountain Lion 10.8.5作为Mountain Lion的最后一个稳定版本值得我们收藏。可能大家有所不知,10.8.5版本是分为两个Build的,一个是在2013年9月13日发布的 10.8.5 Build 12F37 ,另一个是2013年10月3日发布的 10.8.5 Build 12F45 。也就是说, 10.8.5 Build 12F45 才是Mountain Lion的最终版本。 OS X Mountain Lion的维基百科 不幸的是,网友们和论坛中分享的 OS X Mountain Lion 10.8.5 正式版 原版完整DMG安装镜像 大多数是Build 12F37版本(从发帖日期就可以看出来),网上搜索到的种子文件也是Build 12F37的种子。要想下载原版Build 12F45,可以搜索 OSX1085-12F45-ESD.dmg ,或者从这里下载: http://pan.baidu.com/s/1f68Vv 怎么知道下载了哪个版本? 通过文件的MD5等校验值来辨别。使用软件: Hash 或者 HashTab 。 OS X Mountain Lion 10.8.5 Build 12F37.dmg 信息如下: 大小: 4469250353 字节 MD5: 5568B4DDE00A64F765EF00858B538078 SHA1: ECF68C2119C71825839D2A58E0D619E9CCF7C026 CRC32: F4DFCE4D 从中提取出的InstallESD.dmg: MD5: 2C77151BE45C820B02A9ACE05434693D SHA1: 2919B519142E2119197BFFD678F15F603E84970F CRC32: A9DCAE18 OSX1085-12F45-ESD.dmg 信息如下: 大小: 4448808132 字节 MD5: 3FCEBFC81D00767D1ACEF1CB166F88CC SHA1: 98E52D0FC443940265780539A311833EE5814DDD CRC32: C82F14C1 从中提取出的InstallESD.dmg: 大小: 443...