1.ACID
ACID是传统的单机事务模型,已经很难胜任现代高访问、高并发的分布式互联网系统。
- A-原子性
原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做;如果事务中一个sql语句执行失败,则已执行的 语句也必须回滚,数据库退回到事务前的状态。
InnoDB实现原子性的关键——undo log(回滚日志):当事务对数据库进行修改时,InnoDB会生成对应的undo log;如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。
- C-一致性
一致性是指事务执行结束后,数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态。数据库的完整性约束包括但不限于:实体完整性(如行的主键存在且唯一)、列完整性(如字段的类型、大小、长度要符合要求)、外键约束、用户自定义完整性(如转账前后,两个账户余额的和应该不变)。
- I-隔离性
隔离性是指,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。严格的隔离性,对应了事务隔离级别中的Serializable (可串行化),但实际应用中出于性能方面的考虑很少会使用可串行化。
与原子性、持久性侧重于研究事务本身不同,隔离性研究的是不同事务之间的相互影响。
- 考虑最简单的读操作和写操作:
- 写操作(一个事务)对写操作(另一个事务)的影响:锁机制保证隔离性
- 写操作(一个事务)对读操作(另一个事务)的影响:MVCC保证隔离性
- D-持久性
持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
InnoDB实现持久性的关键——redo log(重做日志):当数据修改时,除了修改缓存中的数据,还会在redo log记录这次操作;当事务提交时,会调用fsync接口对redo log进行刷盘。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复。redo log采用的是WAL(Write-ahead logging,预写式日志),所有修改先写入日志,再更新到Buffer Pool,保证了数据不会因MySQL宕机而丢失,从而满足了持久性要求。
redo log是写磁盘操作,但其实很快,主要两个原因:
- 写redo log是追加操作,属于顺序IO。
- redo log中只包含真正需要写入的部分,无效IO大大减少。
2.CAP
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
- C-一致性
一致性是指数据在多个副本中能保持一致的状态。
- 强一致性:要求任何读取操作都能读取到最新的值,也就是要求任何写入操作立即同步给所有进程。
- 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不久承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态。
- 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。
- A-可用性
整个系统在任何时刻都能提供可用的服务,在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。
- P-分区容错性
大多数分布式系统都存在多个子网络,每个子网络就叫做一个区(partition),分区容错的意思是,区间通信可能会失败。比如机器A和机器B在不同的机房,这就是两个区,它们之间可能无法通信。一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。
一般来说分布式集群都会保证P优先,即集群部分节点坏死不影响整个集群的使用,然后再去追求C和A。因为如果放弃P——分区可用性,那不如就直接使用多个传统数据库了。事实上,很多微服务分库分表就是这个道理。
3.BASE
BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。BASE是包括:基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。
- 基本可用(Basically Available)
分布式系统在出现故障的时候,允许损失部分可用性,但保证核心可用。
电商活动促销时,应对激增的用户量,系统无法完全正常响应,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务,这就是损失部分可用性的体现。
- 软状态(Soft State)
允许分布式系统存在中间状态,而该中间状态不会影响系统整体可用性。
分布式存储中一般数据至少保存三个副本,允许不同节点间副本同步的延时,这其实就是软状态的体现。mysql replication的异步复制也是软状态的一种体现。
- 最终一致性(Eventually Consistent)
最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
4.总结
ACID和BASE代表两种截然相反的思想理念,ACID注重一致性,是传统关系型数据库如MySQL的设计思路;BASE关注高可用性。
参考