Oracle RAC 并发与架构

本文详细解析了Oracle RAC数据库并发处理机制及其架构,包括CacheFusion、GRD、后台进程、文件系统、SCN系统变化号、CacheFusion与GCS/GES的关系,以及RAC环境下SGA的变化和文件管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.RAC并发

RAC的本质是一个数据库,运行在多台计算机上的数据库,它的主要任务是数据库就是事务处理,它通过DistributedLockManagement(DLM:分布式锁管理器)来解决并发问题。因为RAC的资源是共享的,为了保证数据的一致性,就需要使用DLM来协调实例间对资源的竞争访问。RAC的DLM就叫作CacheFusion

DLM中,根据资源数量,活动密集程度,把资源分成两类:CacheFusionNon-CacheFusion

CacheFusionResource指数据块这种资源,包括普通数据库,索引数据库,段头块(SegmentHeader),undo数据库。

Non-CacheFusionResource是所有的非数据库块资源,包括数据文件,控制文件,数据字典,LibraryCachesharePoolRowCache等。RowCache中存放的是数据字典,它的目的是在编译过程中减少对磁盘的访问。

CacheFusion中,每一个数据块都被映射成一个CacheFusion资源,CacheFusion资源实际就是一个数据结构,资源的名称就是数据块地址(DBA)。每个数据请求动作都是分步完成的。首先把数据块地址X转换成CacheFusion资源名称,然后把这个CacheFusion资源请求提交给DLMDLM进行GlobalLock的申请,释放活动,只有进程获得了PCMLock才能继续下一步,即:实例要获得数据块的使用权。

CacheFusion要解决的首要问题就是:数据块拷贝在集群节点间的状态分布图,这是通过GRD实现的。

GRD(GlobalResourceDirectory

可以把GRD看作一个内部数据库,这里记录的是每一个数据块在集群间的分布图,它位于每一个实例的SGA中,但是每个实例SGA中都是部分GRD,所有实例的GRD汇总在一起就是一个完整的GRD

RAC会根据每个资源的名称从集群中选择一个节点作为它的MasterNode,而其他节点叫作ShadowNodeMasterNodeGRD中记录了该资源在所有节点上的使用信息,而ShadowNodeGRD中只需要记录资源在该节点上的使用情况,这些信息实际就是PCMLock信息。PCMLock3个属性:ModeRolePI(PastImage)

二.RAC架构

2.1SGA的变化

和传统的单实例相比,RACInsanceSGA最显著的变化就是多了一个GRD部分。Oracle中的数据操作都是在内存的SGA区完成的,和传统的单实例不同,RAC是有多个,每个数据块可以在任何一个InstanceSGA中都有拷贝,RAC必须知道这些拷贝的分布版本,状态,而GRD就是这些信息的内存区。

GRD虽然位于SGA中,但是不像BufferCache或者LogbufferSGA组件,有明确的参数来对应,每个节点中都只有部分GRD内容,所有的节点合在一起才构成完整的GRD.

2.2后台进程的变化

每个RAC的实例和传统的单实例一样,都有DBWR,LGWR,ARCnCKPT这些后台进程,除了这些进程外,每个实例还增加了若干RAC特有的进程,要注意的是,这些进程名称和进程提供的服务名称差异很大,比如LMS进程提供的是GCS服务,很不便与记忆,造成这种现象的原因是进程名称从9i之前的OPSRAC前身)延续下来的,但是服务却已经在RAC中重新设计并命名。

2.2.1LMSn

这个进程是CacheFusion的主要进程,负责数据块在实例间的传递,对应的服务叫作GCS(GlobalCacheService),这个进程的名称来源与LockManagerService。从Oracle9开始,Oracle对这个服务重新命名成GlobalCacheSErvice,但是进程名字确没有调整。这个进程的数量是通过参数GCS_SERVER_PROCESSES来控制,缺省值是2个,取值范围为0-9.

2.2.2LMD

这个进程负责的是GlobalEnqueueServiceGES),具体来说,这个进程负责在多个实例之间协调对数据块的访问顺序,保证数据的一致性访问。它和LMSn进程的GCS服务还有GRD共同构成RAC最核心的功能CacheFusion

2.2.3LCK

这个进程负责Non-CacheFusion资源的同步访问,每个实例有一个LCK进程

2.2.4LMON

各个实例的LMON进程会定期通信,以检查集群中各个节点的健康状态,当某个节点出现故障时,负责集群重构,GRD恢复等操作,它提供的服务叫作:ClusterGroupServicesCGS)。

LMON主要借助两种心跳机制来完成健康检查:

1)节点间的网络心跳(NetworkHeartbeat):可以想象陈节点间定时的发送ping包检测节点状态,如果能在规定时间内收到回应,就认为对方状态正常

2)通过控制文件的磁盘心跳(ControlfileHeartbeat):每个节点的CKPT进程每隔3秒更新一次控制文件一个数据块,这个数据块叫作CheckpointProgressRecord,控制文件是共享的,所以实例间可以相互检查对方是否及时更新来判断。

2.2.5DIAG

DIAG进程监控实例的健康状态,并在实例出现运行错误时手机诊断数据记录到alert.log文件

