《从Paxos到Zookeeper》读书笔记

从集中式到分布式

集中式系统指的是由一台或多台主计算机组成的系统,所有数据集中存储,系统功能由中心节点处理。其主要特点是:

  • 部署结构简单:无需多个节点协作,依赖主机的卓越性能。

分布式系统是指硬件或软件组件分布在不同的网络计算机上,通过消息传递进行通信和协调。分布式系统的特点包括:

  • 分布性:计算机可以随意分布在不同空间。
  • 对等性:没有主从之分,所有节点平等。
  • 并发性:多个节点可能并发操作共享资源,挑战较大。
  • 缺乏全局时钟:没有全局时序,事件顺序难以定义。
  • 故障不可避免:节点可能发生各种故障。

同时分布式系统面临许多挑战:

  • 通信异常:网络不可靠,延时远高于单机操作。
  • 网络分区:部分节点无法通信,导致“脑裂”现象,挑战一致性。
  • 三态问题:分布式请求可能会有成功、失败或超时的结果,增加了不确定性。
  • 节点故障:服务器节点宕机或“僵死”是常见问题

从ACID到CAP/BASE

事务 指的是对系统中数据的一系列操作集合,详见 事务 这一文所述。

事务具有四个特征,俗称为 ACID :

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

随着分布式计算的发展,事务在分布式计算领域中也得到了广泛
的应用。在单机数据库中,我们很容易能够实现一套满足 ACID 特性的事务处理系统,但在分布式数据库中,数据分散在各台不同的机器上,如何对这些数据进行分布式的事务处理具有非常大的挑战。

我们可以设想一个最典型的分布式事务场景:一个跨银行的转账操作涉及调用两个异地的银行服务,其中一个是本地银行提供的取款服务,另一个则是目标银行提供的存款服务,这两个服务本身是无状态并且是互相独立的,共同构成了一个完整的分布式事务。如果从本地银行取款成功,但是因为某种原因存款服务失败了,那么就必须回滚到取款前的状态,否则用户可能会发现自己的钱不翼而飞了。

因此,一个分布式事务可以看作是由多个分布式的操作序列组成的,例如上面例子中的取款服务和存款服务,通常可以把这一系列分布式的操作序列称为子事务。但由于在分布式事务中,各个子事务的执行是分布式的,因此要实现一种能够保证ACID特性的分布式事务处理系统就显得格外复杂。

CAP和BASE理论

对于本地事务处理或者是集中式的事务处理系统,可以通过 ACID 模型来保证数据的严格一致性。但是对于一个高访问量、高并发的互联网分布式系统来说,如果期望实现一套严格满足 ACID 特性的分布式事务,很可能出现的情况就是在系统的可用性和严格一致性之间出现冲突。

CAP 理论包括:

  • 一致性(C:Consistency)
  • 可用性(A:Availability)
  • 分区容错性(P:Partition tolerance)

分区容错性一般是分布式系统的基本需求,因为既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点,此原则的含义在与当发生网络分区时,系统必须在一致性与可用性之间做出抉择。

一致性

在分布式系统中,一致性是指多个副本之间的数据保持一致的特性。当一个系统在一致的状态下进行数据更新操作时,系统必须确保所有副本中的数据也同步更新。

可用性

可用性是指系统的服务必须一直保持可用状态,用户的每次请求在有限的时间内都应返回结果。这里的关键要素是:

  • 有限的时间
  • 返回结果:系统必须返回明确的处理结果,成功或失败。

分区容错性

分区容错性是指当分布式系统的网络分区发生故障时,系统仍然能够保证对外提供一致性和可用性的服务。网络分区通常指由于某些原因导致分布式系统中的子网络之间无法通信,但各个子网络的内部通信是正常的。

BASE理论

BASE 是对 CAP 中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,基于 CAP 定理逐步演化而来的,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

BASE 理论包括:

  • Basically Available(基本可用)
  • Soft state(软状态)
  • Eventually consistent (最终一致性)

基本可用

基本可用是指在分布式系统中,当系统出现故障或异常时,允许部分可用性损失,但不会完全不可用。主要表现为:

  • 响应时间的损失:系统出现故障时,响应时间可能比平时延长。例如,搜索引擎正常响应时间为0.5秒,但在部分机房断电或断网时,响应时间可能增加到1~2秒。
  • 功能的损失:在电商网站的高峰期,为保障系统稳定性,部分用户可能会被引导到降级页面,而无法完成正常的购物操作。

弱状态

弱状态指允许系统在数据同步的过程中存在中间状态。这些中间状态不会影响系统整体的可用性,意味着在数据副本间同步时可以有一定延迟,而不需要立刻达到一致。

最终一致性

最终一致性是一种弱一致性模型,强调数据副本在经过一定时间的同步后,最终能达到一致的状态。而不需要在每次数据更新后立即保持强一致性。

值得说明的一点是,最终一致性有五类变种,每种变种在不同常见下适用,以平衡数据一致性和系统性能。

  • 因果一致性(Causal Consistency)
    如果进程A更新了某个数据并通知了进程B,那么进程B之后对该数据的访问必须基于进程A更新后的最新值,且不能丢失进程A的更新。然而,与进程A无因果关系的进程C则没有此限制。

  • 读自己写(Read Your Writes)
    这是指一个进程更新数据后,自己总是能够读取到更新后的最新值,不会看到旧值。这是一种特殊的因果一致性,保证了更新者自身的读取一致性。

  • 会话一致性(Session Consistency)
    在一个会话期间,系统保证该客户端能够读取到自己写入的最新数据。这种一致性限制在单一会话内,确保在会话中读取数据的连贯性。

  • 单调读(Monotonic Read Consistency)
    该一致性保证一个进程在读取了某个数据项的最新值后,后续读取操作不会返回比之前更新的更旧的数据。这种模型避免了读取倒退的情况。

  • 单调写(Monotonic Write Consistency)
    系统保证同一个进程的写操作按顺序执行,避免写入顺序混乱,从而保持数据更新的一致性。

总的来说,BASE 理论面向的是大型高可用可扩展的分布式系统,和传统事务的 ACID特性是相反的,它完全不同于ACID的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。但同时,在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特性与BASE理论往往又会结合在一起使用。