RAC资源调度



http://www.itpub.net/thread-1106961-1-1.html

1.        RAC资源调度概述
  集群操作需要在所有的节点间进行同步来控制对共享资源的访问,在一个集群数据库里面RAC使用全局资源目录(Global Resource Directory)来记录怎样使用资源的信息,全局缓存服务(Global Cache Service (GCS))和全局队列服务(Global Enqueue Service (GES))管理其中的目录信息。每个实例在SGA里维护一部分全局资源目录。
  RAC调度资源既在一个实例级又在一个集群数据库级发生。RAC中的实例级资源调度也就是本地资源调度,集群级调度也就是全局资源调度。
  在一个集群数据库中本地资源调度进程同一个单实例本地资源调度进程是一样的,这就意味着行和数据块级访问、空间管理、生成SCN、数据字典缓存和库缓存管理在RAC中是和单实例数据库一样的。
1.1.        全局资源目录的内容
每个实例的全局资源目录的一部分包含当前共享资源状态的信息,oracle在实例失败或集群重配置是也使用这些信息。
在全局资源目录中的共享资源信息内容包括以下类型:
•        数据块标识符, 例如一个数据块地址
•        当数据块被集群中的多个节点读到数据缓冲区以后,最近版本的数据块的位置。
•        数据块被实例所拥有的模式:
  (N) Null空, (S) Shared共享,(X) Exclusive排他
•        数据块正在被每个实例所拥有的角色:
  Local本地或global全局
1.2.        RAC同步过程
  当一个实例请求一个资源,例如一个数据块;RAC来管理实例如何获得这个数据块。如果这个数据块被一个或多个节点稍后修改,那么Oracle执行在一个全局级别的同步,来允许集群访问这个共享的数据块。在这种情况下同步请求内部节点消息来为读一致性和在集群数据库内传输数据块的拷贝做准备。
当一个或多个实例请求一个被另一个实例更新了的数据块的时候,全局缓存服务进程(Global Cache Service Processes (LMSn))定位,准备,并且传输最近的数据块镜像。GES通过内部连接传输内部节点消息来调度GCS处理的过程。
注意:在节点内部oracle利用共享存储器,所以不需要传递消息
尽管如此,在RAC中一些本来的本地调度变成全局调度:当远程的实例请求本地拥有的资源时候。这尤其是在以下要描述的队列和以前的数据块镜像上。
1.3.        队列(Enqueues)
队列是一个内存结构:对应行的一连串更新。只有当另一个实例请求资源的时候队列才被分配。
你不必配置全局队列,他们的号是在启动的时候自动计算出的而且oracle在alert.log文件中记录了计算出的值。
1.4.        过去的镜像(Past Images)
过去的镜像是oracle维护的脏数据块的拷贝,直到脏数据的版本信息写完。GCS管理过去的镜像并且GCS失败恢复时利用他们。
2.        资源模式和角色
作为一个内部实例数据块的传输的结果,同样的数据块会在多个缓存中存在。数据块也可以被多个实例拥有在不同模式下,这取决于拥有数据块的实例是否修改数据或者只是读里面的内容。GCS利用模式和角色来调度资源,例如共享数据块,它们在以下标题中被描述:
        资源模式
        资源角色
2.1.        资源模式
一个资源模式确定资源拥有者是否能修改这个资源。
全局缓存资源模式
资源模式        标识符        描述
Null        N        在这个资源级别下无访问权限
Shared        S        一个保护性读,当在这个资源级别下实例不可以修改它. 多个实例可以读这个资源.
Exclusive        X        在这个资源级别下, 它授权实例对这个资源进行排他访问. 其他实例不能写这个资源. 一致性读旧资源有可能是依然有效的.(旧资源存在的话)

2.2.        资源角色
Oracle为拥有这个资源的实例分配一个角色。角色可以是本地或者全局两者之一。本地到全局角色的转变按照以下步骤:
        当一个数据被一个实例首先读到了缓存并且其他的实例还没有读这个块,这数据块是本地管理。GCS因此给这个数据块分配一个本地角色。
        如果这个数据已经被本地实例修改并且传输给其他实例,这时它被认为是全局管理并且GCS给这个数据块它分配一个全局角色。
