聊聊Raft一致性协议以及Apache Ratis

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Androidlushangderen/article/details/86763412

前言


在分布式系统中,有一类经典的问题经常会被提起:一致性问题。在单机环境中,这看起来根本不是一个问题。但是在多机,多服务,不同网络环境下时,一致性问题就是一个典型的问题了。在分布式系统中,当我们提到一致性问题时,我们立马想到的是Paxos协议。而对此协议的一个开源的实现框架是目前被广泛使用的组件Zookeeper。但是所说Paxos比较成熟,但是它比较晦涩难懂,实现起来也比较复杂。于是另外一种逻辑比较清晰的一致性算法出现了:Raft算法。本文笔者来简单阐述此协议算法的内容以及对应的工具库实现Apache Ratis。

分布式系统中的经典问题:Consensus问题


首先,我们还是需要了解下Raft要解决的问题:Consensus问题。Consensus是一个在具有容错能力的分布式系统中需要去解决的一个基本问题(因为不同服务状态能达成一致,所以系统才有容错能力)。这里需要多系统服务之间通信协调来达成具有一致性的状态或值。这里面还包括于说不同服务在所经历的transaction操作以及所更新的状态值也应该是完全一致的。这里其实我们提到的里面的状态机(State Machine)的情况了

Raft一致性算法的使用场景


基于Raft的一致性,我们可以有哪些使用场景呢,这里主要有以下2个:

  • Log Replication。我们可以理解为一个Log代表的是一次transaction操作记录。
  • Replicated state machines,副本状态机。它能保证所有的服务间的状态的同步性。

Raft算法原理


OK,此处我们开始正式地来了解Raft协议。
前面也已经提到过,Raft相比较于Paxos,它的实现过程更加简洁一些,逻辑也更加清晰一些。相比较于Paxos每个阶段复杂的操作步骤,Raft的步骤可以用下面简单的文字进行概括。

首先这里会有3个角色身份:

  • Leader,领导者身份。由此身份来向其Follower身份发号各种施令。同时Leader通过心跳的方式来表明其领导属性。
  • Follower,跟随者身份。接收Leader的命令指示,并执行结果。同时当在一定超时时间内没有收到Leader的消息后,能够变为Candidate身份,重新竞选Leader身份。
  • Candidate身份。可由Follower转变而来,Candidate向其他Follower机器发送投票选举,当超过半数以上的投票选择后,能成为Leader身份。

这里有个特殊case,当有2个Candidate在最后时间里得到了相同票数的时候,那么此轮选举将会失败,随后会进行一次随机超时时间内的新一轮选举,官方术语称为Split Vote(投票分裂)。这样发生同票现想的几率就会变低了

以下是3种身份角色的转换图:

在这里插入图片描述

Leader和Follower之间的交互关系,首先是Leader(下图S1)发出操作命令,比如说是一次Log append entry:

在这里插入图片描述

然后是Follower反馈给Leader过程。

在这里插入图片描述

Raft协议的一致性过程


基于Raft一致性协议下,服务间是如何保证做到状态的同步性的呢?如下图所示:

在这里插入图片描述

我们可以看到,每个Server通过一致性算法过程得到每次的Log记录,等每次Log操作记录完整持久化到本地Sever之后,然后再经过3步骤,apply log到状态机中,这样每个Sever的状态演变过程以及最终状态值都将是完全同步的。

Raft的java实现库:Apache Ratis


为了将Raft一致性算法更方便地使用于各个分布式系统中,以此构建出容错性更强的分布式服务。Apache Ratis诞生了,它是一个Raft算法的Java实现库。目前在Ozone被用来做Container command的replicate的执行。在未来还将用于Ozone HA的实现。

另外,Apache Ratis还能够定制化上节中Log Store存储和状态机的自定义实现。这无疑大大增强了Ratis的使用性和灵活性。

以上就是笔者对于Raft算法的简单阐述了,更多内容详见引用链接处。

引用


[1].https://raft.github.io/raft.pdf
[2].http://ratis.incubator.apache.org/
[3].https://raft.github.io/

猜你喜欢

转载自blog.csdn.net/Androidlushangderen/article/details/86763412
今日推荐