Skip to content

共识算法

共识算法解决的是在分布式系统中,多个节点如何对某个值达成一致的问题。共识算法是分布式锁、配置管理、元数据管理的基础。

共识问题

共识问题的定义:多个节点提出提案,如何在这些提案中选出一个,使得所有节点都认同这个选择。更形式化地说,共识算法需要满足安全性(Safety)和活性(Liveness)。

安全性:所有节点对达成一致的值不会产生分歧。所有正常工作的节点必须做出相同的决策。

活性:最终一定会达成一致。算法不会无限期地处于协商状态,必须在有限时间内做出决策。

容错性:即使部分节点故障或网络异常,算法仍能继续工作。容错的节点数量决定了算法的鲁棒性。

FLP 不可能原理

FLP 不可能原理指出:在异步网络中(消息延迟无上限),即使只有一个节点故障,也不存在能够保证一致性和终止性的共识算法。

FLP 的意义:告诉我们完美的一致性算法在异步网络中不存在。实际系统通过引入超时、心跳等机制,将异步网络转换为同步网络,从而实现共识。

共识算法的分类

按容错类型分类

崩溃容错:假设节点只会崩溃,不会作恶。大多数共识算法都是 Crach Fault-tolerant,如 Paxos、Raft。

拜占庭容错:假设节点可能作恶(发送错误消息、篡改数据)。拜占庭容错算法需要容忍恶意节点,如 PBFT(Practical Byzantine Fault Tolerance)。

按决策方式分类

投票制:节点投票,多数派决定。如 Raft、ZAB。

领导者驱动:由领导者提出提案,其他节点投票。如 Multi-Paxos。

链式:按顺序执行操作,每个操作依赖前一个操作。如 Hashgraph。

主流共识算法

Paxos:Leslie Lamport 提出,是第一个解决共识问题的算法。Paxos 理论完备但实现复杂,理解困难。

Raft:Diego Ongaro 提出,目标是易于理解。Raft 将共识分解为领导者选举、日志复制、安全性三个子问题,易于理解和实现。

ZAB:ZooKeeper 的原子广播协议,用于 ZooKeeper 的元数据管理。ZAB 类似 Raft,有领导者选举和消息广播两个阶段。

PBFT:实用的拜占庭容错算法,可以容忍恶意节点。PBFT 需要至少 3f+1 个节点才能容忍 f 个恶意节点。

PoW:工作量证明,比特币使用的共识算法。通过算力竞争决定记账权,浪费能源但简单有效。

PoS:权益证明,以太坊 2.0 使用的共识算法。根据持有币的数量和时间决定记账权,比 PoW 节能。

共识算法的应用

分布式锁:通过共识算法选举锁的持有者。如 etcd 的分布式锁、ZooKeeper 的分布式锁。

配置管理:通过共识算法保证配置的一致性。如 Spring Cloud Config 使用 etcd 存储配置。

元数据管理:通过共识算法管理集群元数据。如 HDFS 的 NameNode、Kafka 的 Controller。

日志复制:通过共识算法保证日志的一致性。如 Kafka 的副本同步、MySQL 的 Binlog 复制。

共识算法的选择

选择共识算法需要考虑:容错类型(是否需要拜占庭容错)、性能(吞吐量、延迟)、易用性(是否易于理解和实现)、生态(是否有成熟的实现)。

大多数场景选择 Raft,因为它易于理解、性能好、生态完善。拜占庭场景选择 PBFT。区块链场景选择 PoW 或 PoS。

共识算法是分布式系统的基础,理解共识算法的原理和权衡,有助于设计合适的分布式架构。