4、分布式基础之Raft算法

2019-04-29  本文已影响0人  小manong

摘自Raft一致性算法论文:https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md
github上开源的raft实现:https://raft.github.io/#implementations

一、paxos算法的缺点说起

Paxos 算法的描述与实际实现之间存在巨大的鸿沟…最终的系统往往建立在一个没有被证明的算法之上。

二、Raft算法

1、复制状态机
2、一致性算法应该有的特征

1、确保安全性(从来不会返回一个错误的结果),即使在所有的非拜占庭(Non-Byzantine)情况下,包括网络延迟、分区、丢包、冗余和乱序的情况下。
2、高可用性,只要集群中的大部分机器都能运行,可以互相通信并且可以和客户端通信,这个集群就可用。因此,一般来说,一个拥有 5 台机器的集群可以容忍其中的 2 台的失败(fail)。服务器停止工作了我们就认为它失败(fail)了,没准一会当它们拥有稳定的存储时就能从中恢复过来,重新加入到集群中。
3、不依赖时序保证一致性,时钟错误和极端情况下的消息延迟在最坏的情况下才会引起可用性问题
4、不依赖时序保证一致性,时钟错误和极端情况下的消息延迟在最坏的情况下才会引起可用性问题

3、Raft算法分解

1、领导人选取(Leader election): 在一个领导人宕机之后必须要选取一个新的领导人
2、日志复制(Log replication): 领导人必须从客户端接收日志然后复制到集群中的其他服务器,并且强制要求其他服务器的日志保持和自己相同
3、安全性(Safety):如果一个服务器已经将给定索引位置的日志条目应用到状态机中,则所有其他服务器不会在该索引位置应用不同的条目

4、Raft基础

跟随者只响应来自其他服务器的请求。如果跟随者接收不到消息,那么他就会变成候选人并发起一次选举。获得集群中大多数选票的候选人将成为领导者。在一个任期内,领导人一直都会是领导人直到自己宕机了。

领导选举时序

时间被划分成一个个的任期,每个任期开始都是一次选举。在选举成功后,领导人会管理整个集群直到任期结束。有时候选举会失败,那么这个任期就会没有领导人而结束。任期之间的切换可以在不同的时间不同的服务器上观察到。Raft 保证了在一个给定的任期内,最多只有一个领导者。
(不同的服务器节点可能多次观察到任期之间的转换,但在某些情况下,一个节点也可能观察不到任何一次选举或者整个任期全程。任期在 Raft 算法中充当逻辑时钟的作用,这会允许服务器节点查明一些过期的信息比如陈旧的领导者。每一个节点存储一个当前任期号,这一编号在整个时期内单调的增长。当服务器之间通信的时候会交换当前任期号;如果一个服务器的当前任期号比其他人小,那么他会更新自己的编号到较大的编号值。如果一个候选人或者领导者发现自己的任期号过期了,那么他会立即恢复成跟随者状态。如果一个节点接收到一个包含过期的任期号的请求,那么他会直接拒绝这个请求。)

5、领导人选举

Raft 算法使用随机选举超时时间的方法来确保很少会发生选票瓜分的情况,就算发生也能很快的解决。为了阻止选票起初就被瓜分,选举超时时间是从一个固定的区间(例如 150-300 毫秒)随机选择。这样可以把服务器都分散开以至于在大多数情况下只有一个服务器会选举超时;然后他赢得选举并在其他服务器超时之前发送心跳包。同样的机制被用在选票瓜分的情况下。每一个候选人在开始一次选举的时候会重置一个随机的选举超时时间,然后在超时时间内等待投票的结果;这样减少了在新的选举中另外的选票瓜分的可能性。

6、日志复制

日志由有序序号标记的条目组成。每个条目都包含创建时的任期号(图中框中的数字,从领导者获取),和一个状态机需要执行的指令。每一条日志条目同时也都有一个整数索引值来表明它在日志中的位置。一个条目当可以安全的被应用到状态机中去的时候,就认为是可以提交了。

7、安全性
8、其他
上一篇 下一篇

猜你喜欢

热点阅读