前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Raft 日志复制 committed 多数派
分布分布式系统一致性与容错

Raft 的日志复制流程中 committed 是什么意思?

Raft中committed指日志条目已由多数节点持久化,且当前任期Leader已推进提交索引,此后可安全应用并对外回复。

前端进阶之旅 · 一题精讲更新于 2026.09.05
分布式系统#一致性与容错#可观测性
先看核心答案
理解线索

提交的核心条件

  1. 多数派复制至少过半节点持久化该条目
  2. Leader决定只有当前任期Leader能推进commitIndex
  3. 应用状态机提交后条目标记为可安全执行

未提交条目可能被覆盖,已提交条目必须持久存在

核心回答

先记住这个答案

在Raft中,一个日志条目被标记为committed需同时满足:已被持久化到集群中超过一半的节点(包括Leader),且当前任期Leader已将commitIndex推进到该条目。此时Leader认为该条目已被安全提交,并通过心跳或AppendEntries把提交索引广播给所有节点。注意:只有当前任期Leader才能推进commitIndex,因此旧条目即使曾被复制到多数节点,若未得到当前任期Leader的间接确认,也不能直接视为committed。

  • 复制到多数派且Leader推进提交索引后才算提交
  • 只有Leader能推进提交索引
  • 提交后可安全应用到状态机

提交索引的推进机制

Leader接收到客户端写入请求后,先将条目追加到自己的日志,然后并行向所有Follower发送AppendEntries RPC。当Leader收到多数节点的成功响应时,它认为该条目已在多数节点持久化,于是将本地的commitIndex推进到该条目,并通过下一次心跳或AppendEntries把新版commitIndex广播给所有节点。收到广播的Follower会按顺序将已提交条目应用到状态机。

提交条件与任期相关。Raft要求只有当前任期的Leader才能推进commitIndex,且旧条目不能仅凭多数派拥有就被直接提交。旧Leader可能尚未完成提交就崩溃,而新Leader缺少这些条目,若立即提交会导致状态机不一致。因此新Leader会先提交自己任期的条目,再顺带确认旧条目的安全性。

五节点集群的提交过程

以5节点集群A、B、C、D、E为例,A是Leader。客户端写入x=1,A将日志条目追加到索引5。A向B、C、D、E发送AppendEntries,收到B和C的确认,加上自己共3个节点,达到多数派。A立即将本地commitIndex更新为5,应用x=1到状态机并返回客户端成功。随后A通过心跳广播commitIndex=5给所有Follower,它们也会顺序应用。

如果只有B成功而C、D、E超时,则仅有A和B拥有该条目,未过半,A不能提交。此时即使客户端持续等待,Leader也不能返回成功。若A在超时前崩溃,新选举出的Leader可能不包含索引5的条目,该条目会被丢弃。多数派条件保证了已提交记录不会在后续选举中丢失,这是Raft可靠性的核心。

无法提交的场景及其代价

网络分区会破坏多数派。假设A被隔离在少数派侧(只有A和B),它无法联系C、D、E,因此无法提交任何新日志。多数派侧则通过选举产生新Leader并继续处理写入。此时少数派Leader若继续接受请求,请求将永远无法提交,客户端只能超时重试或迁移到多数派侧;系统应当拒绝写以避免脑裂。

另一个边界是旧Leader未提交的条目。新Leader必须持有所有已提交条目,但可能缺少某些只存在于旧Leader上的未提交日志。新Leader不会自动提交这些日志,即使它们曾被复制到少数节点。只有当新任期产生至少一条新提交后,通过日志索引关系间接确认旧条目安全,才能提交。这避免了提交已被覆盖的陈旧记录。

回答前,多想一步

容易答错的地方

复制到一半就算提交
错误。如果复制到的节点数没有超过一半(例如只有两个节点中的Leader和一名Follower),则未达到多数派,条目不能提交。此时Leader崩溃可能丢失该条目。
Follower也能主动提交日志
不。只有Leader知道并推进commitIndex,Follower不能因为自己收到了日志就标记为已提交。Follower必须根据Leader广播的commitIndex来应用日志,否则可能提交被后续覆盖的条目。
试着用自己的话回答

面试官还会怎么问?

如果Leader在提交前崩溃,客户端重试会发生什么?

旧Leader崩溃后,新Leader可能不含该条目,客户端需要重新发送写入请求。只有被多数派复制且由新任期确认的条目才能保证持久。

如何判断一个日志条目已经被提交?

Raft没有对外暴露提交查询,但客户端在收到Leader写响应后即可视为已提交。内部可通过查看Leader的commitIndex来确认。

网络分区时,少数派一侧能继续写吗?

不能。少数派无法凑成多数派,Leader无法提交日志,写请求永远无法获得成功响应。系统设计上优先保证多数派可用,牺牲少数派的可用性。

从一道题,走向一组知识

把知识连起来

一致性与容错

Raft 选主如何保证同一任期只有一个 Leader?

同属「一致性与容错」专题,接着看 Raft 选举安全性 多数派投票 在具体场景中的处理方式。

一致性与容错

Raft 的 PreVote 机制解决什么问题?

同属「一致性与容错」专题,接着看 Raft PreVote 网络隔离 任期膨胀 在具体场景中的处理方式。

参考资料

  • etcd versus other key-value stores

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 提交索引的推进机制
  3. 五节点集群的提交过程
  4. 无法提交的场景及其代价
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