首页 理论教育分布式数据库技术的若干关键技术

分布式数据库技术的若干关键技术

【摘要】:为了同时拥有两者的优点,有些文献建议使用页面/对象缓存技术。MOB存放更新的对象,并返回给客户端。但后者在提交时要验证步骤,以满足数据一致性需求。客户端将封锁逐步升级并将消息发送给服务器,继续应用处理。因为数据竞争增加,O2PL算法比CBL算法对死锁夭折更敏感。专家证明AOCC算法的性能高于CBL的。因为AOCC算法使用延迟消息,消息的开销少于CBL的。

1.客户端缓存管理

客户端可以管理一个页面缓存器、一个对象缓存器或者两者都有。如果客户端有一个页面缓存器,当每个页面发生故障或刷新时,那么可以从服务器读/写整个页面。对象缓存器可以读/写对象,允许使用一次一个对象方式来存取。

对象缓存管理器可以存取更精细的颗粒,因此可以提供更高级的并发。也可以将缓存分片,由于缓存管理器无法调节多个对象的布局,因此会留下一些无用空间。页面缓存器不会发生这种情况,但是,如果磁盘上的数据和应用数据的存取方式不匹配,则页面中会有大量未访问过的对象,会浪费宝贵的客户端缓存空间。这时,页面缓存的使用率就低于对象缓存的使用率。

为了同时拥有两者的优点,有些文献建议使用页面/对象缓存技术。在这种双模式缓存系统里,客户端将页面下载到页面缓存器里。然而,当客户端将页面刷新除去时,会将有用对象复制到对象缓存器中去。

2.服务器缓存管理

服务器通常管理一个页面缓存器。页面从页面缓存器一次发送到客户端,以满足它们的数据请求。一个分组的对象服务器通过复制必要的对象在相关服务器缓存器里对页面进行分组,并把对象组发送给客户端。除了页面级缓存器以外,服务器还维护修改对象缓存器(modified object buffer,MOB)。MOB存放更新的对象,并返回给客户端。这些更新的对象必须放到相应的页面上去,修改过的页面必须写回磁盘上。一个MOB允许服务器通过批处理读/写操作来减少磁盘I/O的开销。

在一个客户端/服务器系统里,因为客户端典型地吸纳了大多数数据请求,服务器缓存器通常更像扮演缓存上面的一级缓存器的角色。

3.缓存一致性

在任何数据迁移系统里,要把数据迁移到客户端,缓存一致性是一个问题。有类似情况的问题也发生在关系型客户端/服务器系统里,但对象DBMS中有特殊问题。

DBMS缓存一致性的研究与并发控制的研究是密切相关的,因为缓存的数据可以被多个客户端并发存取,封锁也和数据一起缓存在客户端。DBMS缓存算法可以分为基于避免算法与基于检测算法两种。基于避免(avoidance-based)算法通过保证客户端不能更新正在被其他客户端读的对象,以防止存取陈旧的缓存数据,这样可以保证客户端缓存里不存在陈旧过时的数据。基于检测(detection-based)算法允许存取陈旧缓存数据,因为客户端可以更新其他客户端正在读的对象。但后者在提交时要验证步骤,以满足数据一致性需求。(www.chuimin.cn)

基于避免算法与基于检测算法依次可以分为同步、异步或延迟几种,取决于它们如何通知服务器实施写操作。在同步算法里,客户端希望实施写操作时发送一条封锁逐步升级消息,并且处于阻塞状态,直到服务器给出响应为正。异步算法里,客户端希望实施写操作时发送一条封锁逐步升级消息,而不处于阻塞状态,以等待服务器给出响应。在延迟算法里,客户端乐观地延迟通知服务器,它实施了写操作,以致延迟到提交时刻。在延迟模式,客户端将所有封锁逐步升级并请求分组,在提交时发送给服务器。这样,与同步算法和异步算法比,在延迟的缓存器一致性模式中通信开销较低。

这样,就产生以下6个变种。

●基于避免的同步:CBL(callback-read locking)是最常用的基于避免同步缓存一致算法。这个算法里,客户端保留跨事务的读封锁,但在事务结束时释放写封锁。客户端发送锁请求给服务器,然后处于阻塞状态,等待服务器响应。如果客户端请求页面上的写封锁,而该页面缓存在其他客户端上,服务器发布一个回呼(callback)消息请求远程客户端在这个页面上撤销读封锁。回呼-读可以保证低的夭折率,一般比基于避免的延迟算法、基于检测的同步算法和基于检测的异步算法性能要高。

●基于避免的异步:基于避免异步缓存一致算法(asynchronous avoidance-based cache consistency algorithms,AACC)没有像基于避免的同步算法中出现的消息阻塞开销。客户端将封锁逐步升级并将消息发送给服务器,继续应用处理。正常来说,乐观方法涉及高夭折率,在基于避免的算法中,一旦系统知道更新,就通过即时的服务器动作在远程客户端减少腐败的缓存对象。这样,基于避免的异步算法的死锁夭折要比基于避免的延迟算法的低。

●基于避免的延迟:乐观的缓存一致性两阶段封锁(O2PL)是一系列基于避免的延迟算法。这个算法里,客户端将封锁逐步升级并请求批处理,提交时将它们发送到服务器。如果其他客户端正在读这个更新对象,则服务器阻塞对客户端的更新。因为数据竞争增加,O2PL算法比CBL算法对死锁夭折更敏感。

●基于检测的同步:保守的缓存两阶段封锁(C2PL)是一种基于检测的缓存一致性的同步算法。在这个算法里,无论什么时候只要在缓存里存取一个页面客户端,就连接服务器,以保证该页面不腐败或被其他客户端写入。C2PL算法的性能比CBL算法和O2PL算法的低,因为后者不跨事务缓存读封锁。

●基于检测的异步:带通知的不等待封锁(no-wait locking(NWL)with notification)是一个基于检测的异步算法。在这个算法里,客户端将封锁逐步升级并请求发送给服务器,且乐观地假设它们的请求是成功的。当客户端事务提交时,服务器将更新页面传播到其他缓存已受影响页面的客户端。这也说明CBL算法的性能比NWL算法的高。

●基于检测的延迟:适应性乐观并发控制(adaptive optimistic concurrency control,AOCC)是一种基于检测的延迟算法。专家证明AOCC算法的性能高于CBL的。因为AOCC算法使用延迟消息,消息的开销少于CBL的。