raft协议

2019-08-21  本文已影响0人  fffhJk

资料

官方网站 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选举

单节点选举

多节点同时发起投票

思考如何实现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

上一篇 下一篇

猜你喜欢

热点阅读