如果资源仅存在一个实例中,那么所有的资源都拥有本地角色。如果一个数据块在一个实例中被修改并且随后传输到其他实例,然后包含这脏数据块的缓存被认为是全局的脏块并且这个资源拥有了一个全局角色。

2.3.        全局资源服务操作
GCS跟踪数据块的位置、模式和角色。GCS因此也管理涉及相关资源的实例对这个资源的访问权限。Oracle利用GCS来保证缓存一致性,当当前版本的数据在一个实例的缓冲区并且另一个实例请求那个数据块进行修改。
如果一个实例,读这个数据块在一个排他模式,那么在这个实例内多个可以不利用GCS来共享访问一组数据块。然而这只是在这个数据块没有从本地缓存输出的情况下才是真实的。如果数据块已经从本地缓存传输出去,然后GCS在全局目录中更新这个资源为全局角色;至于这个资源是否从排他模式转换成其他模式,取决于其他的实例怎样使用这个资源。
2.4.        全局缓存服务实例
假设集群中的一个实例需要更新一个数据块,同时其他的实例也需要更新同样的数据块。没有GCS提供的缓存一致性,俩个实例就可以同时更新同样的数据块。
尽管如此,由于GCS控制着这个同步,只有一个实例能更改这个数据块,另一个实例必须等待。
为了保证在任何时候仅有一个实例能更新这个数据块,GCS维护这个缓存一致性。直到实例的事务完成之前,这个实例不必拥有这个数据块在一个排他模式。
例如:一个实例可以修改一个数据块中的一行同时另一个实例的事务也在修改同一个数据块的另一行,但是还没有提交这个改变。
2.5.        缓存一致性和全局缓存服务
当一个实例修改数据库中的数据块之前,GCS保证这个实例是在一个集群的范围内获得一个资源。因此,GCS同步全局缓存访问,仅允许在一个时间点仅有一个实例能修改这个数据块。
Oracle的多版本体系结构区别于当前数据块和一个或多个读一至性版本的数据块。当前数据块包含所有提交的改变和将要被提交的事务。
一个一致性读版本的数据块象征着在一个时间点的数据块快照。全局服务进程利用回滚段的信息来创建出一致性版本的过去的镜像。当前和一致性读的数据块都被GCS所管理。
如果一个实例请求一个已经被另一个实例更改过的数据块,那么拥有数据块的实例为这个数据块维护一个过去的镜像。在失败的情况下,oracle可以读取PI来重新构造出当前的和一致性读版本的数据块。
2.6.        SCN的处理过程
同步一个集群内的资源,特别是数据块,orale必须跟踪数据块的连续世代的改变。更确切的说,Oracle为每个版本的数据块分配一个数字标识符来记录这个改变。这使Oracle来产生顺序化的重做日志并且提供给以后的恢复处理。
Oracle使用一个逻辑的时间戳也就是一个系统改变号,来为每个实例和所有的实例中的数据块改变事件排序。这主要的SCNs的目的是通过对重做日记的条目进行标记来与恢复过程同步。
Oracle为每个事务分配一个SCN。从概念上讲,这是一个全局内产生的连续的SCNs.实际上。尽管如此,SCNs可以并行的读和产生。其中一个SCN产生模式叫做Lamport SCN Generation.。
在一个单实例Oracle中,SGA以一个排他模式维护一个已经挂载数据库的实例中的SCN的增长。在RAC中,SCN必须被全局维护并且通过平台执行改变。SCN能被GCS通过Lamport SCN generation 模式管理,或者通过硬件时钟,或者专门的SCN服务器。
2.7.        Lamport SCN Generation
Lamport SCN Generation模式是高效和可升级的,因为它在所有的实例中并行的产生SCNs。在这种模式下,所有实例中的信息都携带SCNs。多个实例可以并行的产生SCNs而不需要在实例之间进行额外的通信。
在大多数平台上,当MAX_COMMIT_PROPAGATION_DELAY参数比平台指定的阈值大的时候,Oracle利用Lamport SCN Generation模式。一般这个参数代表性的设置成7秒。注意:改变这个值也就改变了你集群中的SCN发生器。
当实例启动后,检查alert.log来确定是否启用了Lamport SCN generation模式。如果MAX_COMMIT_PROPAGATION_DELAY参数的值比这个阈值小,那么Oracle使用硬件时钟SCN产生模式。
3.        缓存熔接全局缓存服务
3.1.        缓存熔接处理过程概览
  默认来说,一个资源被分配给实例缓存的每个数据块。由于缓存熔接和消除了当其他实例请求修改数据块时硬盘写的发生,在实例之间管理共享数据的开销被大幅减少。缓存熔接的并发控制不仅提高了性能,并且减少了RAC环境中的管理负担。
