第一章 分布式架构

学习《从Paxos到ZooKeeper 分布式一致性原理与实践》,每一章就是一篇随笔
使用 gemini-2.5 或者 claude-4.5 生成

1.1 从集中式到分布式

什么是集中式系统?

想象一下早期的银行系统或者一个单体网站。所有的业务逻辑、数据处理和存储都运行在一台或一组紧密耦合的高性能计算机(通常是大型机或小型机)上。这就是集中式(Centralized) 架构。

  • 特点
    1. 部署简单:所有东西都在一个地方,部署和管理相对直接。
    2. 数据一致性强:因为只有一个数据副本(或在一个地方管理),不存在数据不一致的问题。事务处理非常简单直接。
    3. 技术栈单一:开发、测试、运维都围绕着一个核心系统。

为什么要走向分布式?

随着互联网的爆发式增长,集中式架构的瓶颈变得越来越无法忍受。

  1. 性能瓶颈(Performance Bottleneck)

    • 垂直扩展(Scale-Up)的极限:当用户量和数据量激增时,集中式系统只能通过不断提升单台服务器的硬件性能(更强的CPU、更大的内存、更快的硬盘)来应对,这被称为“垂直扩展”。然而,硬件的发展速度远跟不上业务的增长速度,而且顶级硬件的成本极其高昂,性价比极低。
    • 请求处理能力的上限:一台服务器无论多强大,其CPU、内存、I/O能力终究有物理上限,无法应对海量并发请求。
  2. 可用性瓶颈(Availability Bottleneck)

    • 单点故障(Single Point of Failure, SPOF):在集中式架构中,如果这台核心服务器宕机、网络中断或发生软件故障,整个系统将完全瘫痪。这对需要7x24小时不间断服务的互联网应用来说是致命的。
  3. 成本与灵活性瓶颈(Cost & Flexibility Bottleneck)

    • 高昂的硬件成本:高性能的大型机和商业数据库(如Oracle、DB2)价格不菲。
    • 开发和维护困难:随着业务越来越复杂,单体应用会变得异常臃肿,代码耦合度极高。任何微小的改动都可能牵一发而动全身,导致开发效率低下,上线风险增高。

分布式系统(Distributed System)的诞生

为了解决上述问题,分布式(Distributed)架构应运而生。它的核心思想是水平扩展(Scale-Out)用一堆廉价的普通计算机(PC服务器)组成一个集群,通过软件将它们协同起来,共同对外提供服务,来替代昂贵的大型机。

  • 优势
    1. 高性能与高并发:可以通过简单地增加服务器数量,几乎线性地提升整个系统的处理能力。
    2. 高可用性:集群中的某一台或几台服务器宕机,不会导致整个系统崩溃。系统可以通过故障转移机制,让其他健康的节点接管服务。
    3. 低成本与高灵活性:使用廉价的PC服务器大大降低了硬件成本。同时,可以将复杂的业务拆分成独立的微服务,每个服务可以独立开发、部署和扩展,提升了开发效率和系统灵活性。

分布式带来的新挑战

然而,天下没有免费的午餐。分布式架构在解决旧问题的同时,也引入了全新的、更复杂的挑战,其中最核心的就是一致性问题

  1. 节点通信的不可靠:网络是不可靠的,可能出现延迟、中断甚至分区(一部分节点无法与其他节点通信)。
  2. 数据一致性:数据被分散存储在不同的节点上(数据副本),如何保证在并发读写时,所有节点上的数据都是一致的?这成为了分布式系统设计的核心难题。
  3. 协调的复杂性:谁来决定哪个节点是主节点?事务如何在多个节点上执行?节点故障后如何重新选举?这些都需要复杂的协调机制。

正是为了解决这些挑战,才催生了后面我们要讲的CAP/BASE理论以及Paxos、ZAB等一系列分布式一致性协议。


1.2 从 ACID 到 CAP/BASE:数据一致性模型的演进

ACID:传统数据库的基石

