DOIFOR技术从ACID到CAP的联想
DOIFOR技术从ACID到CAP的联想

从ACID到CAP的联想

技术编程思想

有些知识点就是需要串起来理解才能更加深刻。

ACID

  • A(Atomicity)原子性,说的就是事务。针对一个事务要么commit,要么rollback,不能有中间态。那么读未提交是否就违反了原子性?

首先答案是读未提交不违反原子性。读未提交是一种事务隔离级别,主要描述的是多个事物之间的可见性问题,即其他事务可以看到当前事务的未提交状态,但并未破坏当前事务状态。原子性说的是同一个事务的状态要么是commit,要么是rollback,主要范围是同一个事务,并不保证对其他事务的可见性,仅保证同一事物不被破坏。所以答案是不违反。

  • C(Consistency)一致性,事务前后均满足业务规则和完整性约束。

  • I(Isolation)隔离性,多个事务之间相互隔离,如同独立使用数据库一般。这里主要通过事务隔离级别实现:

    • 读未提交
    • 读已提交
    • 可重复读
    • 串行化

D (Durability)持久性,数据一旦commit,就应该被永久的存储下来。主要用过日志(redo,wal)的方式实现。

关系型数据库,比如Mysql,Postgresql,Oracle等都完整的实现了ACID。

CAP

说起ACID总会想起CAP,其主要原因是CAP中也有一个C,而且都是一致性的意思。

CAP是分布式系统的核心理论原则,主要讲的是这三个原则不可能同时存在。

  • C (Consistency)一致性,所有节点数据任意时刻看到的都是一样的。这个跟ACID的一致性有所差异,ACID讲的是事务前后,CAP讲的是多个节点之前任意时刻都一样。
  • A (Availability)可用性,在整个系统运行期间,对用户的请求总是有响应的,不存在超时或者报错的情况。
  • P(Partition tolerance)分区容错性,这是分布式系统的核心前提,必须满足。

那么是什么是分区容错性?分区是指节点间因为网络等原因无法通行,进行形成分区。分布式系统需要允许这种分区的情况存在,不能满足分区容错性的系统只能是单点应用,因此说分布式系统必须要满足分区容错性。

那么分布式系统都是通过什么手段来满足分区容错性的呢?

  • 首先我们能想到的集群部署,异地多活,采用主从、复制等方式在多个地方部署相同服务,以防止某一个节点无法通信的情况。
  • 接着是无中心架构,比如说redis的cluster就是一直中五中心的集群方式,某一个节点坏掉只影响一部分数据,如果该部分有从节点,立即换上即可。
  • 实时健康状态监测,及时发现异常节点以及自动更换新节点
  • 还有就是最终一致性,在AP系统中,优先保证可用性,使用消息队列等保证最终一致性。

BASE

BASE是AP系统的一种扩展,主要增加了:

  • 基本可用 (Basically Available), 在系统故障时,允许牺牲部分功能和特性保证系统核心功能可用。主要手段是流量削峰、功能降级、延迟响应等。
  • 软状态 (Soft State),允许数据存在中间状态,即不一致的情况,这种情况不可影响系统运行。后续通过一些手段逐渐同步。主要实现手段使分布式缓存、异步消息系统。
  • 最终一致性 (Eventually Consistent),经过一段时间后,所有副本数据达到一致的状态。主要实现手段版本号机制、向量时钟、异步复制等。

主要思想是牺牲实时一致性,以最终一致性保证AP要素。

最终一致性还可以分为:

  • 因果一致性:有因果关系的操作顺序一致。
  • 读自写一致性:用户读取自己写的数据一定是最新的。
  • 单调读一致性:用户不可读取之前已经读取的数据。

关于如何保障最终一致性的问题有些复杂,需要再学习学习。

最后

突然好像有些明白了为什么主流的关系型数据都没有做成分布式数据库系统,最多只能主从、异步复制等机制。

因为分布式系统无法同时满足CAP,但是ACID中的事务要求的强一致性和原子性在分布式系统中难以实现。因此分布式数据库也必须要面对AP还是CP的选择问题。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注