这里写目录标题
前言
之前简单介绍过Paxos算法,并且推导了整个算法的产生,说明了实现过程,但是显而易见Paxos算法非常难理解,并且更难以实现,Raft算法的出现用来代替Paxos算法,实现更加容易,由于本人水平有限,可能文中出现错误,还请大家指出。
基础概念介绍
Raft是一种用于管理复制日志的一种一致性算法,它将通过一些功能将一致性的一些问题分解,从而更方便理解。
一、Raft的重要功能
Leader选举、日志复制(数据同步)、日志压缩(数据快照)、安全性等等
二、Raft的角色
Raft算法中将服务节点分为了三种角色:
Leader(领导者): 主服务节点,用来处理客户端的请求,并且将数据同步到Follower节点,只有当大多数Follower节点复制成功后才算数据写入成功。
Follower(跟随者):从服务节点,用来保持和Leader的数据同步,并且接受Leader心跳,当超过一定时间没有收到心跳则发起选举流程。
Candidate(候选者):当选举阶段发生时,Follower发起选举并将自身更新为候选者的角色,该角色只在选举阶段出现。
三、Leader任期(Term)
Raft算法将整个服务的时间划分为一个个Term周期,每个Term周期也就是Leader所当选的任期,该任期通过一个连续的数字来表示,每个任期开始的时候都会选举一个新的Leader来带领其他Follower,如果一个新的任期没有选举出Leader则Term+1,开始下一个任期的选举,通常具有最新任期的节点视为拥有最全的数据。
Raft保证在一个任期期间,最多只有一个Leader。
简单来说就像是总统的选举,每个任期为5年,当出现一些情况时,会进行总统的重新选举,也自然到达一个新的任期。
四、服务通信
在Raft算法中,各个不同节点之间的通信使用的是RPC协议,在整个算法中的通信分为以下三种
- RequestVote:选举投票请求,主要在Leader选举期间发生。
- AppendEntries:Leader发起的心跳,并且也同时进行日志的复制。
- InstallSnapshot:Leader向Follower同步日志快照信息,主要用来新加入的Follower节点和日志同步落后太多的节点与Leader同步数据。
Leader选举
一、什么是Leader的选举?
Raft算法规定了,只有Leader节点才能处理读写请求,Follower节点只进行数据的同步和Leader的选举。选举时采用RequestVote RPC通信
在服务器启动运行时刻,所有节点默认都为Follower角色,然后会等待一段时间没有收到Leader的心跳,则延迟随机时间来进行角色转化(Candidate)发起选举。
为什么需要延迟随机时间,这是为了多个Candidate节点同时发起选举,会造成选票分票导致无法选举成功,而延迟一段随机时间可以提高选举成功率。
在服务的运行当中,如果一个Followe