缓存熔接专注于以下几个并发类型:
        多节点的并发读
        不同节点的并发读写
        不同节点的并发写
3.2.        多节点的并发读
当两个节点需要读同样的数据块是发生点节点的并发读。RAC不必为了解决这个情况进行同步,因为在没有缓存一致性冲突的情况下,多个实例可以读这个共享的数据块。
3.3.        不同节点的并发读写
当一个实例请求读的数据块已经被另一个实例修改并且还没有写到磁盘上,这个请求可以是当前版本的数据块或是一致性读的数据块,在这种情况下,全局缓存进程通过内部连接把数据块从拥有数据块的实例缓存中传输到请求实例的缓存中。
3.4.        不同节点的并发写
不同节点的并发写发生在不同的实例修改相同的数据块。在这种情况下,把持实例完成它的工作之前需要收到一个关于该数据块的请求,GCS然后转换这个数据块的资源为全局管理模式并且LMSn给请求实例传输一个数据块的拷贝。这个过程的主要情节如下:
        GCS跟踪每一个版本的数据块,并且每个版本就是提到的一个过去的镜像(PI).万一失败,Oracle利用PI的信息来重建当前版本的数据块。
        这缓存到缓存的传输通过高速的IPC内部链接完成,因此避免了磁盘I/O。
        缓存熔接限制了上下文交换的数量,因为它简化了往返信息。减少上下文交换的数量是缓存一致性协议的效率更加高效。数据库写进程不影响缓存熔接数据块的传输。
3.5.        写协议和过去的镜像跟踪
当一个实例为了修改而请求一个数据块的时候,LMSn从最后一个修改数据块的实例中发送该块到请求的实例。此外,LMSn进程在最初的把持例中保留一个这个数据块的PI。
只有缓存复位和执行检查点期间才触发写盘。例如,考虑这种情况,一个实例发起一个写数据块的动作并且这个数据块拥有全局角色。但是,这个实例仅仅拥有该块以前的镜像并且在缓存中不是最当前的。综合以上情况,这个实例通知GCS,GCS给把持最当前数据块的实例发送写请求。然后把持实例给GCS发送一个完成信息。最后,所有的实例清空这个数据块的PI。
3.6.        资源控制, Cache-to-Cache 传输, 缓存一致性
GCS为读到实例高速缓存里的数据块分配和打开资源。当资源不再管理任何缓存或者由于缓存替换而触发写盘的时候,oracle关闭资源。当Oracle关闭一个资源,它把这个资源返回给Oracle能分配新资源的资源列表中。
3.7.        块访问模式 和缓存状态
一个另外的并发控制概念是缓存状态:一个实例中的本地缓存的缓存状态。
缓存的状态涉及到数据块的访问模式。例如,如果一个缓存的状态是排当前,一个实例拥有这个资源在排他模式。
查看缓存的状态,查询V$BH中的STATUS列,V$BH视图提供数据块的状态,关于数据块的访问模式和它们的缓存状态的名字如下:
        NULL-CR:一个实例可以对这个数据块执行一致性读,也就是说,如果这个实     
例拥有一个老版本的数据块。
        S-SCUR:一个实例已经共享的访问数据块并且只能执行读。
        X-XCUR:一个实例有排他的访问数据块并且能修改它。
        NULL-PI:一个实例改变了这个数据块但是为了记录以前的状态而保留了以前镜像。
