从上一小章节我们知道缓存一致性是在不同节点上的不同Oracle实例之间保持缓冲区的多个副本一致的技术。当实例A需要修改数据块时,它从磁盘读取bock,在读取之前必须通知GCS(DLM)。GCS保存跟踪数据块的当前状态,即实例A保持对数据块的独占锁信息。现在实例B想要修改同一个数据块,它必须通知GCS,然后GCS将请求实例A释放锁。GCS需要确保实例B获得数据块的最新版本(包含实例A的修改信息),最后实例B获得对该数据块的独占锁定。需要注意的是:在任何一个时间点,只有一个实例具有块的当前版本,Oracle以此来保持块的完整性。


GCS通过跟踪每个块的所有锁状态来保持数据的一致性和协调性,并且这些锁状态可以被RAC中的任何节点读/写。很多时候我们可以认为GCS是一个内存中的数据库,它保存数据块上当前锁和等待获取锁的实例的信息等,这也可以称为并行缓存管理(PCM)。全局资源管理器(GRM)有助于RAC中实例之间的协调和通信,响应来自Oracle进程的锁请求。每个实例在其SGA中都有一个buffer cache,以确保集群中的每个实例都能满足查询或事务所需的块。RAC有GCS和GES两种类型的服务,它们协同使用GRD维护每个数据文件和每个缓存块的锁状态记录。RAC环境中的全局资源是集群中所有节点都可见的资源,数据缓冲区缓存块是最常用和最重要的全局资源。通常情况下我们认为GCS处理数据缓冲区缓存块,GES处理所有非数据块资源。


全局缓存服务(GCS):

全局缓存主要服务于数据块(PCM资源)。GCS负责维护全局缓冲存储区内的缓存一致性,包括:数据块的状态,数据块的位置,数据块的传输等。GCS确保一个实例在任何时刻想修改一个数据块时,都可获得一个全局锁资源,从而避免另一个实例同时修改该块的可能性。进行修改的实例将拥有块的当前版本(包括已提交的和未提交的事物更改)以及块的一致性拷贝。如果另一个实例也请求该块,那么GCS要负责跟踪拥有该块的实例、拥有块的版本是什么,以及块处于何种模式。LMS进程是GCS的实现。


全局队列服务(GES):

全局排队服务(GES)跟踪所有Oracle队列机制的状态(No-PCM资源),它主要负责维护数据字典缓存(dictionary cache)和库缓存(library cache )的一致性和事务并发执行的一致性控制。dictionary cache是实例的SGA内所存储的对数据字典信息的缓存。由于数据字典信息存储在内存中,因而在某个节点上对数据字典进行的修改(如DDL)必须立即被传播至所有节点上的dictionary cache。GES负责处理上述情况,并消除实例间出现的差异。同时,为了不影响依赖这些对象的SQL语句的解析,数据库内对象上的库缓存锁会被去掉。这些锁必须在实例间进行维护,而全局队列服务必须确保请求访问相同对象的多个实例间不会出现死锁。LMON、LCK和LMD进程联合工作来实现全局队列服务的功能。GES是除了数据块本身的维护和管理(由GCS完成)之外,在RAC环境中协调节点间其他资源的重要服务。


全局资源目录(GRD):

GES和GCS共同维护全局资源目录(GRD)。GRD类似于内存中的数据库,其中包含有关缓存中存在的所有块的详细信息。GRD知道块的最新版本的位置、块的模式、块的角色等。当用户请求任何数据块时,GCS从GRD获取所有信息。RAC会给每一个资源(数据块)选择一个节点作为它的Master Node,而其他节点作为Shadow Node。Master Node的GRD中记录了该资源在所有节点上的使用信息,而shadow node的GRD只需要记录资源在该节点上的使用信息。GRD存储在SGA中,GRD是一个分布式资源,这意味着每个实例维护GRD的某些部分。GRD的这种分布特性是RAC容错的关键。


块过去镜像(Past Image):

为了保持数据完整性,Oracle引入了Past Image概念。在Oracle数据库中,块被弄脏后不会立即写入磁盘。这是为了减少过多的IO操作。在RAC环境中,当其他实例以读写目的请求同一个脏块时,拥有该块的实例会创建该块的镜像(PastImage),然后将该块发送给请求实例。此块的镜像副本称为过去镜像(PI)。如果出现故障,Oracle可以通过读取PI来重建块。根据块在脏阶段被弄脏的次数,可以有超过1个PI块。块的Past Image与CR(一致读)镜像不同。Past Image是通过应用undo来创建,然后将其转换为CR镜像。


后台进程(Background Process):

每个节点都有自己的后台进程和内存结构,在RAC环境下有更多的进程来管理共享资源,这些额外新增的进程就是用来协调节点间缓存的一致性。


