Oracle11gRAC中的缓存融合

来源:互联网 发布:淘宝三张证件照怎么拍 编辑:程序博客网 时间:2024/05/01 18:54
1.GRD

GRD就像是锁和资源的一个中央仓库。它分散在所有节点中。只有一个节点维护者有关一个资源的完整信息,这个节点称为该资源的“主控节点”。

全局缓存中的每个数据块地址(DBA)都有一个“资源”,可以为该资源分配多个锁。每个在其缓存中保存着这个数据块副本的实例都可以拥有对该资源的锁。

GCS锁结构在物理上位于集群中每个对该数据块感兴趣的节点上。

2.锁与角色

根据锁与角色,一个资源可以有6种状态:NL,SL,XL,NG,SG,XG。其中N代表NULL,S代表share(干净的块),X代表exclude(被某实例以独占模式修改过的脏块),L代表local,G代表global。

SL:当一个实例拥有一个SL状态的资源时,它可以向其他实例提供这个块的副本,并且可以从磁盘读取这个块。因为数据块未被修改,所以不需要将其写到磁盘。

XL:当一个实例拥有一个XL形式的资源时,它独占这个资源的所有权。它还拥有修改这个块的独占权限。对这些数据块所做的全部修改都保存在它本地的缓冲区缓存中,它可以将块写到

磁盘中。如果另一个实例需要这个块,那么它将通过GCS与这个实例联系。

NL:NL形式用于保护一致读块。如果一个块以SL模式保存,而另一个实例希望获得该块的X锁时,那么当前实例将把这个块发送给发出请求的实例,并将自己的状态降为NL。

SG:在SG形式中,一个块存在于一个或多个实例中。一个实例可以从磁盘读取这个块,并将它提供给其他实例。

XG:在XG模式中,一个块可以拥有一个或多个PI,表明在几个实例的缓冲区缓存中有这个块的多个副本。具有XG角色的实例拥有这个块的最新副本,最可能由它将块写到磁盘中。GCS可以要

求具有XG角色的实例将块写到磁盘中,并把它提供给另一个实例。

NG:当根据GCS的指示抛弃PI时,这个数据块以NG角色保存在缓冲区缓存中。这只作为这个块的CR副本。

3.cache fusion过程

假设ORACLE RAC中有4个实例,分别为ABCD,实例D为数据块BL的主控者。

时刻一:

开始时,任何实例的缓存中都没有这个数据块。

此时,实例C希望读取这个块,那么将按照以下步骤进行:

(1)实例C向主控实例发送一个共享锁请求(S,C),请求该块。(S为share锁,C为实例C)

(2)这个块从未被读入任何实例的缓冲区中,而且未被锁定。主控实例D将锁授予实例C。被授予的锁为SL0。(S表示共享模式,L表示本地的,0表示这个块不存在PI,即过去镜像)

(3)实例C将这个块从共享磁盘读取到它的缓冲区缓存中。

(4)实例C以共享模式拥有这个块。锁管理器更新资源目录。(在实例D中登记该资源的锁状态)

时刻二:

在时刻一中,BL已经保存在实例C的缓存中,并且状态为SL0,并且主控者D中已经记录了这一信息。

此时,实例B希望读取被缓存在C中的数据块,那么将按照以下步骤进行:

(1)实例B向主控实例D发送一个共享锁请求(S,B)。

(2)实例D中的锁主控者知道实例C中有这个块,因此向实例C发送一条ping消息。

(3)实例C通过互联将这个块发送给实例B。随同这个块,实例C还指出:实例B应当从实例C取得当前锁模式和角色。

(4)实例B向实例D发送一条消息,表示它已经承担这个SL锁。这条消息相对不是那么紧急,因此将异步发送这条消息。

时刻三:

在时刻二中,数据块BL被缓存在实例B与C中,在B中的状态为SL0并且为current当前块,在C中为CR状态(非当前状态并且干净的块副本)。

