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 !
  目录
分类导航
随笔3 AI29 计算机基础13 算法1 博客搭建7 ChatGPT2 集群63 计算机通信1 数据库59 数据库深入93 数据库93 Docker11 DPDK26 编辑工具4 Elasticsearch4 FAQ1 Go Web1 hometown2 编程语言16 人生11 网络9 Linux38 OPC1 openGauss4 页面12 PostgreSQL54 程序员自我修养1 协议11 stock1 存储5 成长之路1 工具20 视频作品1 VPP18 Vue13 Web1 代码示例11 BenchmarkSQL1 PostgreSQL 源码修炼之路14
最热文章
1
PostgreSQL 逻辑复制全链路:以一个真实事务为例,从 `INSERT` 到 `apply` 的源码级旅程
数据库🔥 2162
2
PostgreSQL 逻辑复制 Stream 执行逻辑源码级拆解:从 reorderbuffer 触发到订阅端落盘回放
数据库🔥 1765
3
PostgreSQL 行锁机制源码级深度拆解:4 种锁模式 + xmax + MultiXact 的完整链路
数据库🔥 1656
4
PostgreSQL reorderbuffer.c 函数级源码全集:5615 行 / 95 个函数的逐函数解析
数据库深入🔥 1650
5
PostgreSQL 目录快照源码级深度拆解:系统表读取的 MVCC 真相与失效机制
数据库🔥 1604
6
13 逻辑复制深入
数据库深入🔥 1570
7
0 Postgresql存储、索引及系统优化、主备切换
PostgreSQL🔥 1495
8
PostgreSQL 读一行数据源码级深度拆解:MVCC 在每个环节的落点
数据库🔥 1464
9
PostgreSQL WAL 记录类型完全指南:21 个 RMGR × 80+ 种记录的源码级拆解
数据库🔥 1431
10
一文读懂openguass dcf网络模块
集群🔥 1420
11
PostgreSQL 元数据存储机制:从磁盘文件到内存缓存,`pg_class` 撑起的整个系统表体系
数据库🔥 1411
12
openGauss 并行解码设计原理深度拆解:reader + 多 worker + CSN 三层架构的源码级剖析
数据库深入🔥 1344
13
逻辑复制源码分析
数据库深入🔥 1327
14
PostgreSQL 逻辑复制:catalog 改动、可见性判定与 xmin/xmax 推进全景
数据库深入🔥 1317
15
自托管服务全家桶:从原文方案到可复制实操手册
人生🔥 1278
16
PostgreSQL CREATE_REPLICATION_SLOT 端到端源码分析:从 SQL 到 snapbuild 状态机的完整链路(每个函数每个参数)
数据库深入🔥 1277
17
PostgreSQL syscache 模块源码深度拆解:CatCache 数据结构、LRU 哈希表、cache invalidation 全链路
数据库深入🔥 1216
18
PostgreSQL 18 内核数据结构全景:RangeVar 与 20+ 个核心数据结构源码级拆解
数据库🔥 1158
19
PostgreSQL 逻辑复制里 `RUNNING_XACTS` 写入机制与快照 `xmin / xmax / xip` 的演化:源码级深度拆解
数据库🔥 1119
20
PostgreSQL 分区表:从一行 `PARTITION BY` 到路由热路径的全链路拆解
数据库🔥 1094