2.2.6GSD

这个进程负责懂客户端工具,比如srvctl接收用户命令,为用户提供管理接口。

2.3文件

Oracle文件包括二进制执行文件,参数文件(pfilespfile),密码文件,控制文件,数据文件,联机日志,归档日志,备份文件。

2.3.1spfile

这个参数文件需要被所有节点访问,需要放在共享存储上

2.3.2RedoThread

RAC环境下有多个实例,每个实例都需要有自己的一套Redolog文件来记录日志。这套RedoLog就叫作一个RedoThread,其实单实例下也是RedoThread,只是Thread这个词很少被提及,每个实例一套RedoThread的设计就是为了避免资源竞争造成性能瓶颈。

RedoThread有两种,一种是Private的,创建语法:alterdatabaseaddlogfile..Threadn;另一种是public,创建语法:alterdatabaseaddlogfile...;RAC中每个实例都要设置thread参数,该参数默认值为0.如果设置了这个参数,则实例启动时,会使用等于该ThreadPrivateRedoThread。如果没有设置这个参数,则使用缺省值0,启动实例后选择使用PublicRedoThread,并且实例会用独占的方式使用该RedoThread

RAC中每个实例都需要一个RedoThread,每个RedoLogThread至少需要两个RedoLogGroup,每个LogGroup成员大小应该相等,每组最好有2个以上成员,这些成员应放在不同的磁盘上,以避免单点失败。

要注意的是,在RAC环境下,RedoLogGroup是在整个数据库级别进行编号的,比如实例1123三个日志组,那么实例2的日志组就应该从4开始编号,不能在使用123这三个编号。

RAC环境下,所有实例的联机日志必须放在共享存储上,因为如果某个节点异常关闭,剩下的节点要进行CrashRecovery,执行CrashRecovery的这个节点必须能够访问到故障节点的连接日志,只有把联机日志放在共享存储上才能满足这个要求。

2.3.3ArchivedLog

RAC中的每个实例都会产生自己的归档日志,归档日志只有在执行MediaRecovery时才会用到,所以归档日志不必放在共享存储上,每个实例可以在本地存放归档日志。但是如果在单个实例上进行备份归档日志或者进行MediaRecovery操作,又要求在这个节点必须能够访问到所有实例的归档日志,在RAC环境下,配置归档日志可以有多种选择。

1)使用NFS

这种方式实际是归档到共享存储,比如2个节点,每个节点都有2个目录,Arch1Arch2分别对应实例1和实例2的日志。每个实例只配置一个归档位置,归档到本地,然后通过NFS把对方的目录挂到本地。

2)实例间归档(CIA:CrossInstanceArchive

这种方式是上一种方式的变种,也是比较常见的一种配置方法。两个节点都创建2个目录Arch1Arch2分别对应实例1和实例2产生的归档日志。每个实例都配置两个归档位置。位置1对应本地归档目录,位置2对应另一个实例。

3)使用ASM

这种方式也是归档到共享存储,只是通过Oracle提供的ASM,把上面的复杂性隐藏了,但原理都一样。

2.3.4UndoTablespace

RedoLog一样,在RAC环境下,每个实例都需要有一个单独的回滚表空间,这个是通过参数SID.undo_tablespace来配置的。

2.4SCN(SystemChangeNumber)

SCN是Oracle用来跟踪数据库内部变化发生的先后顺序的机制,可以把它想象成一个高精度的时钟,每个Redo日志条目,UndoDataBlockDataBlock都会有SCN号。OracleConsistent-ReadCurrent-ReadMultiversion-Block都是依赖SCN实现。

RAC中,有GCS负责全局维护SCN的产生,缺省用的是LamportSCN生成算法,该算法大致原理是:在所有节点间的通信内容中都携带SCN,每个节点把接收到的SCN和本机的SCN对比,如果本机的SCN小,则调整本机的SCN和接收的一致,如果节点间通信不多,还会主动地定期相互通报。故即使节点处于Idle状态,还是会有一些Redolog产生。还有一个广播算法(Broadcast),这个算法是在每个Commit操作之后,节点要想其他节点广播SCN,虽然这种方式会对系统造成一定的负载,但是确保每个节点在Commit之后都能立即查看到SCN.

这两种算法各有优缺点,Lamport虽然负载小,但是节点间会有延迟,广播虽然有负载,但是没有延迟。Oracle10gRAC缺省选用的是BroadCast算法,可以从alert.log日志中看到相关信息:

PickedbroadcastoncommitschemetogenerateSCNS

RedoLogCheckpoint和SCN关系

http://blog.youkuaiyun.com/xujinyang/article/details/6829693

2.5CacheFusion,GCSGES关系

CacheFusion(内存融合)是通过高速的PrivateInterconnect,在实例间进行数据块传递,它是RAC最核心的工作机制,它把所有实例的SGA虚拟成一个大的SGA区。每当不同的实例请求相同的数据块时,这个数据块就通过PrivateInterconnect在实例间进行传递。

整个CacheFusion有两个服务组成:GCSGESGCS负责数据库在实例间的传递,GES负责锁管理

注:本文整理自《大话OracleRAC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值