总结一些分布式的基础概念。
基础理论
CAP理论
分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容忍性(P:Partition Tolerance),最多只能同时满足其中两项。
一致性
一致性指的是多个数据副本是否能保持一致的特性,在一致性的条件下,系统在执行数据更新操作之后能够从一致性状态转移到另一个一致性状态。
对系统的一个数据更新成功之后,如果所有用户都能够读取到最新的值,该系统就被认为具有强一致性。
可用性
可用性指分布式系统在面对各种异常时可以提供正常服务的能力,可以用系统可用时间占总时间的比值来衡量,4 个 9 的可用性表示系统 99.99% 的时间是可用的。
在可用性条件下,要求系统提供的服务一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。
分区容忍性
网络分区指分布式系统中的节点被划分为多个区域,每个区域内部可以通信,但是区域之间无法通信。
在分区容忍性条件下,分布式系统在遇到任何网络分区故障的时候,仍然需要能对外提供一致性和可用性的服务,除非是整个网络环境都发生了故障。
权衡
在分布式系统中,分区容忍性必不可少,因为需要总是假设网络是不可靠的。因此,CAP 理论实际上是要在可用性和一致性之间做权衡。
可用性和一致性往往是冲突的,很难使它们同时满足。在多个节点之间进行数据同步时,
- 为了保证一致性(CP),不能访问未同步完成的节点,也就失去了部分可用性;
- 为了保证可用性(AP),允许读取所有节点的数据,但是数据可能不一致。
BASE理论
BASE 是基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eventually Consistent)三个短语的缩写。
BASE 理论是对 CAP 中一致性和可用性权衡的结果,它的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
基本可用:指分布式系统在出现故障的时候,保证核心可用,允许损失部分可用性。
软状态:指允许系统中的数据存在中间状态,并认为该中间状态不会影响系统整体可用性,即允许系统不同节点的数据副本之间进行同步的过程存在时延。
一致性模式
弱一致性:写入之后,访问可能看到,也可能看不到。尽力优化之让其能访问最新数据。
强一致性:在写入后,访问立即可见。数据被同步复制(文件系统,RDBMS)
最终一致性:在写入后,访问最终能看到写入数据,数据被异步复制。
事务,分布式事务
关系型数据库的事务
事务
事务:满足ACID特性的一组操作(原子性,一致性,隔离性,持久型)
A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况
C(Consistency):一致性,在事务执行前后,数据库的完整性约束(包括实体完整性,参照完整性,其他用户自定义的完整性)没有被破坏。这里的一致性含义后面会详细解释
I(Isolation):隔离性,数据库中的事务一般都是并发的,隔离性是指并发的两个事务的执行互不干扰,一个事务不能看到其他事务运行过程的中间状态
D(Durability):持久性,事务完成之后,该事务对数据的更改会被持久化到数据库,且不会被回滚。
隔离性的实现:事务隔离级别
四个事务隔离级别:
未提交读(READ_UNCOMMITTED):事务中的修改即使未提交状态下,其他事务也是可见的
提交读(READ_COMMITTED):一个事务只能读取已经提交的事务所作的更改
可重复读(REPEATABLE READ):同一个事务中,多次读取同一个数据,结果相同
可串行化(SERIALIZABLE):强制事务串行执行,多个事务互不干扰,不会出现并发一致性问题。
分布式事务
2PC:两阶段提交
经典的强一致性,中心化的原子提交协议。中心化是指协议中有两类节点:一个中心化协调者节点(coordinator)和N个参与者节点(participant、cohort)。
两阶段提交协议的每一次事务提交分为两个阶段:
在第一阶段,协调者询问所有的参与者是否可以提交事务(请参与者投票),所有参与者向协调者投票。
在第二阶段,协调者根据所有参与者的投票结果做出是否事务可以全局提交的决定,并通知所有的参与者执行该决定。在一个两阶段提交流程中,参与者不能改变自己的投票结果。两阶段提交协议的可以全局提交的前提是所有的参与者都同意提交事务,只要有一个参与者投票选择放弃(abort)事务,则事务必须被放弃。
优点:强一致性,只要节点或者网络最终恢复正常,协议就能保证顺利结束
缺点:容错能力较差,当节点宕机或超时的情况下,无法确定流程的状态,只能不停的重试;且性能较差,消息交互多,速度受最慢节点影响。
3PC:三阶段提交
三阶段提交协议(3PC)主要是为了解决两阶段提交协议的阻塞问题,从原来的两个阶段扩展为三个阶段,并且增加了超时机制。
但是3PC的最大缺点是一次提交需要传递6条消息,延时较大。