在集中式系统中,我们追求的是强一致性,其黄金标准就是数据库事务的ACID特性。

  • A - 原子性(Atomicity):一个事务中的所有操作,要么全部成功,要么全部失败回滚。不存在中间状态。比如银行转账,扣款和收款必须同时成功或失败。
  • C - 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。例如,A给B转账100元,事务前后两人总金额不变。
  • I - 隔离性(Isolation):多个并发事务之间是相互隔离的,一个事务的执行不应被其他事务干扰。如同每个事务都在一个独立的空间里执行。
  • D - 持久性(Durability):一旦事务提交,其结果就是永久性的,即使系统崩溃也不会丢失。

ACID提供了非常可靠的数据保证,但它要求严格的锁和同步机制,这在分布式环境下会带来巨大的性能开销和可用性问题。

CAP理论:分布式系统的“不可能三角”

2000年,Eric Brewer教授提出了著名的CAP理论,它指出,一个分布式系统不可能同时满足以下三个特性,最多只能满足其中两个

  • C - 一致性(Consistency):这里的“C”特指强一致性。即任何读操作总能读取到最近一次写入的数据。这意味着所有节点在同一时间看到的数据是完全一致的。
  • A - 可用性(Availability):任何(来自非故障节点的)请求都能得到响应(不保证数据最新)。系统必须一直处于可服务状态。
  • P - 分区容错性(Partition Tolerance):当节点间的网络发生分区(即部分节点无法与其他节点通信)时,系统仍然能够继续运行。

为什么三者不可兼得?

我们可以用一个简单的思想实验来证明:

假设一个分布式系统同时满足C、A、P。现在,网络发生了分区(P),集群被分成了G1和G2两个部分。

  1. 此时,一个写请求W到达了G1,并成功写入。根据强一致性(C),这个写入必须立刻同步到G2。但由于网络分区,G1无法联系到G2,同步失败。
  2. 为了保证强一致性(C),G1必须拒绝新的读写请求,或者G2必须停止服务,直到网络恢复。但这又违反了可用性(A)——系统必须对请求做出响应。

这就产生了矛盾。因此,在网络分区发生时,你必须在一致性可用性之间做出选择。

  • 选择CP(放弃A):为了保证数据强一致性,当网络分区发生时,系统会拒绝服务,直到数据在所有副本上同步一致。例如,Zookeeper、HBase就属于这类。
  • 选择AP(放弃C):为了保证高可用性,即使网络分区,每个分区内的节点依然可以对外提供服务(通常是读和写),但这可能导致不同分区的数据不一致。当网络恢复后,再通过某种机制(如冲突解决)来使数据最终达到一致。大多数NoSQL数据库(如Cassandra、DynamoDB)和很多互联网应用都采用这种策略。
  • 选择CA(放弃P):这意味着你不允许网络分区发生。这在分布式系统中是不现实的,因为网络故障是常态。所以,现代分布式系统设计必须保证P(分区容错性)。

BASE理论:对AP架构的实践总结

既然在很多场景下我们选择了AP(牺牲强一致性,保证可用性),那么数据一致性该如何保证呢?BASE理论就是对这一思想的总结。它强调的是最终一致性

  • BA - 基本可用(Basically Available):系统在出现故障时,允许损失部分可用性。例如,响应时间变长,或者部分功能降级。
  • S - 软状态(Soft State):允许系统中的数据存在中间状态,并且这个状态不影响系统的整体可用性。即数据可以暂时不同步。
  • E - 最终一致性(Eventually Consistent):系统中的所有数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。它不要求“立即”一致,但保证“最终”会一致。

ACID vs. BASE

  • ACID是面向传统数据库的悲观锁思想,追求强一致性,严格保证数据的正确性。
  • BASE是面向高可用分布式系统的乐观锁思想,通过牺牲短暂的强一致性来换取更高的可用性和性能,并相信数据最终会通过同步机制达到一致。

总结:从集中式到分布式,是从追求单机极致性能到追求集群整体能力的转变。而从ACID到CAP/BASE,则是数据一致性模型为了适应分布式环境,从追求“强一致性”到在“一致性”与“可用性”之间做权衡,并接受“最终一致性”的理念演进。理解这两个转变,是掌握一切分布式技术的思想基础。

posted @ 2026-01-31 13:03  寻找梦想的大熊  阅读(4)  评论(0)    收藏  举报