一文看透常见共识算法:从 2PC 到 PoS 的实践指南

·

共识算法是分布式系统的“最高宪法”。当你听到区块链分布式数据库容灾架构时,背后总有一个能够容忍节点崩溃与网络割裂、却依然保证数据一致性的神奇协议。本文用口语化 + 结构化笔记带你一口气读懂 2PC、3PC、Paxos、Raft、Bully、Gossip、PoW、PoS 等关键词的相同与不同之处,以及如何在现实选型中少走弯路。

两阶段提交:2PC 的双刃剑

关键词:同步阻塞、单点故障、事务一致性

  1. 投票阶段(Voting)
    协调者问所有节点:同不同意提交?
  2. 提交阶段(Commit)

    • 全部回复“同意”→一起提交;
    • 有任一“反对”→回滚。
2PC 简单直白,却天生怕“投票后失联”。协调者掉链子,全集群会阻塞——这就是 fail-stop。再加上需要100 %节点全票赞成,容错性为零。任何运维踩过坑的 DBA 都知道,当天花板级别的交易一致性需求遇到低容错,2PC 只能望而却步。

三阶段提交:3PC 把“阻塞”拆开两步

关键词:PreCommit、超时机制、网络分区


Paxos:学术界的共识圣经

关键词:Quorum、半数投票、数学证明

Paxos 把投票权拆成两组角色:Proposer(提议)+ Acceptor(投票)。


Raft:把 Paxos 白话成“跟随法则”

关键词:Leader、Term、日志同步、奇数节点

  1. 一条日志,一个 Leader

    • Follower 收心跳→崇拜老大。
    • Leader 掉线→Follower 变成 Candidate,用“我 ID 最新”拉票选举新任期 Term。
  2. 过半即胜

    • 写入日志须拿到 Quorum 过半的副本确认——不允许 =50 %,否则脑裂风险骤增。
  3. 节点数目魔法

    • 3 节点:挂 1 台不跪。
    • 4 节点:仍只能挂 1 台,投入产出比负收益。
    • 5 节点:挂 2 台稳如老狗。
Raft 本是工程派的福音,K8s、Etcd、Consul 都把 Raft 当默认骨干,易读易改,却依然不防拜占庭节点伪造消息

Bully:比“嗓门”大

关键词:ID 最大、Leader 选举、瞬时故障恢复

类似 Raft 的主从切换,但选举规则粗暴:谁的节点编号最大谁当王。优点是代码行数极少,缺点是频繁主从切换时可能造成“选举风暴”,ID 低的节点永远抢不过别人,用户体验一落千丈。


Gossip:流言蜚语的传播学

关键词:病毒式扩散、去中心化、最终一致性


PoW:把计算当选票

关键词:哈希、挖矿、抗女巫攻击、能耗高


PoS:股权即权力

关键词:质押、暴力惩罚、节能、出块概率


如何在三大场景选共识算法?真实案例拆解

场景算法 & 配置主要权衡点
关系型事务库2PC+本地持久化强一致但阻塞,适合同城三机房高可用
分布式缓存Raft+3 节点奇数集群易部署、容忍 1 节点故障
公链公项目PoS+128 共识委员会兼顾能耗、去中心化与性能

FAQ:十分钟解决 80 %的疑问

Q1:为什么 Raft 推荐奇数个节点而不是偶数个?
奇数时挂掉的节点数上限不会因为加 1 台而变多,反而能让 Quorum > N/2 永不尴尬。

Q2:3PC 的网络分区为何比 2PC 更容易暴露裂缝?
因为 PreCommit 把“全局统一”这件事检查了两遍;一旦分裂,两边的各自提交票仓数目差距将立刻现形。

Q3:小型团队用 PoW 自建链会有哪些问题?
算力稀缺 → 51 % 攻击成本远低,攻击链分分钟反杀主链。PoW 最好“大流量带来大算力”,否则得不偿失。

Q4:DBC(数据银行云)要 5 个 9 的可用性,怎么配 Raft?
5 节点跨 AZ 部署,允许 2 网停机,另加快照+温备,实现分钟级故障恢复。

Q5:Gossip 在多活卖票业务中行不行?
不行。消息经济舱旅客难免“座位重分配”,必须上位层加幂等号和业务锁才能保证不会超卖。

Q6:PoS 质押就能拿奖励,会不会形成“富者愈富”悖论?
一定程度上会;解决思路是质押上限+随机抽签委员会制(以太坊 2.0 现有模型),降低马太效应。


写在最后

从 1980 代的 2PC 到 2020 后的 PoS,所有共识算法的演进都在回答两大问题:

  1. 网络不可靠、节点爱掉线 的世界里如何共同信任同一份数据
  2. 把这种信任的代价压得足够低,让普通开发者愿意落地。

读完本文,你不仅能一眼区分 2PC 与 3PC、Raft 与 Paxos、PoW 与 PoS 的差异,还能在工作面试或架构评审里自信抛出 Quorum、脑裂、拜占庭容错 等行话。愿你下次遇见“到底选哪个共识算法”的灵魂提问时,能够用一条 Markdown 链接甩给对方:“看这篇就够了”。