正如大家所知,随着应用业务的快速发展,它们对单台服务器提供的数据库服务的高可用性,cpu计算能力,存储容量及可用性,cache的大小等等需求也日益随之增大。单台物理机器作为数据库服务器的瓶颈很容易达到。数据库研究人员开始寻求新的突破,如何使数据库增加服务水平扩展能力,有效解决单台服务器带来的种种限制。很快,从Oracle 8i开始,他们引入了 一项新技术---缓存融合,Oracle 8i(OracleParallel Server)有一个名为“Block Server Process”的后台进程,由它来负责Oracle 8i OPS中的缓存融合。


对于Oracle 8i数据库,其实只实现了部分缓存融合功能。当我们采用多实例Oracle并行服务器的时候,并且如果其中一个实例请求操作由同一数据库的其他实例修改的数据块,那么持有实例需要将数据写入磁盘以便请求实例可以读取相同的数据。这称为“Disk Ping”。这个操作其实会极大地影响数据库的性能。


虽然Oracle8i有效的解决了水平扩展能力的限制,但是“Disk Ping”也带来了很多额外的IO开销,引起新一轮的性能问题。从oracle 10g开始,缓存融合技术有了新的改良,Oracle在这些物理服务器间(一套RAC集群)使用高速互联网络来提供不同物理内存间的数据块的传输。这样可以有效的消除额外的磁盘I/O操作,同时也有效的优化了集群间的读/写并发性问题。RAC集群中的每台物理服务器对应一个数据库实例,每个实例都有自己的SGA,所有实例的缓存组合在一起就形成了我们所知的缓存融合技术。


由于每个实例之间的集群中存在高速互连网络,每个实例都使用高速互连网络连接到统一集群中的其他实例。这样就可以在2个或更多服务器之间共享内存。 以前只能进行数据文件共享,由于高速互连网络的引入,现在可以实现高速缓存的共享。


高速缓存的共享,对用户来说是完全透明的。RAC数据库的每个实例都有自己的本地缓存,他们执行正常的缓存功能。假设实例A中的事务/用户需要访问由另外一个实例B持有/锁定的数据块,这时实例A需要通过高速互联网络向实例B发出访问数据块的请求,实例B通过高速互联网络传输数据块。这些跨实例间的一致性操作及争用问题就是我们所知的CacheFusion要解决的问题。


我们需要注意:Cache Fusion是参与RAC的每个节点/实例的缓存的合并,但它不是任何物理安全的内存组件,它不同于每个节点/实例上通常的缓冲区缓存(或SGA的其他组件)。


第一篇文章《Oracle RAC Cache Fusion 系列一:基础概念》中已经给大家介绍了单实例情况下的数据块的操作类型和锁的持有模式。那么在RAC环境中我们可以把读写操作争用场景归纳为以下三种情况Read/Read contention,Read/Write contention,Write/Write contention。


1. Read/Read contention:

RAC场景下的读 -读争用可能根本不是问题。理由:因为在读的情况下,它们对数据块的请求锁模式为共享锁模式,并没有尝试独占锁。


2.Read/Write contention

这是一个有意思的争用场景,我们看看Cache Fusion是如何解决这类争用的。

1. 假设数据块位于实例A的缓冲区高速缓存中并正在更新,那么这个时候它其实已经对这个块加了独占锁。

2. 在一段时间之后,实例B希望读取相同的数据块,因此实例B向集群缓存的协调员(Global Cache Service)发送访问数据块请求。

3. 协调员GCS开始检查该数据块的可用性,并发现实例A持有该数据块并已获得独占锁。这时协调员GCS希望实例A能释放该数据块的独占锁。

4. 现在有两种情况:(1)实例A已经完成自己的操作,释放该块上的锁,这时实例B就可以对这个块加共享锁拥有该数据块的读取权限。(2)实例A未完成自己对数据块的操作,不能释放该块上的独占锁。这时它会在其自己的缓冲区缓存中创建该块的一个一致性读镜像(CR image),并通过高速互联网络把这个块发送给实例B。

5. 持有块的实例A相应地通知协调员GCS(如果已释放独占锁或一致性读镜像已发送)。

6. 实例A创建一致性镜像(CR image),并将其通过高速互联网络发送到请求实例B以及协调员参与的环节就是Cache Fusion发挥作用的时候。


3.Write/Write contention:

接着上一个读写争用的示例,这个时候实例A和B都试图获取数据块上的独占锁。

1. 数据块位于实例A的缓冲区高速缓存中并正在进行更新操作,已获得独占锁定。

2. 实例B将数据块请求发送到协调员GCS。

3. 协调员GCS首先检查该数据块的可用性,发现实例A已获得该块的独占锁。因此,GCS要求实例A释放实例B所请求的这个块上的独占锁。

4. 现在有两种情况:(1)实例A已经完成自己的操作,释放该块上的锁,这时实例B就可以对这个块加独占锁拥有该数据块的修改权限。(2)实例A未完成自己对数据块的操作,不能释放该块上的独占锁。这时它会在其自己的缓冲区缓存中创建该块的一个过去镜像(Past Image)并产生对应的REDO日志,最后通过高速互联网络把这个当前块发送给实例B。

5. 持有块的实例A相应地通知协调员GCS(如果已释放独占锁或生产保存了一个过去镜像(Past Image))。

6. 实例B现在获取该块的独占锁定并继续其正常处理。这个时候协调员GCS记录数据块的持有者为实例B。

这是Cache Fusion解决的另外一个非常重要的场景。




以上是介绍的是CacheFusion所需要解决的重要争用问题。后续的章节将围绕这三个场景进行细致的拆解展开。


| 作者简介

刘金龙·沃趣科技高级数据库技术专家

多年Oracle海量数据以及高并发数据库管理工作经验,主要负责Oracle数据库产品及售后二线支撑。精通Oracle 11g及12c内部运行机制,有丰富的基于全方位技术栈的数据库及RAC集群层故障诊断、性能调优、OWI、数据库备份恢复及迁移经验。






沃趣科技,让客户用上更好的数据库技术!