MST

星途 面试题库

面试题:分布式系统中 ACID 特性对分布式数据库架构的深度影响

以你所熟悉的一种分布式数据库(如 Cassandra、TiDB 等)为例,深入分析 ACID 特性是如何影响其整体架构设计的,包括数据存储结构、副本管理、事务处理机制等方面,同时说明该数据库为满足 ACID 特性做出了哪些妥协或创新。
46.4万 热度难度
后端开发分布式系统

知识考点

AI 面试

面试题答案

一键面试

以 Cassandra 为例:

1. ACID 特性对整体架构设计的影响

数据存储结构

  • 原子性:Cassandra 采用基于日志结构合并树(LSM - Tree)的存储结构。写入首先进入 Commit Log 和 Memtable,这种结构保证了写入操作的原子性。Commit Log 记录所有写入操作,确保即使系统崩溃,也能恢复未完成的操作。当 Memtable 达到一定阈值后,会刷写到磁盘形成 SSTable。
  • 一致性:Cassandra 数据以分区(Partition)为单位存储,每个分区包含多个副本。为了保证一致性,副本之间需要同步数据。采用 gossip 协议来传播节点状态信息,使得各节点能知晓集群状态。在读取数据时,通过配置一致性级别(如 ONE、QUORUM、ALL 等)来决定读取到的数据一致性程度。高一致性级别需要更多副本响应,从而保证读取到最新数据。
  • 隔离性:Cassandra 早期对事务支持有限,在隔离性方面较弱。它默认的读操作可能会读到脏数据。不过,随着版本发展,通过轻量级事务(LWT)机制,实现了类似行级的隔离,在一定程度上满足隔离性要求。对于 LWT,在写入时通过 Paxos 协议来保证操作的原子性和隔离性。
  • 持久性:Commit Log 确保了持久性。即使系统崩溃,重启后可以根据 Commit Log 恢复未持久化到 SSTable 的数据。同时,多副本机制也增强了持久性,副本存储在不同节点,降低数据丢失风险。

副本管理

  • 原子性:副本复制过程中,Cassandra 使用 Anti - Entropy 机制保证数据一致性和原子性。如果发现副本间数据不一致,通过 Merkle 树等技术识别差异并进行修复,确保所有副本的数据修改是原子性的。
  • 一致性:副本管理的核心是保证各副本数据一致。采用复制因子(Replication Factor)来定义副本数量,通过一致性协议(如 gossip 协议结合 hinted handoff 等)在副本间同步数据。在写入时,根据一致性级别要求,确保相应数量的副本写入成功,从而保证数据一致性。
  • 隔离性:副本间操作相互独立,在更新副本数据时,通过 LWT 保证每个副本的更新操作具有一定隔离性,避免并发更新导致的数据冲突。
  • 持久性:多副本存储提高了数据的持久性。每个副本都存储在不同节点,即使部分节点故障,只要还有副本存在,数据就不会丢失。同时,写入操作会持久化到多个副本,进一步保证数据的持久性。

事务处理机制

  • 原子性:轻量级事务(LWT)利用 Paxos 协议实现原子性。对同一行数据的操作要么全部成功,要么全部失败。在操作时,通过比较和设置(Compare - And - Set,CAS)机制,确保操作的原子性。
  • 一致性:LWT 通过 Paxos 协议在多个副本间达成一致,保证事务执行结果在所有副本上的一致性。
  • 隔离性:LWT 提供行级隔离,同一行数据的并发事务操作不会相互干扰。不同行的事务操作可以并行执行,提高系统并发性能。
  • 持久性:Commit Log 保证了事务操作的持久性。在事务提交前,相关操作记录会写入 Commit Log,确保即使系统崩溃,事务也能恢复。

2. 为满足 ACID 特性做出的妥协或创新

妥协

  • 性能与一致性的平衡:为了保证一致性,高一致性级别(如 ALL)会等待所有副本响应,这可能导致写入性能下降。在高并发写入场景下,需要在一致性和性能之间做出权衡,降低一致性级别来提高写入性能。
  • 事务支持有限:传统关系型数据库的全功能事务在 Cassandra 中实现困难。LWT 仅支持行级事务,对于跨多行或跨表的复杂事务支持不足,这限制了其在一些需要复杂事务场景的应用。

创新

  • 灵活的一致性级别:Cassandra 提供多种一致性级别,用户可以根据业务需求灵活选择。这种方式在不同应用场景下既能保证一定的数据一致性,又能兼顾性能,是一种创新的设计。
  • 基于 gossip 的副本管理:gossip 协议使得 Cassandra 集群能够快速发现节点状态变化,高效传播信息,从而及时同步副本数据。这种去中心化的副本管理方式,相比传统集中式管理更具扩展性和容错性。