LMS(Global Cache Service Process):

LMS是整个Cache Fusion体系最活跃和最忙碌的进程。它负责维护GRD中的数据块资源信息,处理在实例之间传输的块的一致副本。LMS进程接收响应来自LMD的执行锁操作的请求,响应对GCS资源的锁管理服务请求,并将它们发送到服务队列。此外它还承担全局死锁的检测任务并监控锁转换是否超时。所以一般在压测或者高cpu消耗型系统,可以提高这个进程的优先级,以确保不会出现CPU不足的情况。可以通过查看x$kjmsdp查看这个守护进程的统计信息。


LMD(Global Enqueue Service Daemon):

LMD进程主要负责响应GES,也就是Oralce中的排队资源的管理工作。每一个全局队列的当前状态存储在相应的实例共享内存(sharedpool)中。当一个会话发出了global enqueue 请求时,首先本节点的LMD0进程会响应这个请求,LMD0进程开始寻找这个enqueue资源的master节点。找到后将这个请求发送给master节点,如果需要的话,master节点会增加一个新的master资源。从mater节点可以知道资源的owner和waiter,当这个资源被授予请求实例后,master节点的LMD0会通知请求实例的LMD0,最后请求实例的LMD0通知前台进程。此外LMD还有一个功能就是死锁检测及处理基本流程如下:1. LMD进程定期搜索各个实例的锁信息,发现可能的死锁。2. 在可能的死锁进程被发现之后,LMD会验证死锁。3. 在得到验证之后,LMD会选择回滚导致死锁的进程的当前SQL语句,来打破死锁。


LMON(Global Enqueue Service Monitor):

LMON主要负责整个数据库集群层面的一致性关系(CGS),监控整个集群的全局队列和资源。在进程出现问题的情况下会执行global enqueue 恢复,保持GCS内存结构的一致性,并且它还负责集群重新配置和锁重新配置(节点加入或离开),当一个实例加入或者离开集群后,LMON会对lock和resource进行reconfiguration.另外LMON会在不同的实例间进行通讯检查,如果发现对方通讯超时,就会发出节点eviction。LMON主要也是借助两种心跳机制来完成健康检测。节点间的网络心跳(Network Heartbeat)即节点间定时发送Ping包检测节点状态,超时时间由参数_cgs_send_timeout控制,缺省是300秒,这时的重构是IMR触发的。通过控制文件的磁盘心跳(ControlfileHeartbeat):每个节点的CKPT进程每隔三秒更新一次控制文件的一个数据块,这个数据块叫做Checkpoint Progress Record,由于控制文件是共享的,因此实例间可以相互检查对方是否及时更新以判断状态,时间由参数_controlfile_enqueue_timeout控制,缺省是900秒也是由由IMR触发的。


LCK(Instance Enqueue Process):

LCK主要负责实例锁,可以认为他是LMD进程的完善补充。它主要处理在本实例层的锁(Row Cache ,Library Cache,Result Cache),这些实例级的锁的owner, waiter是LCK0进程。RAC环境中如果本地的实例没有拥有这个lock,那么需要申请这个lock,前台进程会等待的等待事件就是我们常遇到的DFS Lock Handle。实例级别的锁是有LCK进程通过广播的方式进行管理的。


DIAG(Diagnostic Capture Process):

DIAG守护进程是一个轻量级进程,它使用diag框架来监视集群的运行状况。它捕获信息,以便在发生故障时进行后续诊断。diag进程会响应别的进程发出的dump请求,将相关的诊断信息写到diag trace文件中。在RAC上,当发出global oradebug请求时,会由每个实例的diag进程来打印诊断信息到diag trace中。


PING(Interconnect Latency MeasurementProcess):

PING进程(11g引入)用来检查集群中各个实例间的私网通讯状况。每个实例每隔几秒会发送给其它实例一些消息,这些消息会由其它实例的PING进程收到。发送和接收信息花费的时间会被记录下来并判断是否正常。


LMHB:(Global Cache/Enqueue ServiceHeartbeat Monitor):

LMHB进程(11g引入)监控本地的LMON, LMD, LCK0,RMS0 , LMSn等进程是否运行正常,是否被阻塞或者已经hang了。


| 作者简介

刘金龙·沃趣科技高级数据库技术专家

多年Oracle海量数据以及高并发数据库管理工作经验,主要负责Oracle数据库产品及售后二线支撑。精通Oracle 11g及12c内部运行机制,有丰富的基于全方位技术栈的数据库及RAC集群层故障诊断、性能调优、OWI、数据库备份恢复及迁移经验。





沃趣科技,让客户用上更好的数据库技术!