欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

cache-fusion笔记

程序员文章站 2022-05-18 10:49:51
GRD (global resource directory)保存着所有实例中资源的分布情况 GCS (global cache service)具体执行cache fusion 工作的服务,对应进程LMSn GES (global enqueues service)协调实例之间的GCS完成数据传递 ......

 

grd  (global resource directory)保存着所有实例中资源的分布情况

gcs  (global cache service)具体执行cache fusion 工作的服务,对应进程lmsn

ges  (global enqueues service)协调实例之间的gcs完成数据传递工作,完成non-cache fusion资源的管理工作,对应进程lmd.

 cache-fusion笔记

 

 

cache-fusion全局锁

全局锁的分配是通过每个节点的ges服务协调完成的,每个时间点只有一个实例能够修改相同的数据块,通过ges的协调获得块的全局锁之后,gcs负责实例间数据块的传递工作。(cache fusion的频繁使用会导致数据性能的下降)。

ges(全局队列服务)负责维护字典缓存和库缓存内的一致性。字典缓存是实例的sga内所存储的对数据字典信息的缓存,用于高速访问数据字典信息。ges控制数据库中所有的library cache锁和dictionary cache锁。

数据一致性

实例a的一个事务更新了一个数据块,但没有提交,这个时候实例b查询包含事务的这个数据块,那么实例a会将undo段中的一致性数据块传送给实例b,实例b中存放的该数据块就是cr状态的数据块,并非是当前最新的数据块。如果这个时候实例b要更新这个数据块,实例a会将sga中当前的数据块降级,然后传递给实例b,实例b中存放的数据块就是当前最新的数据块。(相同的块在不同实例中分布体现在grd中,grd能展示块的分布图)

 

past image(pi)是维护脏块的拷贝,gcs管理pi,gcs在实例失败恢复的时候会用到pi版本的块。oracle允许即使操作块的事务未提交,如果其他实例有事务修改相同块的不同行,块也能在实例间传递,但是必须保留原来实例中未提交的块,这个块就是pi.

(1)   并行操作过程中的pi

在多节点实例并行操作的过程中,当实例请求修改块时,gcs服务的lmsn进程会将数据块从最后修改此块的实例传送给请求的实例,而lmsn会在原来持有此块的实例中保留此数据库的pi版本。

(2)   资源的磁盘写

因为可能在集群的多个实例中存在多个被修改过的数据块,由gcs管理的写规则必须确保将最近版本的数据块写入磁盘中。gcs还必须确保所有之前的版本已从其他cache中清除。对数据块的写可以由任何持有此数据块的当前版本或pi数据块的实例发起。

 cache-fusion笔记

 

cache fusion应用场景

(1)   多节点实例并行读

实例a从吸盘读取一个块的时候,该块在grd中记录的状态为scur,实例b查询该表,通过cache fusion获取该块,由于并不对该块进行更改,所以实例a块的状态没有发生变化,在实例b中的块的状态是cr。实例c再次执行相同的查询从实例a获取该块,同样实例c中的块状态也是cr。

(2)   多节点实例并行读和写

实例a从磁盘读取数据块到内存中,记录块的状态为scur。实例b要更新该块中的行,必须获得排他的锁,且更新的块必须是当前最新的块,实例b通过cache fusion将实例a的块拷贝到自己的buffer cache中,同时实例a的块状态变为cr,实例b中块的状态是xcur。

(3)   多节点实例并行写

实例a执行update语句从磁盘读取块到实例中,块的状态为xcur。实例b要更新同一个块的其他行记录,实例a的块状态变为cr,实例b通过cache fusion将实例a的块拷贝到实例b的buffer cache中,实例b上块的状态为xcur。如果实例c也要更新同一块,实例c必须等待实例b执行完成后,实例b的状态变更为cr,通过cache fusion将实例b上的块拷贝到实例c,并修改修改实例c块状态为xcur。以上操作,实例a和实例b中保存的cr状态的块都是pi版本。

 

(参考《构建最高可用rac》)