deepwzh的技术笔记
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • 杂项
  • Windows UI 自动化方案调研 (2026)v2
  • Nginx
  • 首页
  • Protobuf
  • 学习资料
  • 杂项
  • Ldap
  • 编译原理
  • 分布式

    • 分布式
    • Raft 算法
  • 开发工具

    • 开发工具
    • cloc
    • Vscode
    • 工具箱
    • Visual Studio

      • Visual Studio
      • C++ 相关
      • Visual Studio 基本知识
  • 软件设计

    • 软件设计
    • MVC
    • 领域驱动设计
    • PO、DO、DTO、VO
    • 高内聚低耦合
  • 消息队列

    • 消息队列
    • Celery
    • Kafka
    • RabbitMQ
  • 设计模式

    • 设计模式
    • 控制反转和依赖注入
    • 七大原则
  • 网络安全

    • 网络安全
    • 请求签名
    • CSRF
    • XSS
  • 版本管理工具

    • 版本管理工具
    • Git

      • Git
      • Git get 私有仓库报错
      • Github 加速
      • Clone
      • Git pull 出现 hint 时的解决方案
      • 修改提交记录的作者信息
      • Git mergr
  • 组成原理

    • 组成原理
    • CPU

Raft 算法

Raft 一致性算法

有限状态机图

基本概念

  • Leader 领袖
  • Candidate 候选人
  • Follower 群众

领袖选举

  • 一开始所有节点都是群众
  • 会有一个计时器,计时结束后仍没有收到心跳,会将自己设为候选人,任期 +1, 先投自己一票,然后请求别人为自己投票; 如果收到了心跳,会重置计时器
  • 其他的群众接收到请求投票的消息,若他还没有投票,且请求方的任期比自己本地的要大,会把自己的一票发给第一个投票请求;否则要明确不投票给他
  • 当一个候选人获取到半数以上的投票,则他将成为 Leader,并通过心跳通告给其他节点,候选人接收到任期更高的心跳转为群众,群众接收到心跳就会重置选举定时器

日志复制

  • 每一个客户端的请求都将被解析成一条需要复制状态机执行的指令

  • Leader 现将指令存到日志文件中去

  • 并行的向其他节点发起 AppendEntries RPC,要求其复制;如果未返回成功则要一直重试

  • Leader 确保安全复制后,将日志应用(提交)到状态机中,向客户端返回执行结果

    • 一旦领导人创建的条目已经被复制到半数以上的节点上了,那么这个条目就称为可被提交的,为安全
  • Leader 通过心跳,将已提交的索引值返回给其他节点,其他节点根据这个信息,把日志应用到本地状态机

Raft 通过以下机制保证不同节点日志的一致性:

  1. 不同日志的两个条目有相同的索引号和任期号,则存储的命令一致
  2. 不同日志有相同的索引和任期号,则他们之前的所有条目都是完全一样的;因为每次 Follower 追加新日志条目的时候,都会检查前一条(前一条的信息也包含在 RPC 请求当中)

安全性 QA

可用性与时序

异常情况

参考资料

https://cloud.tencent.com/developer/article/1525566

Raft Scope Raft 算法模拟

Prev
分布式