CAP定理:
指出在一个异步网络环境中,对于一个分布式读写存储(Read-WriteStorage)系统来说,只能满足以下三项中的两项,而不可能满足全部三项:
一致性(Consistency):客户端访问所有节点,返回的都是同一份最新的数据。
可用性(Availability):每次请求都能够获取非错误响应,但不保证最新数据。
分区容错性(Partition Tolerance):节点之间因为网络波动导致信息丢失,系统仍能继续正常工作。
例如,对于需要强一致性的金融交易系统,可能会选择CP模型;而对于需要高可用性的社交媒体平台,则可能选择AP模型。
一致性,这里指线性一致性
PACELC定理:
此定理是对cap定理的扩展,CAP定理忽略分布式系统中的延迟影响是一个重大疏忽,因为延迟在系统运行过程中时刻存在,而网络分区不会一直存在。
PACELC定理指出,当存在网络分区(P)时,系统必须在可用性(A)和一致性(C)之间做出选择。当系统没有分区(E),即正常运行时,系统需要在延迟(Latency)和一致性(C)之间做出权衡。
BASE:
BasicallyAvailable, SoftState, Eventually Consistent
BASE即基本可用、软状态和最终一致性的首字母缩写,目的是抓住当时逐渐成型的一些针对高可用性的设计思路,其中的软状态和最终一致性主要指存在网络分区的情况,为了高可用性,舍弃强一致性,选择一致性更弱的最终一致性。
一致性模型
线性一致性
cap中的一致性指线性一致性,线性一致性也称为强一致性,(强一致性:所有节点在同一时间看到的数据都是相同的。)
作者给出严格定义是:给定一个执行历史,执行历史根据并发操作可以扩展为多个顺序历史(SequentialHistory),只要从中找到一个合法的顺序历史,那么该执行历史就是线性一致性的。
就是,当write(1)和write(3)并发时,后面要read(1),那么就要保证write(3),write(1)然后read(1)这样是合法的。
顺序一致性
只要求同一个客户端(或进程)的操作在排序后保持先后顺序不变,但不同客户端(或进程)之间的先后顺序是可以任意改变的。
因果一致性
最终一致性
只要系统最终能够达到一个稳定的状态。
隔离级别
读未提交(Read Uncommitted):
在这个级别上,事务可以读取到其他未提交事务的修改。这意味着可能会读到脏数据,因为这些修改可能会被回滚。
脏读:一个事务读取到另一个事务未提交的数据。
读已提交(Read Committed):
事务只能读取到其他事务已经提交的修改。这是大多数数据库系统的默认隔离级别。
脏读被解决,但仍然存在不可重复读和幻读的问题。
不可重复读:一个事务在两次执行相同的查询时,可能会得到不同的结果,因为其他事务的提交改变了数据。
幻读:在同一个事务中,相同条件下的查询可能会得到不同的记录数,因为其他事务插入或删除了记录。
可重复读(Repeatable Read):
事务在整个过程中可以重复读取到相同的数据行,即使其他事务提交了新的数据修改。这通常通过锁定读取的数据行来实现。
解决了脏读和不可重复读的问题,但幻读仍然可能发生。
注意:在某些数据库系统中,如MySQL的InnoDB引擎,可重复读隔离级别实际上也解决了幻读的问题。
串行化(Serializable):
最高的隔离级别,事务会依次逐个执行,模拟了没有并发执行的环境。这样可以避免脏读、不可重复读和幻读,但会大幅降低并发性能。
事务在执行过程中会锁定涉及的所有数据,直到事务完成。
一致性和隔离级别对比
一致性模型和隔离级别的相同点是,它们本质上都是用来描述系统能够容忍哪些行为,不能容忍哪些异常行为,更严格的一致性模型或隔离级别意味着更少的异常行为,但以降低系统性能和可用性为代价。
一致性模型和隔离级别的一个主要区别是,一致性模型适用于单个操作对象,比如单个数据项或单个变量的读写,该数据可能存在多个副本;而隔离级别通常涉及多个操作对象,比如在并发事务中修改多个数据。