Jorgen's blog Jorgen's blog
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

jorgen

Love it, make mistakes, learn, keep grinding.
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • CAP & BASE理论
  • Raft算法:理解分布式共识
  • 分布式一致性协议:Paxos与Raft
  • 分布式一致性协议:Paxos与Raft算法详解
    • 前言
    • 一致性的挑战
    • Paxos协议
      • Paxos的角色
      • Paxos的两个阶段
      • 第一阶段:准备阶段(Prepare)
      • 第二阶段:接受阶段(Accept)
      • Paxos的局限性
    • Raft算法
      • Raft的核心思想
      • Raft的角色
      • 领导人选举
      • 日志复制
      • 安全性保证
    • Paxos与Raft的比较
    • 实际应用中的选择
    • 结语
  • 分布式一致性协议:Raft算法详解
  • 分布式一致性协议:从理论到实践
  • 分布式一致性算法:Paxos与Raft详解
  • 分布式一致性算法:Raft详解
  • 分布式一致性算法:从Paxos到Raft
  • 分布式一致性算法:从理论到实践
  • 分布式共识算法:Raft详解
  • 分布式系统的一致性协议:Paxos与Raft
  • 深入理解Raft一致性算法
  • 分布式一致性协议-ZAB详解
  • 分布式事务:从理论到实践
  • 分布式系统的容错机制与故障恢复
  • 拜占庭将军问题与PBFT算法详解
  • 分布式锁:原理、实现与实战
  • 分布式Gossip协议:原理、应用与实现
  • 分布式系统中的时钟问题:从物理时钟到逻辑时钟
  • 分布式系统的负载均衡:原理、算法与实践
  • 分布式系统中的服务发现:原理、实现与实践
  • 分布式数据分区与分片策略:构建可扩展系统的基石
  • 分布式追踪-原理、技术与实践
  • 分布式消息队列-原理、实现与应用
  • 分布式缓存-原理-策略与实践
  • 分布式系统中的安全机制-构建可信的分布式环境
  • 分布式协调服务-ZooKeeper与etcd详解
  • 分布式系统的容错与故障检测机制
  • 分布式系统的状态管理-策略-模型与实践
  • distributed_system
Jorgen
2023-11-15
目录

分布式一致性协议:Paxos与Raft算法详解

# 前言

在分布式系统的世界里,一致性是一个永恒的话题。我们之前已经了解了CAP定理和BASE理论,知道了分布式系统需要在一致性、可用性和分区容错性之间做出权衡。但是,理论归理论,在实际的分布式系统中,我们究竟是如何实现一致性的呢?

今天,我们就来深入探讨分布式系统中两个最重要的一致性协议:Paxos和Raft。这两个协议不仅是学术研究的热点,也是许多实际分布式系统的基础。

提示

一致性协议是分布式系统的核心,理解它们对于构建可靠的分布式系统至关重要。

# 一致性的挑战

在单机系统中,数据一致性相对容易实现。但在分布式系统中,由于网络延迟、节点故障、消息丢失等因素,实现一致性变得异常复杂。

假设我们有一个简单的场景:在多个节点上维护一个共享的计数器。当某个节点收到增加计数器的请求时,它需要确保所有节点都同意这个增加操作,并且最终所有节点的计数值都相同。

这看似简单,但在实际系统中会遇到各种问题:

  • 节点之间可能无法通信(网络分区)
  • 节点可能随时崩溃
  • 消息可能延迟或丢失
  • 多个节点可能同时收到冲突的请求

为了解决这些问题,科学家们提出了各种一致性协议,其中Paxos和Raft是最具代表性的两个。

# Paxos协议

Paxos协议由Leslie Lamport于1990年提出,是第一个被证明的正确性可以得到保证的一致性协议。尽管Paxos在理论上很完美,但在实际应用中却因其复杂性和难以理解而备受争议。

# Paxos的角色

Paxos协议中有三种角色:

  1. Proposer(提议者):提出提案(包括值和编号)
  2. Acceptor(接受者):接受或拒绝提案
  3. Learner(学习者):学习被接受的提案

# Paxos的两个阶段

Paxos协议主要分为两个阶段:

# 第一阶段:准备阶段(Prepare)

  1. Proposer选择一个提案编号n,向大多数Acceptor发送prepare(n)消息
  2. Acceptor收到prepare(n)消息后:
    • 如果n大于它已经响应过的任何提案编号,则回复promise(n),承诺不再接受编号小于n的提案
    • 同时,如果它已经接受过某个编号小于n的提案,则将该提案的信息一并发送

