raft重要概念


难度 中等

执行流程

raft将分布式一致性问题分解成两个独立的问题,分成两个大的步骤来进行数据处理。

两个独立问题分别为:

  • leader election

  • log replication

对应的两个步骤分别为:

  • 先投票选出leader

  • leader存在后,由leader负责协调数据写入,当leader离开时,回到选leader步骤

节点与角色

在raft中每一个进程是一个节点,节点用节点id区分。节点有角色状态,并且在通信流程中,节点角色会不断发生变化。

节点角色状态分为如下三种:

  • follower

  • candidate

  • leader

节点启动时处于follower状态,并且每隔follower状态的节点都会等待leader状态节点的心跳报文,若有leader的话会定时收到心跳报文;若在一段时间内没有收到leader心跳报文,此时将会发生状态变更,follower切换到candidate状态,发起选举投票。投票过程中,若某节点获得大多数节点的投票,则该节点将从candidate转变为leader,而其他节点收到leader的消息后则从candidate转变为follower。

term

term在raft中作为逻辑时钟存在,Raft 把时间分割成任意长度的任期,用term来标识每一届leader的任期,这样可以保证在一个任期内只有一个Leader。

term是一个递增的数值,从选举开始,若在规定时间内选出leader,则term就是leader的工作期;若在规定时间未选出leader,将会开始新一轮选举,此时term将会增加。

当leader工作一段时间后下台,其他follower节点因心跳超时将会进入新一轮选举,此时term也会增加。

Candidate发起选举时就将自己的term加1,然后发起投票请求;

收到投票请求的节点比较请求的term和自己的term,如果请求的term比自己的大,则更新自己的term;

leader election

选举的限制条件如下:

  • 同一任期内每个节点最多只能投一票,先来先得

  • 数据最新才能获取到投票(选举人必须知道的比自己的多,需要比较term和log index)

当follower与leader的心跳超时时,就会触发选举,流程如下:

  1. 增加本地的current term,切换到candidate状态

  2. 投自己一票

  3. 并行给其他节点发送RequestVote

  4. 等待其他节点回复

  5. 根据回复结果进行状态变更

    1. 收到大多数节点的投票(包含自己的一票),则赢得选举,成为leader,并广播所有节点本节点已当选leader

    2. 被告知别人已当选,切换到follower

    3. 选举超时,发起新一轮选举

leader发送的第一个AppendEntriesRPC往往是一个空的包(不包含日志数据的心跳包,大部分时候是空的,如果当选leader和发送AppendEntries之间leader接收了新的数据,那么这部分新数据也会发送)。

当节点收到leader的第一条消息时:

  1. 比较local term与leader term,若local term>leader term,拒绝接受日志;若local term<leader term,更新local term,并append log

  2. 如果local term==leader term,则需要比较local index和leader index;若local index\<leader index,则append log;若local index\>leader index,

reference

  1. 一文搞懂Raft算法 - xybaby - 博客园

  2. Raft算法同步过程 - 个人文章 - SegmentFault 思否

  3. 分布式 - Raft算法之选举篇 - 个人文章 - SegmentFault 思否

  4. https://www.sofastack.tech/projects/sofa-jraft/raft-introduction/


文章作者: growdu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 growdu !
  目录
分类导航
随笔2 AI27 算法1 计算机基础13 博客搭建7 ChatGPT2 集群63 计算机通信1 数据库34 数据库深入80 DPDK26 Docker11 Elasticsearch4 编辑工具4 FAQ1 Go Web1 hometown2 编程语言16 网络9 OPC1 Linux38 openGauss4 页面12 PostgreSQL54 程序员自我修养1 协议11 成长之路1 stock1 存储5 工具20 VPP18 视频作品1 Vue13 Web1 代码示例11 数据库15 BenchmarkSQL1 PostgreSQL 源码修炼之路14
最热文章
1
13 逻辑复制深入
数据库深入🔥 1570
2
0 Postgresql存储、索引及系统优化、主备切换
PostgreSQL🔥 1495
3
一文读懂openguass dcf网络模块
集群🔥 1420
4
逻辑复制源码分析
数据库深入🔥 1327
5
PostgreSQL 分区表:从一行 `PARTITION BY` 到路由热路径的全链路拆解
数据库🔥 1094
6
applyparallelworker.c 之 LA 端源码深度解析:Leader Apply Worker 的指挥中枢
数据库深入🔥 1082
7
PostgreSQL Background Worker 全解:从 `RegisterBackgroundWorker` 到逻辑复制 4 类 worker 的全生命周期
数据库🔥 1078
8
PostgreSQL的后台进程walsender分析 - 关系型数据库 - 亿速云
PostgreSQL🔥 1033
9
PostgreSQL 逻辑复制的监控:六张视图 + 一组可执行 SQL,把 publisher/subscriber 的速率与健康度彻底看透
数据库🔥 1032
10
PostgreSQL 逻辑复制支持 DDL 之后:DDL 与 DML 的时序难题(重点:分区表)
数据库🔥 999
11
reorderbuffer.c 源码深度解析:PostgreSQL 逻辑复制的"事务重组引擎
数据库深入🔥 953
12
PostgreSQL 内核开发:读取一张表的 9 步标准流程与缓存全景
数据库🔥 938
13
从 `postgres` 二进制到生产级守护 —— PostgreSQL 最外层模块与启动全流程拆解
数据库🔥 936
14
支持逻辑复制同步 DDL 适配 SQL Server 方案
数据库深入🔥 934
15
PostgreSQL 逻辑复制的 ReorderBuffer 与事务机制:从一行 WAL 到一致性变更流的全链路绑定
数据库🔥 913
16
DDL同步架构(美化版)
数据库深入🔥 908
17
PostgreSQL Latch 机制详解:从一行 SetLatch 到 epoll 的内核之旅
数据库🔥 871
18
pgbench 源码全解:一个 C 文件如何撑起 PostgreSQL 官方压测工具
数据库🔥 860
19
PostgreSQL libpq 机制与缓冲区详解
数据库🔥 850
20
PostgreSQL 逻辑复制 spill 文件深度剖析:从 `xid-*.spill` 到 TPC-C 的增长方程
数据库🔥 845