白话-raft协议(一)

简介: 下面文章会以图形方式来解读raft协议,与其他作者文档相比,会更偏向工程的实现细节 适合读者: - 想了解raft协议的懒人,不想读论文,不想看代码,不想动脑袋。。。

前言

下面文章会以图形方式来解读raft协议,与其他作者文档相比,会更偏向工程的实现细节

适合读者:

  • 想了解raft协议的懒人,不想读论文,不想看代码,不想动脑袋。。。

对一般人而言,了解raft协议,https://raft.github.io/这个网站都会接触到,它提供了:

动画部分建议先了解下,有助于下面的学习。

下面的raft流程交互和参数说明参考了etcd中的raft实现

1 初识

19世纪80年代,小红(id=1)、小黄(id=2)、小蓝(id=3)三位同学商量放假去哪儿玩,她们之间商议过程只能通过书信(会发生各种意外情况导致信件丢失或者回复缓慢)。我们一起看看三人之间是如何达成一致意见的。

先熟悉第一个概念,角色。每位同学都会分属下面三种角色之一:

角色 英文
领导者 leader
跟随者 follower
候选者 candidate

故事开头,每个同学都是follower角色

2 领导者选举

2.1 选举超时时间 election timeout和任期term

既然是商量事情,总有一个要先提意见的,为了公平起见,给每位同学一个随机的超时时间(election timeout),谁先过了超时时间就准备开始发言

raft_1

图中,小红150mm时间最短,小红最先超时

与超时时间类似,每位同学都有一个任期属性,正常情况下每发起一次选举,任期会自动加1,初始状态大家的任期都是0,图中的其他属性暂时忽略

2.2 小红的自我投票(MsgHup)和投票请求(MsgVote)

2.1节中小红最先到达超时时间,她的动作如下所示:

raft_2

  1. 小红首先给自己发了一个Message1,type为MsgHup,告知自己要参与选举了
  2. 小红收到Message1后,将自己的term由0改为1,状态由StateFollower改为了StateCandidate,至此角色由follower转换为了candidate,顺便给自己投了一票(votes[1]=ture)
  3. 小红在term为1的任期内正式向小黄和小蓝发起投票请求(Message2.1和Message2.2) ,type为MsgVote

2.3 小黄和小蓝的回复(MsgVoteResp)

先看小黄的回复:

raft_3

  1. 小黄接收到Message2.1后,将Message2.1的term(1)与自身的term(虚线框0)比较,发现自身的term小于Message2.1,继续保持自己的follower角色,同时将自身的term改为1
  2. 小黄向小红发送Message3.1进行回复,type为MsgVoteResp

小蓝的回复与小黄类似,回复Message3.2,见下图,不再赘述:

raft_4

2.4 小红变为了leader

raft_5

  1. 小红先收到了小黄的Message3.1,type为MsgVoteResp。这时候小红已经获得了两票,一票是自己投自己,一票是小黄投的(对应图中的votes[i]变量,votes[1]=ture,votes[2]=true),小红得票已经超过集群的半数,由此小红的状态从StateCadidate转变为了StateLeader
  2. 接着小红给自己创建了一个空日志条目,开始向小黄和小蓝发送Message4.1和Message4.2,type为MsgApp,即要求follower同步自己的数据
  3. 小红的prs[1].match_=1

小红收到了小黄的Message3.1后,由于满足半数投票,已经变为了leader角色,这时再收到小蓝的Message3.2,不再需要做任何操作

这时,小红在本地记录了一个空的Entry

raft_log_1

  • 此时的Entry只是临时记录,所以为虚线

3日志同步

3.1 小黄和小蓝的回应MsgAppResp

2.4节小红开始向小黄和小蓝发送Message4.1和Message4.2,下面是小黄和小蓝收到后的回复

raft_6

  • 小黄和小蓝收到信息后,各自也准备了一个空的Entry,并且向小红回复了type为MsgAppResp的Mesaage(Message5.1和Message5.2)

