Raft探索历程--Part1

前言

Raft是一个保证分布式系统数据一致性的共识算法,诞生的目的就是为了探索一种更容易理解的共识算法,原因是上一个描述这个算法的协议--Paxos较难理解和在生产环境上使用。(注:笔者没有掌握Paxos算法,所以这里不会去作比较,后续如果学习到的话会做一个比较)

笔者主要是通过阅读Raft论文和观看MIT 6.824的教程视频学习的。

论文原文是英文版的,里面的一些专用名词笔者打算尽量保留英文的描述,因为这些关键名词对于理解概念十分重要,但是翻译过来会比较拗口,也找不到合适的中文名词代替,所以打算保留英文的描述,当然,名词的含义还是有必要先解释一下。

英文名词备注

Consensus algorithms:共识算法,用来保证分布式系统一致性的方法。Consensus algorithm

leader:节点集群中的领导者,决策者,负责复制和提交客户端的日志。

term:任期,领导者的当任时间。

candidate:准备参与leader选举的候选机器

follower:追随者,选举结束后,没有成为leader的candidate就是跟随者,接收leader的指令

majority:大多数投票机制,指集群中大多数机器同意某个节点成为leader,这里的大多数机器不只是指正在运行的服务器,即使机器投票后挂了也是majority中的一部分

Raft简介

在MIT 6.824课程视频中,在正式讨论Raft之前讨论了Map Reduce、GFS、VMWare FT,而这些现存容错系统的处理方式如下:

  • MapReduce系统,只是复制计算,但是依赖单master

  • GFS,复制副本数据,依赖master另外选主

  • VMware FT复制服务依赖test-and-set选择master

单点master可以避免“脑裂”,但是master始终是单点,无法实现分布式存储。

脑裂,是指一个集群中出现了网络异常的情况导致有两个节点各自都认为它们都是主节点,于是一个集群被拆分为两个集群,解决脑裂问题的方式就是添加majority机制,而Paxos和Raft就是这类解决方案中的其中两种。

由于Paxos的晦涩难懂导致难以理解以及实现起来的难度,经过不断的挣扎,学者们就发明了Raft。Raft的目标是为了设计一种更易于理解的共识算法。

为了让共识算法更容易理解,Raft将共识算法中的核心内容拆分开来实现:leader选举,日志复制,安全性,以及通过实施一个更强级别的一致减少需要考虑的状态数量。

Raft跟现存的共识算法很相似,但是它有新增一些独特的特性:

  • Strong Leader,比如日志只能由首领发送到其他的服务器

  • Leader Election,Raft使用随机定时器进行选举,解决冲突时更简单快捷

  • Membership changes,使用共同共识的方法来处理集群内成员变换的问题,这种方法处理时,处于调整过程中的两种不同配置的集群中的大多数机器会重叠。这样一来,集群在成员变换阶段依然能继续运行。

复制状态机

Replicated state machine,状态复制机,共识算法是在复制状态机的背景下诞生的,复制状态机用于来解决分布式系统的各种容错问题。

如图,复制状态机实现方式是使用复制日志,每份日志都使用相同顺序来保存相同的指令,服务器执行时是按照日志的顺序来执行,最终得到的结果都是一致的。

共识算法在复制状态机的工作就是保证所有的复制日志都是一致的。共识实现模块(如Raft)接收来自客户端的请求后,添加到机器的日志里,使用共识模块进行通信,保证所有日志最终都包含相同顺序的请求。看到这里想起了MySQL的主从复制原理,有点类似复制状态机的实现方式。

共识算法在实际应用中的特性:

  • 安全性保证,绝不返回一个错误的结果,在错误情况下都能保证正确

  • 可用性,集群中只要有大多数的机器可运行且能够相互通信,就可以保证可用。

  • 不依赖时序保证一致性

  • 通常情况下,一条指令能在集群中大多数节点响应一次远程过程调用时完成。少部分较慢的节点不会影响系统整体的性能。

