在实际应用中,一个资源的申请过程只会涉及两个实例(例如:资源的申请节点和主节点是同一个节点或资源的主节点和持有者节点是同一个节点),或者一个实例(3个节点都是一个节点),因此在RAC数据库中的3路申请或2路申请指一个资源申请的过程需要涉及3个节点或2个节点。
总结:LMS负责协调实例间数据块的传递,LMD负责协调全局锁,LCK负责协调实例锁。
消息(Message)
消息是RAC实例之间通信的实现方式,RAC中与内存融合相关的信息都是通过消息的方式进行传输的,消息可以分成两类:一类是需要立即进行传递而且要被及时反馈的消息(申请消息),另一类是可以异步发送的消息(当申请者获得了资源之后,向主节点发送的资源更新消息)。
流量控制(Flow Control)
请求端在发送消息时,就必须持有一个ticket,响应端在发送响应消息的同时也会把响应端的有效ticket数据一起发送,请求端在接收到这个ticket数据之后会进行判断,如果响应端的ticket数量小于请求端的有效ticket数量,那么请求端会暂停一段时间再发送消息,反之,请求端继续发送消息。
DRM(Dynamic Remastering)
一个四节点的RAC数据库,会有1/4的数据块的主节点信息被保存到每一个实例,同时也意味着一个节点访问数据块时有3/4的概率需要从远程节点获得该数据块的锁信息,这意味着会出现更多的2路或3路通信,从而造成更多的消息通信。在实际的应用中,一些数据块可能在非主节点上被访问很多次,而在主节点上却很少被访问,这种情况意味着会有大量的资源访问节点和资源主节点的消息产生,从而增加了私网的工作负载,影响数据库的性能。而DRM允许资源的主节点根据资源在各个节点的访问状态动态地调整。
通俗地说,如果联系一个节点就可以获取数据块,为嘛要联系多个节点呢。
DRM参数
_gc_policy_time:这个参数指定了Oracle统计每个节点对某个数据库对象访问次数的时间间隔,默认值为10分钟。
_gc_policy_minimum:这个参数指定了每分钟数据库对象至少要被访问多少次,才考虑修改它的主节点信息,默认值1500。
_gc_affinity_ratio:这个参数指定了当一个节点访问某一个数据库对象的次数超过了所有其他节点访问相同数据库对象的多少倍时,才考虑修改它的主节点信息,默认值50。
因此DRM发生的条件是:当在一段时间内(_gc_policy_time),如果一个数据库对象每分钟被访问的次数超过了一个阈值(_gc_policy_minimum),并且某一个节点访问该对象的次数超过了所有其他节点的访问次数的50倍(_gc_affinity_ratio),那么Oracle会陆续地(以windows为单位)将这个数据库对象对应的数据块的主节点信息迁移到访问次数最多的节点。
DRM迁移的是数据块的主节点信息,而不是将数据块的最新版本copy到访问次数最多的节点。
DRM由LMON,LMS,LMD,LCK进程协同工作,将数据块资源的主节点信息从一个节点迁移到另一个节点。