etcd-raft论文

| 分类 etcd  | 标签 技术文章 

raft 特性

1 强领导:日志只能从领导者发给其他服务器,这样简化了对复制日志的管理

2 领导选举:raft算法使用一个随机计时器来领导选举,比其他一致性算法都必须实现心跳检测增加了一点机制,在解决冲突的时候更加简单

3 成员关系调整:raft使用一种共同一致的方法来处理集群成员变化问题,在这种方法下,处于调整过程中的两种不同的配置集群中大多数机器会有重叠,这就使得集群在成员变换的时候依然可以继续工作。

复制状态机

复制状态机

一致性算法管理者来自客户端指令的复制日志,状态机从日志中处理相同顺序的相同指令,所以产生的结果也相同。

复制状态机通常是复制日志实现的。

一致性算法包含以下特点:

1 安全性保证:在非拜占庭容错的情况下,包括网络延迟,丢包,错乱等都可以确保正确。

2 可用性:

3 不依赖时序保证一致性:物理时钟错乱或极端的消息延迟可能只有最坏的情况下才会导致可用性问题。

raft 通过选举一个高贵的领导人,然后给予他管理复制日志的责任来实现一致性,领导人从客户端接收日志条目,把日志复制到其他机器上,并且到保证安全性的时候告诉其他服务器应用日志到他们的状态机中,拥有一个领导人大大简化了复制日志管理,领导人不用和其他服务器协商。

通过领导人的方式,raft 一致性问题分解成三个相对独立的子问题

1 领导人选举:一个新的领导人被选举出来,当现存的领导人宕机时。

2 日志复制:领导人必须从客户端接收日志然后复制到集群中的其他节点,并强制要求其它节点的日志和自己的日志相同。

3 安全性:raft 安全性关键在于状态机的安全,如果有任何的服务器节点已经应用了一个确定的日志条目到它的状态机中,那么其他服务器节点不能在同一个日志索引位置应用一个不同的指令。

状态

状态 所有服务器上持久从在的东西
currentTerm 最后一次知道的任期号(初始化为0,持续递增)
votedFor 当前获得选票的候选人id
log[] 日志条目集,每一个条目包含一个用户状态机执行的指令和收到的任期号
状态 所有服务器上经常变的
commitIndex 已知的最大已经被提交的日志条目的索引
lastApplied 最后被应用到状态机的日志条目索引值(初始化为0,持续递增)
状态 在领导人里经常变的(选举后重新开始)
commitIndex 已知的最大已经被提交的日志条目的索引
lastApplied 最后被应用到状态机的日志条目索引值(初始化为0,持续递增)

附加日志rpc:

参数 参数解释
term 领导人任期号
leaderId 领导人id,以便跟随着重定向请求
prevLogIndex 新的条目紧随之前的条目(主要用来检验条目)
prevLogTerm prevLogIndex 条目的任期号
entries[] 准备存储的日志条目
leaderCommit 领导人已提交的索引值

返回值

参数 参数解释
term 当前的任期号,用于领导人去个更新自己
success 表示跟随者匹配上了prevLogIndex and prevLogTerm

接受者实现:

1 如果term < currentTerm 则返回false

2 如果日志在prevLogIndex位置处的日志条目任期号和prevLogTerm不匹配,则返回false

3 如果已经存在的条目和新产生的冲突,则删除已经存在的条目及后面所有的日志。(这就是强一致性,领导人说了算)

4 添加任何已有不存在的日志

5 若 leaderCommit > commitIndex 则commitIndex 等于 leaderCommit 和 新日志条目索引值中较小的一个

请求投票:

由候选人负责调用来征集选票

参数 参数解释
term 候选人任期号
candidateId 请求选票的候选人id
lastLogIndex 候选人最最后的日志条目索引
lastLogTerm 候选人最后的日志条目任期号

返回值

参数 参数解释
term 当前的任期号,以便候选人去更新自己的任期号
voteGranted 候选人赢得此张票时为true

接受者实现

1 如果 term < currentTerm 则返回false

2 如果 votedFor 为空或者就是 candidateId,并且候选人的日志条目至少和自己一样新,则投票给他。

所有服务器遵守如下规则

1 如果 commitIndex > lastApplied ,则lastApplied就+1,并把log[lastApplied]应用到状态机中 2 如果接收到的rpc请求响应中,当T > currentTerm,令currentTerm=T,并切换为跟随着状态。

跟随着

1 响应来自候选人和领导人的请求 2 如果在超时选举时间的情况没有收到领导人的心跳,则自己就切换为候选人,发起投票。

候选人

1 在切换为候选人的时候就马上发起投票。投票有一下规则:

1> 自增当前的任期号(currentTerm)

2> 给自己投票

3> 重置选举超时时间

4> 发送投票请求给其他服务器节点

2 如果接受到大多服务器的选票,则变成领导人

3 如果接收到来自新领导人的附加rpc日志,转变成跟随者

4 如果选举超时,则发起新一轮选举

领导人

1 一旦成为领导人,则发送空的rpc其他节点,防止超时

2 如果接受到来自客户端的请求,附加条目到本地日志中,然后响应客户端

3 如果对于一个跟随着,最后日志条目索引大于等于nextIndex,那么发送从nextIndex 后的所有日志

1> 如果成功则更新更随着的 nextIndex 和 matchIndex

2> 如果失败,则nextIndex-1 重试

4 如果存在一个满足N > commitIndex的 N,并且大多数的matchIndex[i] ≥ N成立,并且log[N].term == currentTerm成立,那么令 commitIndex 等于这个 N

raft 一致性算法总结

特性 特性解释
选举安全特性 对于一个给定的任期号,最多只能选出一个领导人
领导人只附加原则 领导人绝不会覆盖或删除自己的日志,只增加日志
日志匹配原则 如果两个日志在相同的索引位置日志条目的任期号相同,那么我们认为日志从到索引位置之间完全相同
领导人完全特性 如果某个日志在某个任期号中全部提交,那么这个条目必须出现在更大的任期号的所有领导人中
状态机安全特性 如果一个领导人在给定索引位置位置的日志添加到状态机中,那么其他任何服务器的这个索引位置不会提交一个不同的日志

Raft把时间分割成任意长度的任期,有可能一个任期以没有领导人结束。


上一篇     下一篇