Paxos

Paxos定义了一个能够达成单一决策共识的协议,比如单条的复制日志项。主要的两个缺点:

  1. 原理很难理解,完整的解释不够透明。

  2. 没有提供一个较好的基础来构建一个现实中的系统。

注:笔者没有深入学习过Paxo,不能更多的评论,只能从论文和视频的角度做个小总结。

初衷--更容易理解的设计

Raft有很多个设计的目标:

  1. 提供一个完整构建系统的基础

  2. 高效性

  3. 安全性

而Raft最重要的目标,也是最大的挑战,就是让有一个更容易理解的设计。核心目标就是可理解性,必须是容易理解的,即使是普通开发者也能理解。

Raft的学者们意识到要达到Raft的目标非常难,所以使用了问题分解和通过减少状态数量来达到这一目的。

问题分解也是平常开发中用到的一个很重要的技能,如需求拆解、实现细节拆解,把大问题拆解为小问题,然后逐个击破,最后完成目标。

在大多数情况下Raft都试图去消除不确定性,但也有一些情况下增加一些不确定性可以提升系统的可理解性。比如,随机化方法增加了不确定性,但通过使用相似的方法处理所有可能的选择,有利于减少状态空间数量。系统中使用随机化去简化Raft中领导选举算法。

接下来要探索Raft的设计和实现原理,包含了数据结构和函数的定义,leader选举、日志复制、安全性等拆解功能的详细设计。

Raft共识算法

Raft是一种用来管理复制日志的共识算法。

通过选举一个唯一的leader,Raft给予leader完整的责任去管理复制日志来实现共识。leader会接受来自客户端的日志条目,复制这些条目到其他服务器,leader自己就可以决定将日志条目放到哪台服务器,数据流的方向只能从leader到其他服务器。

一个集群里有且只能有一台leader,leader拥有最大的权利。如果某一台leader当机了,会马上选出下一台leader。

如前面提到过的,Raft将整个共识算法拆分为三个独立的子问题:

  1. leader选举:当leader挂了,会选举出新的leader

  2. 日志复制:日志条目只能从leader通知到集群的其他服务器,服务器只会认leader的数据

  3. 安全性:Raft的核心安全性是状态机的安全,Raft通过在选举机制增加一些限制来保证提供的状态数据都是安全的

如图所示是Raft的数据结构和函数的定义:

图里是Raft算法的实现概览,定义了一个集群中维护的状态以及两个方法。方法分别是复制日志条目和请求投票,复制日志条目是在客户端发送给服务端后,由leader复制到其他的follower时调用,可被用做leader的心跳包请求。请求投票时每一个leader的选举时,candidate向其他机器返发起的请求,如果机器被选中为leader,会马上发一个心跳包出去,其他candidate会成为follower,也意味着该次term的选举结束了。

下图列举了Raft算法中的关键特性:

Raft通过以上这些特性来保证集群里leader选举和日志复制的正常运行,同时也保证了运行的安全性。

接下来继续探索Raft的实现:包括leader选举、日志复制、安全性等等,全部写完的话,涉及的篇幅较长,篇幅太长的文章会影响阅读体验,也较难消化,所以笔者打算另外开一篇文章继续。

到这里为止,第一次的探索历程就暂告一个段落了,笔者想留下一个在探索过程中困惑住的问题。

Q1:在leader选举过程中,candidate是怎么决定要投票给发起RequestVote Rpc的机器?是不是接收到请求就要投票?成为leader有没有什么要求?

这个问题,会在下一次探索历程中给出答案。如果你有任何问题,欢迎留言。

参考引用

Raft论文

https://raft.github.io/raft.pdf

MIT6.824课程视频

https://www.bilibili.com/video/BV1R7411t71W?p=7

共识算法

https://en.wikipedia.org/wiki/Consensus_algorithm