# 第二阶段:接受阶段(Accept)

  1. 如果Proposer收到大多数Acceptor的promise(n)响应,就可以发送accept(n, v)消息
    • v可以是它自己的值,或者是某个Acceptor在promise中返回的值
  2. Acceptor收到accept(n, v)消息后:
    • 如果n是它承诺接受的最大的编号之一,则接受该提案并回复accepted(n, v)
  3. 如果Proposer收到大多数Acceptor的accepted(n, v)响应,则提案v被选定为值

# Paxos的局限性

尽管Paxos在理论上很完美,但它存在一些明显的局限性:

  • 难以理解:Paxos的描述非常抽象,实现起来也很复杂
  • 活锁问题:多个Proposer可能同时提出提案,导致系统无法推进
  • 缺乏实际应用:虽然学术界广泛研究,但实际系统中很少直接使用Paxos

# Raft算法

为了解决Paxos的复杂性问题,Diego Ongaro和John Ousterhout在2013年提出了Raft算法。Raft的设计目标是提供一种更易于理解和实现的一致性协议。

# Raft的核心思想

Raft将一致性问题分解为几个相对独立的子问题:

  1. 领导人选举:在集群中选举一个领导人
  2. 日志复制:领导人将日志复制到其他节点
  3. 安全性:确保在任何情况下系统状态的一致性

# Raft的角色

Raft中有三种角色:

  1. Leader(领导者):处理所有客户端请求,负责日志复制
  2. Follower(跟随者):被动接收来自领导人的日志,不处理客户端请求
  3. Candidate(候选人):在领导人选举中,跟随者可以转变为候选人

# 领导人选举

Raft的领导人选举过程如下:

  1. 系统初始时,所有节点都是Follower
  2. 如果一个Follower在一定时间内没有收到领导人的心跳,它会转变为Candidate
  3. Candidate向其他节点发送RequestVote请求
  4. 其他节点根据Candidate的日志情况决定是否投票
  5. 如果Candidate获得大多数投票,它就成为新的Leader
  6. 如果多个Candidate同时存在,可能会导致再次选举,直到选出Leader

# 日志复制

一旦Leader被选出,它就开始处理客户端请求并复制日志:

  1. Leader将客户端请求作为新的条目添加到自己的日志中
  2. Leader将该条目通过AppendEntries RPC发送到所有Follower
  3. Follower收到条目后,将其添加到自己的日志中并回复
  4. 当Leader收到大多数Follower的确认后,该条目就被认为是"已提交"的
  5. Leader通知所有Follower哪些条目已被提交,Follower将这些条目应用到自己的状态机中

# 安全性保证

Raft通过以下机制确保系统的安全性:

  • 选举限制:只有包含所有已提交日志的节点才能成为Leader
  • 日志匹配:如果两个日志包含相同的索引和任期号,那么它们前面的所有日志也相同
  • 领导人完全性:Leader永远不会覆盖或删除自己的日志

# Paxos与Raft的比较

特性 Paxos Raft
设计目标 理论正确性 可理解性和可实现性
复杂度 高,难以理解 低,结构清晰
角色 Proposer, Acceptor, Learner Leader, Follower, Candidate
领导人选举 不明确,需要额外实现 明确的选举机制
实际应用 很少直接使用 被许多系统采用(如etcd, Consul)
性能 相对较低 通过优化可以达到较高性能

# 实际应用中的选择

在选择一致性协议时,我们需要考虑以下几个因素:

  1. 可理解性:Raft由于其清晰的结构和明确的流程,更容易被团队理解和实现
  2. 性能需求:对于高性能要求的场景,可能需要考虑优化后的Paxos变种
  3. 生态系统:Raft有更多的开源实现和工具支持
  4. 特殊需求:某些特殊场景可能需要Paxos的灵活性

目前,大多数新系统都倾向于选择Raft或其变种,如etcd、Consul、TiDB等都使用了Raft作为一致性协议。

# 结语

分布式一致性协议是构建可靠分布式系统的基石。Paxos作为理论的先驱,为一致性研究奠定了基础;而Raft则以其清晰的设计和良好的可理解性,在实际系统中得到了广泛应用。

理解这些协议不仅有助于我们更好地使用现有的分布式系统,也能为我们在设计和实现自己的分布式系统时提供宝贵的参考。

在分布式系统的世界里,没有银弹,只有不断权衡和选择。选择合适的一致性协议,是构建可靠系统的第一步。

— Jorgen

#一致性协议#Paxos#Raft#分布式系统
上次更新: 2026/01/28, 10:42:53
分布式一致性协议:Paxos与Raft
分布式一致性协议:Raft算法详解

← 分布式一致性协议:Paxos与Raft 分布式一致性协议:Raft算法详解→

最近更新
01
LLM
01-30
02
intro
01-30
03
intro
01-30
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jorgen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式