0
点赞
收藏
分享

微信扫一扫

Raft算法介绍

苦茶如歌 2022-03-12 阅读 92
spring cloud

Raft解决的问题

通过日志复制管理来达到一致性的算法,Raft通过选举leader,并由leader节点负责管理日志复制来实现各个节点之间数据的一致性

是一个最终一致性算法,不是强一致性

重要角色

Leader:唯一负责客户端写请求的节点,也可以处理客户端读请求;同时需要处理日志的复制工作

Candidate:参与竞选Leader的候选人,有机会称为Leader

Follower:跟随者,可以处理客户端的读请求,负责同步来自leader节点的日志;当接受到其他的Candidate的投票请求后可以进行投票;当发现Leader,自身可以转变为Candidate发起Leader投票

演示

Rafticon-default.png?t=M276http://thesecretlivesofdata.com/raft/

投票文字说明

1、follower在心跳超时范围内没有接受到来自leader的心跳,则认为leader挂了,此时首先将本地的term(任期)加1。

此时若接受到来自其他Candidate的投票请求,则会将票投给这个Candidate

由Follower转变为Candidate,若之前尚未投票,则先投自己一票,向其他节点发出投票请求,然后等待响应

2、follower在接收到投票请求之后,会根据以下条件来决定是否投票

发来投票请求的Candidate的term不能小于自身节点的term

在我当前的term内,我的选票还没有投出去

发来投票请求的Candidate拥有的log编号,不能小于当前节点的log编号

在我的投票未投出的时候,接收到多个Candidate的请求,谁的log编号大就投给谁,若是log编号一致,采取先来先服务的方式(first-come-first-served)投票

3、Candidate发起投票请求后,会等待其他节点的响应结果

收到半数选票,则成为新的leader,然后通过广播告知其他的节点我是新的Leader,其中会包含新的term

接收到别的Candidate发送过来的成为Leader通知,比较一下新Leader的term不比自己的term小,则自己转变为follower

经过一段时间,没有收到过变数选票,也没有收到其他Candidate发来的成为新的Leader节点的通知,则重新发起选举

4、若Candidate在选举过程中各个Candidate票数相同,是无法选择新的Leader,这时候需要使用Randomized Election Timeouts策略来解决这个问题

重新将票数相同的Candidate重新发起选举,只是说发起选举的时间不同,各个Candidate发起时间是在一个给定范围内等待随机时长timeout之后开始的。这样一来,timeout较小的会先开始选举,一般情况下会优先获取半数选票而成为新的Leader

举报

相关推荐

0 条评论