只有SCUR和PI缓存状态是RAC指定的。在任何时候的RAC里只有一个数据块的拷贝状态是XCUR状态。去执行修改数据块的时候,必须为包含数据块的缓存分配一个XCUR状态。
例如,如果其他的实例请求访问最当前版本的数据块,那么Oracle改变访问模式从排他到共享,发送一个当前读版本的数据块给请求的实例,并且保存一个PI缓存,如果这个缓存包含一个脏数据块。
在这一点上,第一个实例有当前读版本数据块并且另一个实例也拥有当前数据块在共享模式。因此,这资源的角色变成全局。这样在任何时刻多个SCUR版本的数据块通过RAC被缓存起来。
4.        缓存熔接设想
以下的设想举例说明了缓存熔接处理过程的关键点。这些设想没有指出所有的配置。例如,这个设想没有描述读一致性。这节中的设想是:
        为了修改请求一个改变的块
        向磁盘写数据块
4.1.        为了修改操作请求一个改变的块
图4-1的设想数据块已经被修改,或者脏的,仅有一个实例以排他模式(X)把持它.此外,这个情节假定实例访问的数据块已经改变。也就说,它在集群范围内只有一份拷贝。换句话说,这数据块拥有一个本地角色。

1.        实例1试图修改这个数据块,给GCS提交一个请求。
2.        GCS传输这个请求给把持者实例2。
3.        实例2收到这条消息并且LMS进程发送数据块给实例1.发送数据块之前,实例2中的资源从排他降级为NOLL模式并且实例2以PI的形式保留脏块的缓存。这个角色转换为全局,因为数据块可能在多个实例中变脏了。与数据块一起,实例2与请求的实例通信来告知实例2拥有一个NOLL模式的PI。在这同一消息中,实例2也指定请求者保持这数据块在排他(X)模式和拥有一个全局角色。
4.        当收到这个数据块,实例1通知GCS它把持这个数据块在全局角色的排他模式。注意在资源授权给实例1之前,数据块不会被写到磁盘里。
4.2.        写数据块到磁盘
图4-2的场景举例说明一个实例怎样处理由于请求空闲的缓冲区时在任何时候执行检查点或者替换高速缓冲器中的缓存。因为集群中的实例的高速缓冲器中存在多个版本的改变的数据块,被GCS管理的写协议确定只有最当前版本的数据块被写到磁盘里。它也确保所有以前的数据块从其他的高速缓冲器中删除。一个写请求可以在拥有当前的或者过去的镜像的任何一个实例上发生。在这个场景中,假设这实例把持一个过去的缓冲的镜像在NOLL模式请求,Oracle请求把这个缓冲写到磁盘上。

