第一章主要介绍了计算机系统从集中式向分布式系统演变过程中面临的挑战,并简要介绍了ACID、CAP和BASE等经典分布式理论,主要包含以下内容:

  1. 集中式的特点
  2. 分布式的特点
  3. 分布式环境的各种问题
  4. ACID
  5. 分布式事务
  6. CAP和BASE理论

集中式的特点:部署结构简单(因为基于底层性能卓越的大型主机,不需考虑对服务多个节点的部署,也就不用考虑多个节点之间分布式协调问题)

分布式的特点:

  • 分布性
  • 对等性
  • 并发性
  • 缺乏全局时钟
  • 故障总是会发生

分布式环境的各种问题:

  • 通信异常:主要是因为网络本身的不可靠性
  • 网络分区:当网络发生异常时,导致部分节点之间的网络延时不断增大,最终导致部分节点可以通信,而另一部分节点不能。
  • 三态(成功、失败与超时)
  • 节点故障:组成分布式系统的服务器节点出现宕机或“僵死”现象

事务是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元,狭义上的事务特指数据库事务。

事务有四个特性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称为事务的ACID特性。

  • 原子性(Atomicity):必须是一个原子的操作序列单元,只允许出现两种状态之一(全部成功执行,全部不执行)。
  • 一致性(Consistency):不能破坏数据库数据的完整性和一致性,一个事务在执行前后,数据库必须处于一致性状态。
  • 隔离性(Isolation):相互隔离的,一个事务的执行不能被其他事务干扰。
  • 持久性(Durability):也称为永久性,一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。可以通过数据库备份和恢复来保证持久性。

事务四种隔离级别有未授权读取、授权读取、可重复读取和串行化。

  • 未授权读取(READ UNCOMMITTED):也称为读未提交,允许脏读取。
  • 授权读取(READ COMMITTED):也称为读已提交,允许不可重复读取。
  • 可重复读取(REPEATABLE READ):禁止了不可重复读取和脏读取,但是有可能出现幻影数据(指同样的事务操作,在前后两个两个时间段内执行对同一个数据项的读取,可能出现不一致的结果)。
  • 串行化(SERIALIXABLE):要求所有事务串行执行。

四种隔离级别的对比

隔离级别 脏读 可重复读 幻读
未授权读取 存在 不可以 存在
授权读取 不存在 不可以 存在
可重复读取 不存在 可以 存在
串行化 不存在 可以 不存在

事务隔离级别越高,就越能保证数据的完整性和一致性,但对并发性能的影响也越大。优先考虑将数据库的隔离级别设置为授权读取,能够避免脏读同时保证较好并发性能,会导致不可重复读、虚读和第二类丢失更新等并发问题,在可能出现这类问题的场合中,应主动采用悲观锁和乐观锁进行事务控制。

分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点之上。也可以被定义为一种嵌套型的事务,同时也具有了ACID事务特性。

CAP理论:一个分布式系统不可能同时满足一致性、可用性和分区容错性。

  • 一致性:数据在多个副本之间是否能够保持一致的特性。
  • 可用性:系统提供的服务必须一致处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。
  • 分区容错性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

从CAP定理看出,一个分布式系统不可能同时满足一致性、可用性和分区容错性这三个需求。对于一个分布式系统,分区容错性是一个最基本的需求。

BASE理论:是Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写。核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

  • 基本可用:分布式系统在出现不可预知故障的时候,允许损失部分可用性。
  • 弱状态:也称软状态,允许系统在不同节点的数据副本之间进行数据同步存在延时。
  • 最终一致性:系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。

最终一致性存在以下五类变种:

  1. 因果一致性
  2. 读己之所写
  3. 会话一致性
  4. 单调读一致性
  5. 单调写一致性

总得来说BASE理论面向的是大型高可用可扩展的分布式系统,完全不同于ACID的强一致性模型,而是通过牺牲强一致性来获取可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。实际分布式场景中,ACID特性和BASE理论会结合在一起。