美文网首页
raft协议

raft协议

作者: fffhJk | 来源:发表于2019-08-21 19:20 被阅读0次

资料

官方网站 https://raft.github.io/
动画示例 http://thesecretlivesofdata.com/raft/
网易云知乎 https://zhuanlan.zhihu.com/p/30706032
wiki https://zh.wikipedia.org/wiki/Raft
RocketMQ https://mp.weixin.qq.com/s?__biz=MzIzNzgyMjYxOQ==&mid=2247484393&idx=1&sn=117208f86616ce7793d84fbe80c5ec5b&chksm=e8c3f41ddfb47d0bbe4937ba700a2def8c589839b4f97af3e1a7d74335914b12c07b7d04c953&scene=21#wechat_redirect

简介

Raft是一个共识算法,取代Paxos。Raft的目标是提供更好理解的算法,并且证明可以提供与Paxos相同的容错性以及性能。

Raft透过选举leader的方式实做共识算法:
在Raft集群(Raft cluster)里,服务器可能会是这三种身份其中一个:leader、follower,或是candidate(候选人)。在正常情况下只会有一个leader,其他都是follower。而leader会负责所有外部的请求,如果不是leader的机器收到时,请求会被转发到leader。
通常leader会借由固定时间发送消息,也就是“心跳(英语:heartbeat)”,让follower知道集群的领袖还在运作。而每个追随者都会设计超时机制(timeout),当超过一定时间没有收到心跳(通常是150 ms或300 ms,集群就会进入选举状态。

Raft将问题拆成数个子问题分开解决,让人更容易了解:

  • 领袖选举(Leader Election)
  • 记录复写(Log Replication)
  • 安全性(Safety)

Leader选举

单节点选举

  • 首先3个节点初始状态为 Follower,每个节点会有一个超时时间(计时器),其时间设置为150ms~300ms之间的随机值。当计时器到期后,节点状态从 Follower 变成 Candidate。
  • 通常情况下,三个节点中会有一个节点的计时器率先到期,节点状态变为Candidate,候选者状态下的节点会发起选举投票。我们先来考虑只有一个节点变为Candidate时是如何进行选主的。
    当节点状态为 Candidate,将发起一轮投票,由于是第一轮投票,设置本轮投票轮次为1,并首先为自己投上一票,正如上图所示的 NodeA 节点,Term 为1,Vote Count为1
  • 当集群内的节点收到投票请求后如果本轮未进行过投票,则赞同,否则反对,然后将结果返回,并重置计时器。
  • 当节点A收到的赞同票大于一半时,则升级为该集群的 Leader,然后定时向集群内的其他节点发送心跳,以便确定自己的领导地位。
  • 节点在收到 Leader 的心跳包后,返回响应结果,并重置自身的计时器,如果 Flower 状态的节点在计时时间超时内没有收到 Leader 的心跳包,就会从 Flower 节点变成 Candidate,该节点就会发起下一轮投票
  • 如果主节点宕机,则停止向集群内的节点发送心跳包。随着计时器的到期,节点B先于节点C变成 Candidate,则节点B向集群内的其他节点发起投票
  • 节点C收到请求,由于其投票轮次大于自己的投票轮次,并该轮次并未投票,投出赞成票并返回结果,然后重置计时器。节点B将顺理成章的成为新的Leader并定时发送心跳包

多节点同时发起投票

  • 首先同时有两个节点进入Candidate状态,并开始新的一轮投票,当前投票编号为4,首先先为自己投上一票,然后向集群中的其他节点发起投票,比如C D节点同时发起自己的投票
  • 首先节点C、D在收到D、C节点的投票请求时,都会返回不同意,因为在本轮投票中,已经各自为自己投了一票,按照上图,节点A同意C节点、节点B同意D节点,那此时C、D都只获得两票,当然如果A,B都认为C或D成为主节点,则选择就可以结束了,C、D都只获的2票,未超过半数,无法成为主节点
  • 投票结果如下:节点A,节点C同意节点B成为leader,但由于BD都发起了第5轮投票,最终的投票轮次更新为6

思考如何实现Raft选主

  1. 节点状态
    需要引入3种节点状态:Follower(跟随者)、Candidate(候选者),投票的触发点,Leader(主节点)。

  2. 进入投票状态的计时器
    Follower、Candidate 两个状态时,需要维护一个计时器,每次定时时间从150ms-300ms之间进行随机,即每个节点的每次的计时过期不一样,Follower状态时,计时器到点后,触发一轮投票。节点在收到投票请求、Leader 的心跳请求并作出响应后需要重置定时器。

  3. 投票轮次Team
    Candidate 状态的节点,每发起一轮投票,Term 加一;Term的存储。

  4. 投票机制
    每一轮一个节点只能为一个节点投赞成票,例如节点A中维护的轮次为3,并且已经为节点B投了赞成票,如果收到其他节点,投票轮次为3,则会投反对票,如果收到轮次为4的节点,是又可以投赞成票的。

  5. 成为Leader的条件
    必须得到集群中节点的大多数,即超过半数,例如如果集群中有3个节点,则必须得到两票,如果其中一台服务器宕机,剩下的两个节点,还能进行选主吗?答案是可以的,因为可以得到2票,超过初始集群中3的一半,所以通常集群中的机器各位尽量为奇数,因为4台的可用性与3台的一样。

Raft协议实现

参考 https://github.com/wenweihu86/raft-java

相关文章

  • RocketMQ主从切换

    本文主要是记录raft协议的学习过程,包括如下几个方面 raft协议一些基本概念 raft协议场景 raft协议在...

  • 一致性协议raft和Paxos

    raft一致性协议 透彻讲解raft协议选举过程 etcd 利用raft一致性协议 zookeeper使用Paxo...

  • Raft协议

    1.raft协议 raft协议是一个共识算法,主要包括leader election,log replicatio...

  • 对标Eureka的AP一致性,Nacos如何实现Raft算法

    一、快速了解Raft算法 Raft 适用于一个管理日志一致性的协议,相比于 Paxos 协议 Raft 更易于理解...

  • Raft 协议

    Raft 协议 Raft 感觉是最容易理解的一个了,也很有意思。先说它的逻辑: Raft 协议的每个副本都会处于三...

  • Raft 协议

    Raft 协议是一个分布式共识(consensus)算法, 可以参考 ATC-Raft 和 Thesis-Raft...

  • 【raft】raft协议解析

  • Raft协议

    典型场景分析 场景减少,系统中共有三个节点,由于三个机器各自机器故障,无法与其他的节点完成正常的网络通信,假设三个...

  • Raft协议

    三种节点状态 follow candidate leader Raft一致性策略 Raft协议强依赖leader节...

  • raft协议

    资料 官方网站 https://raft.github.io/动画示例 http://thesecretliv...

网友评论

      本文标题:raft协议

      本文链接:https://www.haomeiwen.com/subject/icaisctx.html