在分布式系统中,多个节点可能会同时对相同的数据进行操作,为了保证数据的一致性,需要使用一致性算法让所有节点达成一致。下面我们就来了解一下Raft一致性算法。

Raft一致性算法简介

Raft是一种简单方便易于理解的一致性算法,相比传统的Paxos算法,Raft将大量的计算问题分解成为了一些简单的相对独立的子问题。

Raft一致性算法增加了强领导性,优化了领导的选举过程,在成员发生变化之后依然能够很好的进行工作。

Raft一致性算法

Raft一致性算法的原理

Raft一致性算法的原理是将系统中的所有节点分为三种角色,分别是领导者(Leader)、跟随者(Follower)和候选领导者(Candidate)。

领导者负责处理所有的写请求,并将这些请求复制给其他节点;跟随者则负责接收领导者的命令并执行,同时保持与领导者的同步;当领导者出现故障时,候选领导者会发起选举,选举出新的领导者。

Raft一致性算法的过程

Leader选举的过程

Raft使用心跳(heartbeat)触发Leader选举。当服务器启动时,初始化为Follower。Leader向所有Followers周期性发送heartbeat。如果Follower在选举超时时间内没有收到Leader的heartbeat,就会等待一段随机的时间后发起一次Leader选举。

每一个Followers都有一个时钟,是一个随机的值,表示的是Follower等待成为Leader的时间,谁的时钟先跑完,则发起leader选举。

Follower将其当前term加一然后转换为Candidate。它首先给自己投票并且给集群中的其他服务器发送 RequestVote RPC。

Raft一致性算法

日志复制的过程

Leader选出后,就开始接收客户端的请求。Leader把请求作为日志条目(Log entries)加入到它的日志中,然后并行的向其他服务器发起 AppendEntries RPC复制日志条目。当这条日志被复制到大多数服务器上,Leader将这条日志应用到它的状态机并向客户端返回执行结果。

日志压缩

在实际的系统中,不能让日志无限增长,否则系统重启时需要花很长的时间进行回放,从而影响可用性。Raft采用对整个系统进行snapshot来解决,snapshot之前的日志都可以丢弃。

Raft一致性算法

Raft一致性算法的特点

  • 强领导者:和其他一致性算法相比,Raft 使用一种更强的领导能力形式。比如,日志条目只从领导者发送给其他的服务器。这种方式简化了对复制日志的管理并且使得 Raft 算法更加易于理解。
  • 领导选举:Raft 算法使用一个随机计时器来选举领导者。这种方式只是在任何一致性算法都必须实现的心跳机制上增加了一点机制。在解决冲突的时候会更加简单快捷。
  • 成员关系调整:Raft 使用一种共同一致的方法来处理集群成员变换的问题,在这种方法下,处于调整过程中的两种不同的配置集群中大多数机器会有重叠,这就使得集群在成员变换的时候依然可以继续工作。

免责声明:素材源于网络,如有侵权,请联系删稿。