什么是MVCC?有什么作用?
MVCC是Multiversion Concurrency Control的缩写,中文的意思是多版本并发控制。
目前多数DB都采用了这一技术,比如Oracle,PostgreSQL等,但各自的实现机制不尽相同,MVCC没有一个统一的实现标准。
MVCC能有效降低锁的开销,虽然不同数据库实现MVCC的机制有所有同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行。
ACID中的I是怎么实现在的?
- A: 原子性 Atomicity
- C: 一致性 Consistency
- I: 隔离性 Isolation
- D: 持久性 Durability
I
的实现需要对事务进行并发控制,使事务在并发环境中相互隔离,一个事务的执行不能被其他事务干扰。也就是说,不同的事务并发操纵相同的数据时,每个事务都有各自完整的数据空间,一个事务内部的操作及使用的数据对其他并发事务是隔离的,一个事务所做的修改在终提交以前,对其他事务是不可见的。
2PC在数据库中是怎么来实现的?
2PC是Two Phase Commitment Protocol的缩写,中文的意思是两阶段提交协议,用于保证属于多个数据分片上的操作的原子性。这些数据分片可能分布在不同的服务器上,2PC协议保证多台服务器上的操作要么全部成功,要么全部失败。 以ORACLE数据库为例,2PC的实现步骤如下:
阶段一:提交事务请求(投票阶段)
事务询问
协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应执行事务
各参与者节点执行事务操作,并将Undo和Redo信息计入事务日志中各参与者向协调者反馈事务询问的响应
如果参与者成功执行了事务操作,那么就反馈给协调者Yes响应,表示事务可以执行;
如果参与者没有成功执行事务,那么就反馈给协调者No响应,表示事务不可以执行。
阶段二:执行事务提交(执行阶段)
执行事务提交
如果所有参与者的反馈都是Yes响应,那么
发送提交请求
协调者向所有参与者节点发出Commit请求事务提交
参与者接收到Commit请求后,会正式执行事务提交操作,并在完成提交之后释放在整个事务执行期间占用的事务资源反馈事务提交结果
参与者在完成事务提交之后,向协调者发送ACK信息完成事务
协调者接收到所有参与者反馈的ACK消息后,完成事务
中断事务
任何一个参与者反馈了No响应,或者在等待超时之后,协调者尚无法接收到所有参与者的反馈响应,那么就会中断事务。
发送回滚请求
协调者向所有参与者节点发出Rollback请求事务回滚
参与者接收到rollback请求后,会利用其在阶段一中记录的Undo信息来执行事务回滚操作,并在完成回滚之后释放整个事务执行期间占用的资源反馈事务回滚结果
参与者在完成事务回滚之后,向协调者发送ACK信息中断事务
协调者接收到所有参与者反馈的ACK信息后,完成事务中断
简单讲讲CAP/base/paxos算法。
CAP定理
一个分布式系统不可能同时满足一致性(C: Consistency)、可用性(A: Availibility)和分区容错性(P: Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。
其中分区容错性是一个最基本的要求,是一个分布式系统必然需要面对和解决的问题。系统架构设计的主要精力应放在根据业务特点在C(一致性)和A(可用性)之间寻求平衡。
- 一致性
在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性。
CAP定理应用中的放弃一致性,是指放弃数据的强一致性,而保留数据的最终一致性。这样的系统无法保证数据保持实时的一致性,但是能够承诺的是,数据最终会达到一个一致的状态。具体多久能够达到数据一致取决于系统的设计,主要包括数据副本在不同节点之间的复制时间长短。
- 可用性
系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。
CAP定理应用中的放弃可用性,是指一旦系统遇到网络分区或其他故障时,受到影响的服务需要等待一定的时间,在等待期间系统无法对外提供正常的服务,即不可用。
- 分区容错性
分区容错性约束了一个分布式系统需要具有如下特性:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
对于一个分布式系统而言,分区容错性是一个最基本的要求,CAP定理应用中的放弃分区容错性,一种较为简单的做法是将所有的数据(或者仅仅是那些与事务相关的数据)都放在一个分布式节点上,这样就不会碰到由于网络分区带来的负面影响,但放弃P的同时,也就意味着放弃了系统的可扩展性。
BASE理论
BASE是Basically Available(基本可用)、 Soft state(软状态) 和Eventually consistent(最终一致性)三个短语的简写。 BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性(Strong Consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventually consistent)。
- 基本可用
基本可用是指分布式系统在出现不可预知故障时,允许损失部分可用性,如响应时间上的损失,部分非关键功能上的损失。
- 软状态
软状态和是指允许系统中的数据存在中间的状态,并认为该中间状态存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。
- 最终一致性
最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。BASE理论面向的是大型高可用可扩展的分布式系统,和传统事务的ACID强一致性相反,BASE是通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。
在实际的分布式场景中,不同业务单元和组件对数据一致性的要求是不同的,因此在具体的分布式系统架构设计过程中,ACID特性与BASE理论往往会结合一起使用。
Paxos(帕克索斯)算法
Paxos是基于消息传递且具有高度容错性的一致性算法。
算法要解决的问题就是如何在可能发生的宕机或网络异常的分布式系统中,快速且正确地在集群内部对某个数据的值达成一致,并且保证不论发生以上任何异常,都不会破坏整个系统的一致性。
Paxos算法引入了“过半”的理念,通俗的讲就是少数服从多数据的原则。同时,Paxos算法支持分布式节点角色之间的轮换,这极大的避免了分布式单点的出现,因此Paxos算法解决了无限期等待问题,也解决了“脑残”问题,是目前来说最优秀的分布式一致性协议之一。