1.        实例2发送一个写请求给GCS。
2.        GCS转发这个请求个实例1-当前块的把持者。
3.        实例1收到这个写请求而且把这个数据块写到磁盘里。
4.        实例1把这个完成记录发给GCS然后通知GCS这个资源角色可以变成本地,因为实例1写入了当前的块。
5.        收到这给通知后,GCS命令所有的PI把持者删除,或者清空它们的PIs;恢复不在需要PIs.缓冲区释放并且以前拥有的NOLL模式被关闭。
4.3.        RAC恢复和缓存熔接
在RAC恢复过程中,恢复进程的数量与失败节点的数量是成比例的。一般来说数据块恢复完成后很快变成有效。
当一个实例失败或者失败者是被另一个实例删除的,Oracle执行以下恢复步骤:
1.        在恢复过程中,第一个阶段就是GES重配置,Oracle首先重新配置GES队列。然后Oracle重新配置GCS资源。在这时候,所有的GCS资源请求和写请求被临时暂停。尽管如此,进程和事务能继续修改数据块,只要那些进程和事务已经申请到需要的队列。
2.        GES控制的队列重新配置完成后,一个日志读和GCS资源重制并行发生。在最后一步,恢复的数据块所需的资源已经确定了。
3.        恢复所需的缓存空间和从先前正在读的日志中获取恢复所需的资源。然后,假定被恢复的PI在集群数据库中其他缓存中,从其他实例中请求缓存资源。从恢复缓冲区的起点被分配一个特殊的锁。
4.        为下一步操作所需的所有的资源和队列请求在全局资源目录中,开始释放。任何不需要回复的数据块现在可以被访问了。注意系统已经可以部分可用了。
5.        在第二步确定的在缓存中需要恢复的和需要写入的每个数块,恢复数据块后立即释放恢复资源,这样高速缓冲器恢复处理的数据块更多的数据块变成可用。
6.        当所有的数据恢复完成并且恢复资源已经被释放,系统再次变成完全可用。恢复的数据块在恢复完成后已经可用了。
概括来说,在完全恢复数据库之前,恢复的数据库或者恢复的部分数据库已经变成可用状态了。这使得系统尽早的可用并且使恢复变成可升级的。
如果在依然存在的实例的PI缓冲器中没有任何数据块,然后Oracle为失败的实例执行一个日志合并,日志合并的性能开销取决于失败实例的节点数和日志的大小。因此你可以利用检查点的特性控制重做日志。在它的高级规划,RAC可以恢复可以处理多个同时发生的失败和一连串的失败。共享服务的特性也为实例失败恢复提供了弹性。
5.        通过全局队列服务调度资源
这章描述了GES在集群RAC中如何执行内部实例资源调度消息。GES调度的内部实例包括资源,数据和内部实例数据请求。总体包括:
        全局队列服务处理过程
        全局队列并发控制
        通过GES管理资源
5.1.        全局队列服务处理过程
GES管理所有的非缓存熔接的内部实例资源操作和跟踪所有的Oracle队列机制的状态。GES为一个以上的实例管理资源。GES控制的主要资源是字典缓存锁和库缓存锁。GES管理的关于实例之间的资源进行的通信。尽管如此,那些资源不保护数据文件块。GES也执行探测所有的对死锁敏感的队列和资源。
5.2.        全局队列并发控制
Oracle数据库的其他部分也全局保护他们的数据结构。这些部分包括:
        数据字典访问层
        库缓存层
        传输管理代码层
每个层都有指定的协议来让其他层访问他们各自的数据结构。Oracle所有的层使用GES API的服务来访问,转变,释放在他们层上的资源。当一个实例启动的时候,GES使用影响全局队列资源的参数为队列资源管理操作自动计算所要求的内存。
在传输层,全局队列资源有时存在的时间非常短而且快速的释放。一般来说,例如当事务开始的时候有一个TX锁,提交的时候随即释放。有些情况下,它被用作事件的信号,例如像这种情况,执行DDL语句的时候库缓存锁可能是库缓存对象无效。一般来说,事务和表锁的处理过程在RAC和单实例中是一样的。下一节进一步的测试GES管理的资源。
5.3.        全局队列管理的资源
这节解释Oracle怎样利用GES的排队功能,来管理为RAC环境中事务,表和其他实例并发的资源。以下的资源位于单实例的数据库,但是在全局被GES控制。
        字典缓存锁
        库缓存锁
5.4.        字典缓存锁
每个RAC数据库实例有一个字典缓存,或者行缓存,包含数据字典信息。数据字典的结构在RAC中和在单实例中是一样的。尽管如此,在一个RAC中,Oracle在集群中同步所有的字典缓存信息。就像在单实例数据库中,RAC也是利用栓锁来做这些事情。
考虑在一个5个节点环境的RAC中,用户删除在一个节点上删除了一个表。因为5个节点有5份字典缓存,当节点删除表的时候,它的缓存必须通知其他4节点的字典缓存删除这个表的定义。RAC利用GES自动管理这些信息。
5.5.        库缓存锁
当一个数据库对象,例如表,视图,过程,包或索引,被SQL,DML.DDL,PL/SQL或者JAVA语句引用的时候,语句分析需要给他们进行加锁。在Oracle9i,Oracle加锁直到解析和编译完成或者解析调用。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值