【分布式系统】Raft算法

原文链接

什么是拜占庭将军问题?

在很久很久以前,拜占庭是东罗马帝国的首都。那个时候罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信使传递消息。在打仗的时候,拜占庭军队内所有将军必需达成一致的共识,才能更好地赢得胜利。但是,在军队内有可能存有叛徒,扰乱将军们的决定。这时候,在已知有成员不可靠的情况下,其余忠诚的将军需要在不受叛徒或间谍的影响下达成一致的协议。

拜占庭将军问题其实说的是计算机网络中所存在的一致性问题

解决方案:比较有代表性的算法—Raft算法

Raft算法

raft算法是简单易懂的共识算法,依靠状态机主从同步的方式,在各个节点之间实现数据的一致性。

Raft的两个核心要点:

1.选取主节点

2.同步数据

选取主节点

Raft算法在选择主节点是通过多个节点之间的投票竞争

Raft算法为节点定义了三种角色(状态机):
1.Leader(主节点)
2.Follower(从节点)
3.Candidate(参与投票竞争的节点)

第一步,在最初,还没有一个主节点的时候,所有节点的身份都是Follower。每一个节点都有自己的计时器,当计时达到了超时时间(Election Timeout),该节点会转变为Candidate
在这里插入图片描述

第二步,成为Candidate的节点,会首先给自己投票,然后向集群中其他所有的节点发起请求,要求大家都给自己投票。

在这里插入图片描述

第三步,其他收到投票请求且还未投票的Follower节点会向发起者投票,发起者收到反馈通知后,票数增加。
在这里插入图片描述

第四步,当得票数超过了集群节点数量的一半,该节点晋升为Leader节点。Leader节点会立刻向其他节点发出通知,告诉大家自己才是老大。收到通知的节点全部变为Follower,并且各自的计时器清零。
在这里插入图片描述

这里需要说明一点,每个节点的超时时间都是不一样的。比如A节点的超时时间是3秒,B节点的超时时间是5秒,C节点的超时时间是4秒。这样一来,A节点将会最先发起投票请求,而不是所有节点同时发起投票请求

为什么这样设计呢?设想如果所有节点同时发起投票,必然会导致大家的票数差不多,形成僵局,谁也当不成老大。

那么,成为Leader的节点是否就坐稳了老大的位置呢?并不是。Leader节点需要每隔一段时间向集群其他节点发送心跳通知,表明你们的老大还活着。

一旦Leader节点挂掉,发不出通知,那么计时达到了超时时间的Follower节点会转变为Candidate节点,发起选主投票,周而复始…
在这里插入图片描述

同步数据

第一步,由客户端提交数据到Leader节点。

在这里插入图片描述

第二步,由Leader节点把数据复制到集群内所有的Follower节点。如果一次复制失败,会不断进行重试。
在这里插入图片描述

第三步,Follower节点们接收到复制的数据,会反馈给Leader节点。
在这里插入图片描述

第四步,如果Leader节点接收到超过半数的Follower反馈,表明复制成功。于是提交自己的数据,并通知客户端数据提交成功。
在这里插入图片描述

第五步,由Leader节点通知集群内所有的Follower节点提交数据,从而完成数据同步流程。

在这里插入图片描述

etcd:共享配置和服务发现的KV存储系统,使用Raft算法来保证分布式一致性

Paxos 算法:
早期的共识算法,由拜占庭将军问题的提出者 Leslie Lamport 所发明。谷歌的分布式锁服务 Chubby 就是以 Paxos 算法为基础。

ZAB 算法:
Zookeeper 所使用的一致性算法,在流程上和 Raft 算法比较接近。

PBFT 算法:
区块链技术所使用的共识算法之一,适用于私有链的共识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值