etcd之raft协议学习(摸了两天鱼,我有罪,我忏悔)

目录

一、raft协议的目的

二、raft协议的基础概念

三、raft协议的选举

1、发起选举的条件

2、赢得选举的条件

3、选举过程

四、raft协议的日志

1、本地日志保存

2、日志同步方式

3、日志复制时机

五、选举存在的问题以及raft协议的解决方式

1、如果选举的节点没有超过半数怎么办?

2、如果选举的时候两个candidate节点相遇怎么办?

3、如果选举的时候遇到leader节点怎么办?

4、如果leader节点相遇怎么办?

六、日志存在的问题以及raft协议的解决方式

1、leader节点相遇时日志操作?


一、raft协议的目的

        raft是一种一致性协议,在分布式系统中,确保在大部分ongoing的情况下,集群能正常工作并且给出一个正确的结果(业务可用)

二、raft协议的基础概念

        节点角色:leader节点,follower节点

        节点状态:leader状态,follower状态,candidate状态

        term值:任期,每进行一次选举,任期值+1

        commitIndex:标识当前节点已知的最大的已提交的日志索引值

        lastApplied:当前节点已存储的最大索引

        nextIndex数组:需要发送给每个follower节点的下一跳日志的索引值(看似冗余的数组,实际是防止发送失败)

        matchIndex数组:已经复制给每个follower节点的最大的日志索引值

三、raft协议的选举

1、发起选举的条件

        节点长时间没有收到leader节点的心跳,节点的选举计时器超时,发起新一轮选举。

2、赢得选举的条件

        节点获得(包括失联节点在内的)集群中超过半数的选票。

3、选举过程

        节点A长时间收不到心跳,发起投票,成为candidate状态,节点B收到A的消息时,如果仍处于Follower状态,则将票投给A并且重置选举定时器,否则节点为candidate状态(不可能为leader状态,如果是leader状态则无需投票),则选举失败。

四、raft协议的日志

1、本地日志保存

        每个节点都会维护一个本地log用户记录更新操作,并且维护commitindex和lastApplied,主节点二外维护nextIndex和matchIndex数组。

2、日志同步方式

        raft选择批量复制

3、日志复制时机

        数据更新时日志会主动同步到从(follower)节点上
        数据读取时日志如何操作(这个日志有关读到的数据)?

五、选举存在的问题以及raft协议的解决方式

1、如果选举的节点没有超过半数怎么办?

        由于raft的半数节点是指集群中所有节点的半数,而不是可以收到心跳的半数,所以是有可能出现以下情况:部分集群连接不上,并且此集群的节点小于半数并且不包含leader节点。raft将先计算是否有超过半数的节点,如果不超过,则不进行选举。

2、如果选举的时候两个candidate节点相遇怎么办?

        如果term值相等,则重新进行选举;否则以term值更大的未candidate节点。

3、如果选举的时候遇到leader节点怎么办?

        选举的时候网突然好了,这个得翻源码。

4、如果leader节点相遇怎么办?

        选term值较大的为leader节点。

六、日志存在的问题以及raft协议的解决方式

1、leader节点相遇时日志操作?

        当集群被分为两个网络后又合并时,依据日志的任期号来决定日志如何保留(保留任期号大的),如果任期号相同,则使用索引比较大的。

猜你喜欢

转载自blog.csdn.net/MrBlind/article/details/124486443