脑裂

https://en.wikipedia.org/wiki/Split-brain_(computing)

MySQL的主从复制原理

https://www.hoohack.me/2017/07/11/learning-mysql-replication-detail

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

如果本文对你有帮助,麻烦顺手点个赞吧,谢谢

更多精彩内容,请关注个人公众号。

掌握分布式mapreduceraft算法与分布式数据库MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念Map(映射)和Reduce(归约),是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。MapReduce是面向大数据并行处理的计算模型、框架和平台,它隐含了以下三层含义:1)MapReduce是一个基于集群的高性能并行计算平台(Cluster Infrastructure)。它允许用市场上普通的商用服务器构成一个包含数十、数百至数千个节点的分布和并行计算集群。2)MapReduce是一个并行计算与运行软件框架(Software Framework)。它提供了一个庞大但设计精良的并行计算软件框架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,大大减少了软件开发人员的负担。3)MapReduce是一个并行程序设计模型与方法(Programming Model & Methodology)。它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可理解性,Raft 将一致性算法分解成了几个关键模块,例如leader人选举、日志复制和安全性。同时它通过实施一个更强的一致性来减少需要考虑的状态的数量。从一个用户研究的结果可以证明,对于学生而言,Raft 算法比 Paxos 算法更加容易学习。Raft 算法还包括一个新的机制来允许集群成员的动态改变,它利用重叠的大多数来保证安全性。 一致性算法允许一组机器像一个整体一样工作,即使其中一些机器出现故障也能够继续工作下去。正因为如此,一致性算法在构建可信赖的大规模软件系统中扮演着重要的角色。在过去的 10 年里,Paxos 算法统治着一致性算法这一领域:绝大多数的实现都是基于 Paxos 或者受其影响。同时 Paxos 也成为了教学领域里讲解一致性问题时的示例。 但是不幸的是,尽管有很多工作都在尝试降低它的复杂性,但是 Paxos 算法依然十分难以理解。并且,Paxos 自身的算法结构需要进行大幅的修改才能够应用到实际的系统中。这些都导致了工业界和学术界都对 Paxos 算法感到十分头疼。 和 Paxos 算法进行过努力之后,我们开始寻找一种新的一致性算法,可以为构建实际的系统和教学提供更好的基础。我们的做法是不寻常的,我们的首要目标是可理解性:我们是否可以在实际系统中定义一个一致性算法,并且能够比 Paxos 算法以一种更加容易的方式来学习。此外,我们希望该算法方便系统构建者的直觉的发展。不仅一个算法能够工作很重要,而且能够显而易见的知道为什么能工作也很重要。 Raft 一致性算法就是这些工作的结果。在设计 Raft 算法的时候,我们使用一些特别的技巧来提升它的可理解性,包括算法分解(Raft 主要被分成了leader人选举,日志复制和安全三个模块)和减少状态机的状态(相对于 Paxos,Raft 减少了非确定性和服务器互相处于非一致性的方式)。一份针对两所大学 43 个学生的研究表明 Raft 明显比 Paxos 算法更加容易理解。在这些学生同时学习了这两种算法之后,和 Paxos 比起来,其中 33 个学生能够回答有关于 Raft 的问题。 Raft 算法在许多方面和现有的一致性算法都很相似(主要是 Oki 和 Liskov 的 Viewstamped Replication),但是它也有一些独特的特性: 强leader:和其他一致性算法相比,Raft 使用一种更强的leader能力形式。比如,日志条目只从leader发送给其他的服务器。这种方式简化了对复制日志的管理并且使得 Raft 算法更加易于理解。leader选举:Raft 算法使用一个随机计时器来选举leader。这种方式只是在任何一致性算法都必须实现的心跳机制上增加了一点机制。在解决冲突的时候会更加简单快捷。成员关系调整:Raft 使用一种共同一致的方法来处理集群成员变换的问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值