本节书摘来自华章出版社《云数据管理》一书中的第2章,第3节,作者迪卫艾肯特·阿格拉沃尔,更多章节内容可以访问云栖社区“华章计算机”公众号查看
恢复和提交
集中式恢复
故障恢复是数据库管理系统不可分割的一部分。集中式恢复可以在单站点数据库在磁盘上存储所有数据时确保其持久性或永久性。为了在确保原子性的同时实现故障恢复,很多机制在事务执行的过程中都使用持久性存储设备,如磁盘,从而确保all-or-nothing属性。下面是3种常用的方案。
1. 影子页:在磁盘上保存两份数据库备份,其中一个用于事务更新,当事务提交时,原子指针切换到新的数据库备份。
2. 前像文件:磁盘日志用来存储所有更新数据项的前像文件(before-image),事务会立即更新物理数据库。一旦故障出现并且事务尚未提交,数据库就会根据日志恢复到初始状态。
3. 后像文件:所有更新操作在后像文件(after image)日志中执行。事务提交后,根据日志,将所有的后像文件装载到数据库中。
在这些基本概念的基础上,提出了各种各样的恢复方法。这些方法以不同的方式对前像文件日志和后像文件日志进行组合,从而提高提交事务或中止事务的性能[Bernstein and Newcomer, 2009, Gray and Reuter, 1992, Weikum and Vossen, 2001]。
从集中式数据库扩展到分布式数据库(即对象可能存在于不同的站点上)的关键挑战是:当故障出现时,如何在不同站点之间确保原子性。下面将介绍主要的分布式提交协议。
原子提交(atomic commitment)
提交的根本问题是由于事务在多个服务器上执行操作而引起的。全局提交需要所有参与者的一致本地提交。分布式系统可能会部分失效,在特殊情况下,服务器可能崩溃,极端情况下,会出现网络故障,从而导致网络划分。这可能会导致不一致的决定,即,在某些服务器上事务完成了提交,而在其他服务器上,事务却中止了。
基本的原子提交协议是一种简单的分布式握手协议,称为两阶段提交协议(two-phase commit, 2PC)[Gray, 1978]。在该协议中,协调者(事务管理者)负责一致决定:提交或中止。其他所有的执行事务的数据库服务器在该协议中都是参与者,都依赖于该协调者。提交时,协调者向所有参与者请求选票。原子提交要求所有进程得到相同的决定,特别是,只有当所有进程都投赞成(yes)票时,事务才能提交。因此,如果没有故障发生,并且所有的进程都投赞成(yes)票时,最终结果才可以提交。
该协议执行过程如下。协调者向所有参与者发送投票请求(vote-request)。当参与者接收到投票请求消息时,如果能本地提交,就返回一个yes消息,如果需要中止该事务(由于死锁或者无法把本地操作写到磁盘上),就返回no消息。协调者收集所有投票,如果都是赞成票(yes),那么就认为事务已经提交,否则事务就被中止了。协调者将结果发送给所有参与者,参与者相应地对本地事务进行提交或中止。
如果一个站点没有接收到预期的消息,该站点会怎么做呢?注意,该协议假设分布式系统是异步的,因此,其中有一个超时机制。有以下3种情况需要考虑。
1. 参与者等待投票请求:这种情况下,参与者在本地中止事务是安全的。
2. 协调者等待投票:这种情况下,协调者也可以安全地中止事务。
3. 参与者等待最终决定:这是一种不确定的情况,由于事务可能已经提交或者中止,因此,参与者也可能是不确定的,参与者可能不知道实际的决定。而有趣的是,协调者是确定的。
接下来详细探讨不确定参与者的情况。实际上,该参与者可以向其他参与者询问最终决定并寻求帮助。一旦任何参与者已提交或中止,该参与者就可以发送提交或中止决定。如果一个参与者尚未投票,那么它就可以安全地中止该事务,并可以向其他参与者发送中止决定。然而,如果所有参与者都投赞成票(yes),那么所有活动的参与者都是不确定的。这种情况下,该事务就被认为已阻塞,所有活动的参与者都需要一直等待,直到有足够多的站点赞成该事务进行恢复的决定。直观来看,活动的参与者处于不确定状态,其他一些失败的参与者可能处于提交状态,还有一些参与者处于中止状态。一般来说,两阶段提交协议即使是在简单的系统崩溃故障情况下也可能存在阻塞问题。
为了解决阻塞问题,可以引入中间缓冲状态,这样一来,如果任何运行站点是不确定的,那么,所有进程都不能提交[Skeen and Stonebraker,1983]。这种协议就是三阶段提交协议,该协议在站点故障情况下是非阻塞的。然而,三阶段提交协议不允许分区故障。实际上,可以证明在分区故障情况下,不存在非阻塞原子提交协议[Skeen and Stonebraker, 1983]。
总之,分布式数据库中的提交协议可能导致高复杂度和潜在的阻塞问题。实际上,其他站点的故障可能导致本地数据不可用。分布式数据库需要大量的额外开销来确保执行的正确性。这种对全局同步机制的依赖会限制系统的可扩展性,并对容错性和数据可用性产生重要影响。上述所有原因及其他因素(与不同地点的数据权限有关)共同导致分布式数据库的商业化应用较少。