跳至主要内容

理解 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 参考资料

评论

此博客中的热门博文

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...

为Github的Hexo博客启用SSL/TLS

CloudFlare的免费套餐提供了SSL,可以用它为我们独立域名的博客启用HTTPS。本文以 http://g2ex.me 为例。 主要步骤 注册CloudFlare,添加个人网站,获取CLoudFlare提供的 Nameservers ; 修改自己的域名提供商,把 站点的Nameservers 修改为 CloudFlare提供的Nameservers ; 等待CloudFlare添加的网站为激活状态,使用 https 打开个人网站; 修改网站模版,使 http 跳转到 https 。 详细步骤 一、注册CloudFlare 首先注册CloudFlare,注册后按照提示 Add Websites ,输入域名后点击 Begin Scan : 到达最后一步,会提示把自己网站的域名 Name Server 更换为: charles.ns.cloudflare.com ivy.ns.cloudflare.com 二、修改域名提供商的Nameservers 本站使用了Godaddy域名提供商,登录Godaddy,在域名的 SETTINGS 中,点击 Nameservers 下的 Manage : 勾选 Custom 并点击 ADD NAMESERVER ,添加上边CloudFlare给的两个Name Servers。 三、等待CloudFlare确认 稍等片刻(几分钟到十几分钟),在CloudFlare中点击 Recheck Nameservers ,可以看到网站已经处于激活状态了。 之后,便可以用 https://g2ex.me 访问站点了。 四、强制跳转 至此,必须手动输入 https 前缀才能访问加密的站点,要想在任何情况下都以加密方式访问网站,可以在网站模版的头中加入 http 到 https 的强制跳转。 以当前Hexo的 NexT主题 为例,打开 layout 目录下的 _layout.swig ,在 <head> 标签中加入以下代码,注意把 yoursite.com 替换为你的域名,这里为 g2ex.me 。 < script type = "text/javascri...

VMware9 安装Mac OS X 10.8

VMware Workstation 9.0.0下安装Mac OS X 10.8的经验总结: 1. 首先检查CPU是否支持虚拟化,使用到的软件是securable; 2. 安装完VMware后,需要给它装一个补丁,补丁是unlock-all-v110\windows\install.cmd,Win7下需要右键使用管理员身份运行; 3. 创建Mac OS X 虚拟机时,磁盘类型选择SCSI,使用单个文件存储虚拟磁盘,在CD/DVD设备的高级设置里,选择SCSI,SCSI 0:1; 4. 安装完Mac OS X,需要安装VMware Tool。如果你的VMware是完整版,那么去VMware的安装目录下找darwin.iso,在VMware里加载到Mac OS X 的CD/DVD中,否则只能去网上下载darwin.iso,但是网上下载的不能保证适用在VMware9上,可能会出现“darwin.iso无法识别”的错误; 5. 安装完VMware Tool千万不要重启,否则重启后容易花屏,这时安装VMware VGA Display驱动:VMsvga2_v1.2.4_OS_10.6-8.pkg,然后重启即可。 完整的图文安装过程: http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1130227