Raft集群算法

一、什么是Raft算法

        多个节点存储数据存在数据不一致问题,在互联网应用中如何保证多个节点数据一致是很重要的问题。Raft与ZAB算法就是为了解决分布式存储一致性问题;

 二、Raft中的角色

        Raft集群中包含若干个节点,每个节点任务不同,正常节点只存在leader和follwer;

        1、Leader(领导者):负责日志的同步管理,处理来自客户端的请求,与Follower保持心跳的联系;

        2、Follower(追随者) :响应 Leader 的日志同步请求,响应Candidate的邀票请求,以及把客户端请求到Follower的事务转发(重定向)给Leader;

        3、Candidate(候选者) :负责选举投票,集群刚启动或者Leader宕机时,状态为Follower的节点将转为Candidate并发起选举,选举胜出(获得超过半数节点的投票)后,从Candidate转为Leader状态。

三、Raft中一致性问题

        选举:当leader宕机或者集群初创时需要选举出leader;

        日志复制:leader接收请求后将请求转为日志的形式复制到其它节点,并要求其它节点与其保持一直;

        安全性:如果有任何的服务器节点已经应用了一个确定的日志条目到它的状态机中,那么其它服务器节点不能在同一个日志索引位置应用一个不同的指令。

四、选举过程

               注: term为任期编号;

              第一步 启动成为默认角色:刚启动时所有节点默认为follower角色;        

              第二步 发起投票:follower节点与leader节点的心跳超时时间不同,率先超时者先转为candidate角色,自身term+1,并向自己投一票,发起拉票;

               第三步 投票:其它follwer节点接收到率先发起拉票节点请求判断请求节点大于自身term,接收请求投票给它;

              第四步 转为leader:一轮选举后产生票数超过半数票数节点成为leader,并向其它节点发送心跳,其它节点全部转为follower角色;并与leader保持同步;结束;

               第五步 新一轮选举:若没有选出则进行新一轮选举;若leader宕机也会产生新一轮的投票选举;重复上述步骤;

                投票分裂问题:若出现心跳同时超时情况,term同时+1,同时进行拉票请求;两个节点所获得的的票数形同;由于raft算法的集群多数都是单数集群,这种情况多半存在于有个节点宕机的情况;此时只有宕机的节点没有响应,两个节点会继续发送请求拉票;此时会有别的机器也心跳超时,term会在另外两台机器的基础上+1,此时这台机器term最大,成为leader;

五、日志的复制

在一个raft集群中,只有leader节点能够处理客户端请求,follower节点接收到请求也会重定向到leader上;ledader节点将请求的指令作为日志条目附加到日志中,然后将日志发送给follower,让他们复制;

        第一步:客户端请求提交到leader

                leader接收到请求后此时日志条目为未提交状态,不可读;

        第二步:复制

                leader此时向follower发送的日志条目和之前日志条目的索引位置以及任期编号term也包含在其中,如果follower发现索引位置以及任期条目不存在,拒绝接收新的条目;

                若条目不同,则可能是followe或leader崩溃导致,此时leader会回溯follower中的条目,进行比对,找到相同的条目,删除后面的所有条目,重新将leader的数据复制给follower;

Leader 为每一个 Follower 维护一个 nextIndex,它表示下一个需要发送给 Follower 的日志条目的索引地址。当一个 Leader 刚获得权力的时候,它初始化所有的 nextIndex 值,为自己的最后一条日志的 index 加 1。如果一个 Follower 的日志和 Leader 不一致,那么在下一次附加日志时一致性检查就会失败。在被 Follower 拒绝之后,Leader 就会减小该 Follower 对应的 nextIndex 值并进行重试。最终 nextIndex 会在某个位置使得 Leader 和 Follower 的日志达成一致。当这种情况发生,附加日志就会成功,这时就会把 Follower 冲突的日志条目全部删除并且加上 Leader 的日志。一旦附加日志成功,那么 Follower 的日志就会和 Leader 保持一致,并且在接下来的任期继续保持一致。

        第三步 :提交

                follower节点返回超过半数写入成功则将日志设为提交状态;

        第四步:返回客户端

        第五步:通知follower已提交;

六、Raft算法的安全性

        当leader节点将日志提交后,leader节点宕机,此时其它节点并没有将日志提交,甚至有的follower宕机的节点没有拿到这个日志;新的选举会将索引值最大的节点选为新的leader;投票中会拒绝没有自己日志新的candidate投票请求;

        基于上述情况,所选出的节点基本是所有节点中比较日志比较新的节点成为leader;

        新的leader会将日志复制给所有节点,复制超过半数成功,会在下一次复制日志的过程中让其它 节点提交数据;

                        

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值