此时,三位同学的日志状态如下:

raft_log_2

3.2 小红确认日志记录,继续发送MsgApp

raft_7

  • 小红收到小黄的Message5.1后,会设置prs[2].match_=1,至此已经有半数以上(2个人)同意进行日志提交,因此小红将自身的raftLog.committed_由0设置为1
  • 小红处理完Message5.1后,会继续向小黄发送Message6.1,type为MsgApp,继续同步日志记录。与Message4.1不同的是,此时index、logterm、commit由0变为了1
  • 小红继续受到小蓝的Message5.2,会设置prs[3].match_=1,处理完后同样会发送Message6.2给小蓝,index、logterm、commit同样为1

此时日志状态,小红的日志由虚线变为实线

raft_log_3

3.3 小黄和小蓝确认日志记录

raft_8

  1. 小黄收到小红Message6.1后,根据msg中的commit为1,修改自己的commit为1,然后发送type为MsgAppResp的Message7.1
  2. 同理,小蓝也会修改自己的commit为1,然后返回type为MsgAppResp的Message7.2

此时日志状态,小蓝和小黄由虚线变为实线

raft_log_4

3.4 小红的收尾

  1. 当小红收到Message7.1后,检查msg中的index和本地的prs[2].match_,两者相等,不做任何操作
  2. 同理,小红收到Message7.2后,检查msg中的index和本地的prs[3].match_,两者相等,不做任何操作
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
21天前
|
存储 算法 前端开发
作者推荐 | 分布式协议之巅 — 揭秘基础Paxos与Raft协议如何实现分布式系统达成一致性(非变种Paxos协议)
作者推荐 | 分布式协议之巅 — 揭秘基础Paxos与Raft协议如何实现分布式系统达成一致性(非变种Paxos协议)
22 0
|
8月前
|
算法
奇葩论文:分布式一致性协议-Paxos
奇葩论文:分布式一致性协议-Paxos
奇葩论文:分布式一致性协议-Paxos
|
8月前
|
移动开发 算法 架构师
常见分布式协议和算法的说明和对比
常见分布式协议和算法的说明和对比
|
存储 算法 关系型数据库
浅谈 Raft 分布式一致性协议|图解 Raft
本篇文章将模拟一个KV数据读写服务,从提供单一节点读写服务,到结合分布式一致性协议(Raft)后,逐步扩展为一个分布式的,满足一致性读写需求的读写服务的过程。
658 0
浅谈 Raft 分布式一致性协议|图解 Raft
|
存储 算法 架构师
【架构师指南】带你彻底认识 Paxos 算法、Zab 协议和 Raft 协议的原理和本质
【架构师指南】带你彻底认识 Paxos 算法、Zab 协议和 Raft 协议的原理和本质
538 0
【架构师指南】带你彻底认识 Paxos 算法、Zab 协议和 Raft 协议的原理和本质
|
算法
深入浅出Zookeepr的ZAB协议
深入浅出Zookeepr的ZAB协议
152 0
深入浅出Zookeepr的ZAB协议
|
算法
分布式学习十:ZAB协议
分布式学习十:ZAB协议
71 0
分布式学习十:ZAB协议
|
存储 算法 RDMA
分布式一致性协议 | 青训营笔记
远程过程调用(RPC) 分布式系统中通常将不同组件,或者不同节点的交互使用 RPC 的方式进行封装,在调用方的视角一次远程过程调用不需要关心如何对请求和响应进行编码,也不用关心具体的网络传输。
124 0
分布式一致性协议 | 青训营笔记
|
算法 Java 开发者
Raft 协议选举基本的概念 | 学习笔记
快速学习 Raft 协议选举基本的概念
96 0
|
Java Nacos 开发者
Raft 协议选举底层实现原理 | 学习笔记
快速学习 Raft 协议选举底层实现原理
87 0
Raft 协议选举底层实现原理 | 学习笔记