分布式事务

理论

ACID

传统数据库常用的设计理念,追求强一致性模型

  1. 原子性(Atomicity)

    所有的系统都受惠于原子性操作。当我们考虑可用性的时候,没有理由去改变分区两侧操作的原子性。而且满足ACID定义的、高抽象层次的原子操作,实际上会简化分区恢复。

  2. 一致性(Consistency)

    ACID的C指的是事务不能破坏任何数据库规则,如键的唯一性。与之相比,CAP的C仅指单一副本这个意义上的一致性,因此只是ACID一致性约束的一个严格的子集。ACID一致性不可能在分区过程中保持,因此分区恢复时需要重建ACID一致性。推而广之,分区期间也许不可能维持某些不变性约束,所以有必要仔细考虑哪些操作应该禁止,分区后又如何恢复这些不变性约束。

  3. 隔离性(Isolation)

    隔离是CAP理论的核心:如果系统要求ACID隔离性,那么它在分区期间最多可以在分区一侧维持操作。事务的可串行性(serializability)要求全局的通信,因此在分区的情况下不能成立。只要在分区恢复时进行补偿,在分区前后保持一个较弱的正确性定义是可行的。

  4. 持久性(Durability)

    牺牲持久性没有意义,理由和原子性一样,虽然开发者有理由(持久性成本太高)选择BASE风格的软状态来避免实现持久性。这里有一个细节,分区恢复可能因为回退持久性操作,而无意中破坏某项不变性约束。但只要恢复时给定分区两侧的持久性操作历史记录,破坏不变性约束的操作还是可以被检测出来并修正的。通常来讲,让分区两侧的事务都满足ACID特性会使得后续的分区恢复变得更容易,并且为分区恢复时事务的补偿工作奠定了基本的条件。

CAP 理论

定理:任何分布式系统只可同时满足二点,没法三者兼顾。

弱一致性和最终一致性与CAP的C一点关系也没有,因为CAP的C是更新操作完成后,任何节点看到的数据完全一致。 弱一致性和最终一致性本身和CAP的C一致性是违背的。

  1. Consistency(一致性)

    数据一致更新,所有数据变动都是同步的

  2. Availability(可用性)

    每个请求都能接受到一个响应,无论响应成功或失败

  3. Partition tolerance(分区容错性)

    可靠性,系统应该能持续提供服务,即使系统内部有消息丢失(分区)高可用、数据一致是很多系统设计的目标,但是分区又是不可避免的事情

BASE 理论

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

  1. 基本可用(Basically Available)

    基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。

    • 响应时间上的损失
    • 系统功能上的损失. 降级处理
  2. 软状态/柔性事务( Soft State)

    软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时

  3. 最终一致性

    最终一致性强调的是所有的数据副本,在经过一段时间的同步之后,最终都能够达到一个一致的状态。

    在实际工程实践中,最终一致性存在以下五类主要变种。

    • 因果一致性

      因果一致性是指,如果进程A在更新完某个数据项后通知了进程B,那么进程B之后对该数据项的访问都应该能够获取到进程A更新后的最新值,并且如果进程B要对该数据项进行更新操作的话,务必基于进程A更新后的最新值,即不能发生丢失更新情况。与此同时,与进程A无因果关系的进程C的数据访问则没有这样的限制。

    • 读己之所写

      读己之所写是指,进程A更新一个数据项之后,它自己总是能够访问到更新过的最新值,而不会看到旧值。也就是说,对于单个数据获取者而言,其读取到的数据一定不会比自己上次写入的值旧。因此,读己之所写也可以看作是一种特殊的因果一致性。

    • 会话一致性

      会话一致性将对系统数据的访问过程框定在了一个会话当中:系统能保证在同一个有效的会话中实现“读己之所写”的一致性,也就是说,执行更新操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值。

    • 单调读一致性

      单调读一致性是指如果一个进程从系统中读取出一个数据项的某个值后,那么系统对于该进程后续的任何数据访问都不应该返回更旧的值。

    • 单调写一致性

      单调写一致性是指,一个系统需要能够保证来自同一个进程的写操作被顺序地执行。

五分钟法则

如果一条记录频繁被访问,就应该放到内存里,否则的话就应该待在硬盘上按需要再访问。这个临界点就是五分钟。

参考: