Raft系列文章之一: 什么是Raft?

简单的说,Raft是一种易于理解的一致性算法,其功能至关于Paxos。目前不少提供一致性服务的系统都采用Paxos, 例如Chubby, ZooKeeper, 那么为什么还须要Raft?自Lamport 1998年提出Paxos以来, 该协议虽逐渐成为主流一致性协议,但也以难以理解而著名,实现起来比较困难。针对Raft难以理解的缺陷,Raft 设计的主要目的之一就是容易理解,Raft将整个算法过程分解为若干个独立的子过程,而且详细描述了每一个子过程如何实现,容易理解和实现。我本身也用Java实现了Raft,  代码在 https://github.com/chicm/CmRaft , 本系列文章的最后我将介绍个人实现。git

本文主要参考了In Search of an Understandable Consensus Algorithm (Extended Version),也包含了我本身的理解。github

那么什么是一致性算法?

一致性是分布式容错系统的基本功能,例如在分布式共享文件系统中,一般有多台服务器向客户提供文件服务,当客户经过其中一台服务器A向文件系统存储 了一个文件,如何保证能从服务器B获取刚刚保存的文件?其核心问题在于多台机器就某个值达成一致,一旦某个值达成了一致,客户向整个集群的任何一台机器请 求该值时都会获得同一个值。通常一致性算法要求系统中大多数服务器处于可用状态,才可能就某个值达成一致。例如5台机器的集群,至少须要3台机器是可用的 才可能就某个值达成一致,这一点经过反证法很容易理解,假设某个值经过集群的一半或一半一下服务器能达成一致,那么另一半服务器也可能达成另外一个一致, 若是两个一致不一样的话,就不是一致的。分布式系统的容错通常经过多副本状态机来实现。算法

多副本状态机

一致性算法一般产生于多副本状态机情景中,多副本状态机即集群中每一个服务器维护一个状态机,它们维护同一数据状态的相同副本,当集群中一个或多个节 点当掉时,整个集群仍然可以正常运行。多副本状态机用于解决分布式系统中的容错问题,例如在使用GFS, HBase的大型系统中,集群的Leader节点管理全系统配置信息,这些信息在Master 当掉时必须可以恢复, 这些系统一般使用多副本状态机来管理Leader选举和配置信息存储。Chubby和ZooKeeper都是多副本状态机。GFS使用Chubby, 而HBase使用ZooKeeper。服务器

多副本状态机通常采用多分布日志来实现,上图是一个多副本状态机的例子。在上图中,服务器中存储的日志是命令的执行序列,状态机依次执行这些命令, 每台服务器的状态机按相同顺序执行相同命令,所以每台状态机的输出状态也是同样的。这样说有点抽象,咱们按上图中的例子来讲明一下,例若有一个用来存储键 值对的多副本状态机, 每台服务按相同顺序存储了以下命令:分布式

1. 设置x=3模块化

2. 设置y=1性能

3. 设置y=9spa

在多副本状态机每一个副本上,状态机的状态为:x=3, y=9设计

一致性算法主要目标就是用来确保日志在多个副本上的一致性,例如在上例中,若是系统中有的状态机获得的日志顺序是1,2,3,有的是1,3,2,则就是出现了不一致的状况,一致性算法固然要避免出现这样的状况。日志

一致性算法通常具有以下特性:

正确性:任何条件下都能保证正确性,永远不向用户提供一个错误的结果

可用性: 只要多数节点可用,并能相互通讯,系统就是可用的,5个节点的集群,只要有任何3个节点工做正常,整个系统就能正常使用。

不依赖时钟:即便有的节点时间设置是错误的,也能正常工做。

少数缓慢节点不影响全系统性能:只要大多数节点能及时响应,系统不会由于少数节点响应缓慢而性能低下。

Raft特性

Raft是专门针对Paxos难以理解的缺陷而从新设计的新算法,为使算法容易理解,采用了模块化设计方法,将整个过程划分为若干子过程,包括Leader选举,日志分发,确保一致性。Raft和已有的一致性算法有不少类似之处,但也有本身独特的特性:

Strong Leader: 相对其余一致性算法,Raft的Leader做用更强,例如,全部日志都是经过Leader分发给其余服务器,只有Leader接受客户请求。这一特性简化了日志管理,也让算法容易理解。

Leader选举:Leader选举过程采用随机时间计时器,这一看起来小小的改进简单有效快速地解决了Leader选举过程当中的冲突。

成员变化:当集群的成员发生变化,例如增长或减小服务器时,Raft采用新的联合一致性方法来进行处理,能够保证成员变化过程当中系统正常工做。

后面的系列文章中我会详细描述Raft原理及全部这些特性。

Raft算法因为其易于理解,在实现时就更容易把系统实现得更加健壮,所以是比Paxos及其余一致性算法更为优秀的算法。目前Raft已经有不少各类语言的实现,包括博主本身的基于Java的实现。

 

文章:http://thesecretlivesofdata.com/raft/

相关文章
相关标签/搜索