此时,实例A希望修改已经被缓存在实例B和C中的同一个块,那么将按照以下步骤进行:

(1)实例A向主控实例D发送一个独占锁请求(X,A)。

(2)实例D作为主控者知道实例B和实例C中都有这个块,因为前者拥有当前块,实例D向实例B发送BAST消息。

(3)实例B通过互联将该块发送给实例A,并关闭锁,这个块仍然存在于实例B的缓存中,作为CR。

(4)实例A对该数据块拥有XL0模式锁,并且通知实例D的主控者。

(5)实例A在其缓冲区缓存中修改这个块,假设这些修改未被提交,并且也未被写入磁盘。

时刻四:

在时刻三中,实例A拥有XL0模式的BL数据块,实例B和实例C中拥有CR模式的该块。并且实例A对该块做了修改(虽然未提交),即该块已经包含了活动事务。

此时,实例C希望更新该块,如果C希望更改与A更改的相同数据行,那么将会进入普通锁模式(与缓存融合锁互不干涉),实例C将进入等待状态。这里假定实例C希望更改不同的行,那

么将按照以下步骤进行:

(1)实例C向主控实例D发出一条独占锁请求(X,C)。

(2)实例D的锁主控者知道实例A拥有这个块的一个独占锁,因此向实例A发送一条ping消息。

(3)实例A通过互联将这个脏块发送给实例C。它将这个缓冲区的锁由XCUR降级为NULL。它保存这个块的一个PI版本,并放弃对这个缓冲区的所有锁。在传送这个块之前,实例A必须创

建一个PI镜像,并将刷新对所修改块的所有挂起重做。实例A上的块模式现在为NG1(本地无锁,块已变脏,并且存在PI)。

(4)实例C向实例D发送一条消息,指出它现在以独占模式拥有这个块。块角色G表示这个块处于全局模式,如果它需要将这个块写到磁盘上,那么必须与拥有这个块的过去镜像(PI)

的其他实例进行协调。实例C修改这个块,并发出提交命令。

时刻五:

在时刻四,实例B拥有该块的CR,实例A拥有该块的PI,实例C中该块为XG1模式。

此时实例A希望提交更改,以释放由事务拥有的行级锁,并将重做信息刷新到重做日志文件。将经历以下步骤:

(1)实例A希望提交修改。提交操作不需要对数据块进行任何同步修改。

(2)锁状态与前面的状态保持相同,只是提交操作的修改向量被写入重做日志文件。

时刻六:

此时,实例B出于检查点的原因,将缓冲区缓存中的脏块写到磁盘中,将经历一下步骤:

(1)实例B向主控者D发出一条写请求,并给出必要的SCN。

(2)实例D的锁主控者知道这个块的最新副本可能在实例C上,因此向实例C发送一条消息,要求写入。

(3)实例C启动磁盘写入操作,并将BWR写到重做日志文件中。

(4)实例C获取完成写入操作的通知。

(5)实例C通知主控者:写入操作已完成。

(6)在从实例C收到该通知后,主控实例D通知所有PI拥有者抛弃它们的PI,实例C上的锁将修改后的块写到磁盘中。

(7)先前曾经修改过这个块的所有实例也必须写入一个BWR。

时刻七:

此时,主控实例D崩溃,将经以下步骤:

(1)实例D发生崩溃。

(2)全局资源目录(GRD)被暂时冻结,主控实例D拥有的资源将被平均分布到幸存节点中。

时刻八:

此时,实例A从表中查询数据行,以获得最新数据,将经历以下步骤:

(1)实例A向主控实例C发送一个共享锁请求Lock Req(S,D)。

(2)主控实例C知道这个块的最新副本可能在实例C中(拥有者与主控者为同一实例),并要求拥有者向实例A传送当前块。

(3)实例C通过互联向实例A传送CR块。



0 0
原创粉丝点击