美文网首页
Oracle内存融合

Oracle内存融合

作者: 个人精进成长营 | 来源:发表于2021-06-27 22:06 被阅读0次

内存融合概念

内存融合技术比较复杂,需要先了解基本的相关概念,再来理解内存融合。

1:全局资源目录

GRD(global resource directory): 保存和组织内存融合相关资源的一种方式,是内存融合的基础。每个实例都包含GRD信息

2:PCM 锁

   模式(mode): N ,S X 

 nsx

nyyy

syyn

xynn

3:角色(role ) PCM锁的角色表示对应的数据库被修改的范围,它可以是本地(L)或者全局(G),本地表示对应的块只在本地被修改过,全局表示块在另外一个或者多个远程实例被修改。

4:旧镜像(pass image ,Pi)这部分值为1或者0.如果为1表示存在对应的PI块,如果表示0不存在PI块。角色为L的PCM锁不会存在PI,PI只会对角色G的PCM锁才会存在。

当PI产生时,对应的改变的信息一定要被写入redo log,PI 的存在主要是为了避免RAC过多的访问回滚段避免物理读。

5:节点

资源申请节点、资源持有节点、资源主节点

资源申请过程:

1:资源申请节点发送申请到主节点

2:主节点将请求发给对应的资源持有节点

3:资源持有节点将本地的资源锁信息(PCM)进行改变,之后将资源发送给资源申请  

   节点

4:资源申请节点获取资源,并通知主节点更新资源的相关锁信息。

6:消息机制

步骤1:资源节点向主节点发送消息,要求持有一个资源,这个消息需要被立刻处理,而且主节点会立刻响应这个消息,之后资源申请节点进入等待状态

步骤2:资源主节点发送消息给资源持有节点。这个消息需要被乐可处理,而且资源持有节会马上回复资源主节点。

步骤3:资源持有节点发送消息给申请节点,并同时将资源也发送给申请节点。

步骤4:申请节点通知资源主节点申请已经结束。

7:内存融合举列说明

   以一个4节点的RAC数据库为例,说明各种场景内存融合的原理

   7.1节点C要求读取一个数据块(SCN 1000),第一次读取

       步骤1:SCN 1000的数据块的主节点被HASH 到 D节点,之后节点C向主节点发送请求,要求以S模式持有改块。这是PCM资源锁的属性是SL0(S 表share ,L表示local ,0表示没有PI )

       步骤2:主节点发现这个是第一个请求,没有不兼容的锁存在,把对应的锁赋予C。

       步骤3:节点C从数据文件读取对应的数据库块

       步骤4:读取完成,节点C获得对应的锁,属性为SL0。

       步骤5:节点C获取对应的锁之后,通知主节点。

    7.2节点B要求读取改数据块

        步骤1:节点B向主几点D申请获取这个数据块的最新版本。

        步骤2:主节点发现最新的块保存在C节点,要求C节点发送给B节点

        步骤3:节点C将数据块发送给B节点,这时候节点B的锁属性为SL0

        步骤4:节点B收到数据库块后,通知主节点更新资源锁信息

    7.3实例B要求修改数据块,把SCN改成1009

        步骤1:节点B向主节点D申请获取这个数据块更高级别的锁(X)

        步骤2:主节点发现数据块在C节点存在S模式的锁,要求C节点释放该锁

        步骤3:节点C将数据块上的锁释放,同时将对应的数据库变成一个CR快,因为这个时候数据块的最新版本在节点B上,而且节点C也没有修改过这个快,之后通知节点B锁已经释放

         步骤4:节点B收到消息后,修改数据块,并通知主节点更新资源锁信息,这时候数据块最新版本存在B节点上,对应的锁信息为XL0

    7.4节点A要求修改数据块把SCN 改成1013

        步骤1:节点A向主节点D要求获取这个数据块X模式的锁

        步骤2:主节点发现数据块在B节点存在X模式的锁,要求B节点释放锁

        步骤3:B节点将数据块上的锁释放,并将修改数据块的操作写入重做日志

同时将对应的数据块变成一个PI块,之后通知节点A该锁已经释放,并将数据块发给节点A,这时候节点B对应的锁信息为NG1

         步骤4:节点A收到消息之后,修改数据块并通知主几点更新锁信息。这时候数据库的最新版本在节点A(XGO)

   7.5节点C要求读取数据块

        步骤1:节点C向主节点要求获取这个数据块的S 锁

        步骤2:主节点D发现这个数据块在节点A存在X模式锁,要求A释放X锁

        步骤3:节点将数据块上的X锁释放(降级S),并将修改的操作写入重做日志文件中,同时将数据块变成PI块,之后通知C节点锁已经释放,将数据块发送给C节点,这是A节点的锁为SG1

         步骤4:节点C收到消息之后,更新本地节点锁信息(SG0),并通知主节点更新锁信息。

        7.6节点B要求读取数据块

         步骤1:节点B向主节点D要求或者这个块的S锁

         步骤2:主节点D发现数据块在C和A节点存在S模式锁,选择C节点发送数据块

         步骤3:节点C收到请求后,将最新的数据库发送给B

         步骤4:节点C收到消息之后,更新本地节点的锁信息,并通知主节点更新锁信息。这是数据块SG1

          7.7节点A要求执行检查点

          步骤1:节点A向主节点要求写入数据库块

          步骤2:主节点发现数据块在节点A存在最新的版本,通知A节点将数据写入磁盘。

          步骤3:节点 A 将数据的最新版本写入数据文件发送I/O请求

          步骤4:数据文件被写入,I/O请求完成

          步骤5:节点A通知主节点块已经被写入,这是节点A锁为(XL0)

          步骤6:主节点通知所有包含数据块PI的节点消除PI,锁属性为(NL0)

相关文章

网友评论

      本文标题:Oracle内存融合

      本文链接:https://www.haomeiwen.com/subject/sxhfultx.html