当前位置: 首页 > java >正文

Oralce RAC DRM详解

为了保证CacheFusion的性能,Oracle提供了一个名为DRM的机制,通常情况下一个进程获取一个Buffer可能会有以下几种情况:

1.最快的情况:

进程查看buffer的属主信息,确定属主就是自己,并且在与LMS通信之后命中了自己的缓冲区,这种情况就可以直接读缓冲区的buffer效率就非常高。

2.较好的情况:

进程查看buffer的属主信息,确定属主就是自己,并且在与LMS通信之后命中了其它节点的缓冲区,这个时候通过socket通信获取其它节点内存中缓存的buffer,在这种情况下buffer通过网络获取,效率较高,高于从磁盘上获取。

3.比较普通的情况:

进程查看buffer的属主信息,确定属主就是自己,并且在与LMS通信后没能命中缓冲区,这个时候就需要从共享磁盘中读上来一块buffer,磁盘IO的效率是慢于socket通信的,在该种情况下效率低于情况2.

4.较差的情况

进程查看buffer的属主信息,确定属主不是自己,本节点LMS会与属主节点LMS进行socket通信,属主节点LMS接收到请求后请求的buffer命中了其它节点的缓冲区,这时需要在走一个socket通信将该buffer发送给请求节点,这种情况下需要多发一次socket请求从而影响性能。

5.最差的情况

进程查看buffer的属主信息,确定属主不是自己,本节点的LMS会与属主节点LMS进行socket通信,属主节点LMS在接收到请求后发现请求buffer没能命中任意一个节点的缓冲区,这时需要告知请求节点从共享磁盘中读取该buffer,这种情况既多发了socket又要走磁盘IO效率极差。

根据以上几种情况,不难看出当buffer属主和请求buffer节点时同一个节点时,请求buffer的效率会比较好。DRM就做到了这样一件事。

在数据库启动后所有资源都是均匀分配的,因此无法保证请求节点和属主节点是同一个节点,所以最快的情况和较好的情况出现的概率较低。

DRM的核心思想就是通过统计一个关系被节点访问的次数,从而将这个关系的所有buffer的属主转变为最频繁地访问该关系的节点。

DRM涉及到两个部分分别是数据统计以及资源迁移。

首先本文先来讲解一下数据统计:

在LMS决定授予一个buffer给某个节点之后,会通知LCK0做数据统计,LCK 0会统计数据,并且找出符合DRM要求的关系,该要求为该关系每分钟被某个节点访问超过了6000次并且该关系被某个节点的访问次数是其他节点的50倍,在找出这样的关系后,LCK0进程会把这样的关系涉及到的buffer加入到DRM队列中。

DRM队列是一个环形队列,每个entry是一个windows,一个windows可以容纳64个buffer。

LMD会轮询检查DRM间隔,在达到预定时间后准备开启DRM,该时间默认是10分钟,在达到这个时间后,LMD会查看DRM队列,如果队列中存在元素,那么开启DRM资源迁移。

DRM资源迁移包括四个阶段,分别是静默阶段、冻结阶段、清除阶段、重建阶段以及解冻阶段。

在静默阶段时,LMON通知LMS结束对windows中的数据块之后的请求后,不再接收对这些数据块的其它请求。

在冻结阶段时,LMS会处理当前需要DRM的数据块当前的请求,在处理完当前的请求后LMS不再接受对这些块的新请求,如果用户还希望访问这些块时需要等待。

在清除阶段时,LMS会将对应块在所有节点上的当前的主节点信息删除。

在重建阶段时,LMS会将所有节点的LMS发送本地记录的需要DRM的数据块的信息到新的属主节点,新的属主节点会根据LMS发送的本地记录信息构建新的属主信息并将其写入到自己的内存中。

在解冻阶段时,发起DRM的LMON会向集群所有LMON发送DRM完成的消息,集群其它LMON在接收到该消息后会和本地节点的LMD进程确认本节点的迁移完成状况,在确认DRM完成后,这些节点的LMON会通知发起DRM的节点DRM已完成,LMON在接收到所有节点的确认消息后,会标记本次进行DRM的windows为已完成状态,下一次DRM时LMD不再检索这部分信息,同时如果队列满了,这部分信息会被覆盖掉。

由此可见一次DRM无法满足迁移一整个relation。因此对于一个relation来说需要被多次DRM才能完成整个relation的迁移,因此那些已经完成迁移buffer会被上一个affinity lock,拥有affinity lock的buffer就代表经历了DRM,可以被节点快速访问。

http://www.xdnf.cn/news/10148.html

相关文章:

  • 【征求意见】四川省大数据发展研究会关于对《数据资源建设费用测算标准》团体标准征求意见的通知
  • Python_day40
  • Python常见的面试题
  • vueflow
  • 【仿生机器人】需求案例
  • EWM108-GN06B系列BDS单北斗卫星定位模块产品简介
  • [IMX] 10.串行外围设备接口 - SPI
  • win32相关(创建线程)
  • 多线程(3)
  • MySQL中怎么看是否走了索引
  • 数据库中求最小函数依赖集-最后附解题过程
  • EMQX服务
  • DALI DT6与DALI DT8介绍
  • PlankAssembly 笔记 DeepWiki 正交视图三维重建
  • redis缓存与数据库协调读写机制设计
  • JAVA 集合进阶 泛型类、泛型方法、泛型接口
  • 【算法训练营Day03】链表part1
  • 随笔笔记记录5.28
  • 说一说SAP系统从Non-Unicode到Unicode的演化
  • 674SJBH校园外卖订餐系统V3
  • OpenLayers 图形绘制
  • 卫星地图 App 的实测体验深度解析
  • DeepSeek 赋能工业互联网:设备预测性维护的智能革新之路
  • 突破铁芯CT局限:罗氏线圈的“无磁饱和”技术深度解读
  • 身份证信息OCR识别提取
  • NIO知识点
  • ORM 框架的优缺点分析
  • QSS 的选择器
  • 端午时节,粽香四溢
  • 国密算法简述