5. RAC

5.1   集群环境下的一些特殊问题 

5.1.1 并发控制

在集群环境中,关键数据通常是共享存放的,比如放在共享磁盘上。 而各个节点的对数据有相同的访问权限,这时就必须有某种机制能够控制节点对数据的访问。
Oracle RAC  是利用DLM(Distribute Lock Management)  机制来进行多个实例间的并发控制。 

5.1.2 健忘症(Amnesia) 

集群环境配置文件不是集中存放的,而是每个节点都有一个本地副本,在集群正常运行时,用户可以在任何节点更改集群的配置,并且这种更改会自动同步到其他节点。
有一种特殊情况:节点A  正常关闭,在节点 B上修改配置,关闭结点 A,启动结点B。这种情况下,修改的配置文件是丢失的, 就是所谓的健忘症。 

5.1.3 脑裂(Split Brain)

在集群中,节点间通过某种机制(心跳)了解彼此的健康状态,以确保各节点协调工作。假设只有"心跳"出现问题,各个节点还在正常运行, 这时,每个节点都认为其他的节点宕机了,  自己是整个集群环境中的"唯一建在者",自己应该获得整个集群的"控制权"。 在集群环境中,存储设备都是共享的,这就意味着数据灾难,这种情况就是"脑裂" 

    解决这个问题的通常办法是使用投票算法(Quorum Algorithm).  它的算法机理如下:

    集群中各个节点需要心跳机制来通报彼此的"健康状态",假设每收到一个节点的"通报"代表一票。对于三个节点的集群,正常运行时,每个节点都会有 3票。当结点 A 心跳出现故障但节点 A 还在运行,这时整个集群就会分裂成 2 个小的partition。 节点 A 是一个,剩下的 2 个是一个。 这是必须剔除一个 partition 才能保障集群的健康运行。   
        
    对于有 3个节点的集群,A  心跳出现问题后,B 和C是一partion,有2 票,A 只有 1 票。 按照投票算法,B 和 C组成的集群获得控制权,A 被剔除。

    如果只有 2个节点,投票算法就失效了。因为每个节点上都只有1票。 这时就需要引入第三个设备:Quorum Device。Quorum Device  通常采用饿式共享磁盘,这个磁盘也叫作 Quorum disk。 这个Quorum Disk  也代表一票。 当 2个结点的心跳出现问题时,2个节点同时去争取 Quorum Disk  这一票, 最早到达的请求被最先满足。 故最先获得 Quorum Disk 的节点就获得 2票。另一个节点就会被剔除。
    
5.1.4    IO 隔离(Fencing)   
    当集群系统出现"脑裂"问题的时候,我们可以通过"投票算法"来解决谁获得集群控制权的问题。但是这样是不够的,我们还必须保证被赶出去的结点不能操作共享数据。

这就是 IO Fencing 要解决的问题。 

 IO Fencing实现有硬件和软件 2种方式:
        (1)软件方式:对于支持 SCSI Reserve/Release 命令的存储设备,可以用SG命令来实现。正常的节点使用 SCSI Reserve 命令"锁住"存储设备,  故障节点发现存储设备被锁住后,就知道自己被赶出了集群,也就是说自己出现了异常情况,就要自己进行重启,以恢复到正常状态。 这个机制也叫作  Sicide(自杀). Sun  和 Veritas 使用的就是这种机制。
        (2)硬件方式:STONITH(Shoot The Other Node in the Head), 这种方式直接操作电源开关,当一个节点发生故障时,另一个节点如果能侦测到,就会通过串口发出命令,控制故障节点的电源开关,通过暂时断电,而又上电的方式使故障节点被重启动, 这种方式需要硬件支持。

 5.2 RAC并发 

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

在DLM中,根据资源数量,活动密集程度,把资源分成两类:Cache Fusion和Non-Cache Fusion。 

    Cache Fusion Resource 指数据块这种资源,包括普通数据库,索引数据库,段头块(Segment Header),undo数据库。

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

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

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

 5.2.1   GRD(Global Resource Directory)

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

    RAC  会根据每个资源的名称从集群中选择一个节点作为它的Master Node,而其他节点叫作Shadow Node。  Master Node  的 GRD中记录了该资源在所有节点上的使用信息,而 Shadow Node的GRD中只需要记录资源在该节点上的使用情况,这些信息实际就是 PCM Lock 信息。PCM Lock  有3个属性:Mode,Role和PI(Past Image)
 

5.3. RAC  架构 


5.3.1 SGA 的变化 

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

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

5.3.2 后台进程的变化 

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


5.3.2.1  LMSn   

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

5.3.2.2  LMD 

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

5.3.2.3  LCK 

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

5.3.2.4  LMON 

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

LMON 主要借助两种心跳机制来完成健康检查: 
1)节点间的网络心跳(Network Heartbeat): 可以想象成节点间定时的发送ping包检测节点状态,如果能在规定时间内收到回应,就认为对方状态正常 
2)通过控制文件的磁盘心跳(Controlfile Heartbeat):  每个节点的 CKPT进程每隔 3 秒更新一次控制文件一个数据块,这个数据块叫作 Checkpoint Progress Record,控制文件是共享的,所以实例间可以相互检查对方是否及时更新来判断。 

5.3.2.5 DIAG 

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

5.3.2.6 GSD 

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

5.3.3 文件 

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

5.3.3.1 spfile 

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

5.3.3.2  Redo Thread 


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

Redo Thread 有两种

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

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

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

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

5.3.3.3 Archived Log 

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

在 RAC 环境下,配置归档日志可以有多种选择。

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

2)实例间归档(CIA: Cross Instance Archive) 
这种方式是上一种方式的变种,也是比较常见的一种配置方法。两个节点都创建2个目录 Arch1 和 Arch2 分别对应实例 1 和实例2产生的归档日志。每个实例都配置两个归档位置。位置 1对应本地归档目录,位置 2对应另一个实例。  
  
3)使用 ASM 
这种方式也是归档到共享存储,只是通过Oracle提供的ASM,把上面的复杂性隐藏了,但原理都一样。 

5.3.3.4 Undo Tablespace 

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

5.3.4 SCN(System Change Number) 


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

在RAC 中,有GCS 负责全局维护 SCN的产生,缺省用的是 Lamport SCN生成算法,该算法大致原理是:在所有节点间的通信内容中都携带 SCN, 每个节点把接收到的SCN 和本机的 SCN对比,如果本机的 SCN 小,则调整本机的SCN和接收的一致,如果节点间通信不多,还会主动地定期相互通报。 故即使节点处于 Idle  状态,还是会有一些 Redo log  产生。      

还有一个广播算法(Broadcast),这个算法是在每个 Commit 操作之后,节点要想其他节点广播 SCN,虽然这种方式会对系统造成一定的负载,但是确保每个节点在Commit 之后都能立即查看到 SCN.

这两种算法各有优缺点,Lamport 虽然负载小,但是节点间会有延迟,广播虽然有负载,但是没有延迟。 Oracle 10g RAC  缺省选用的是BroadCast算法,可以从alert.log 日志中看到相关信息: 
Picked broadcast on commit scheme to generate SCNS 

5.3.5 Cache Fusion,GCS,GES 关系 

Cache Fusion(内存融合)是通过高速的 Private Interconnect,在实例间进行数据块传递,它是 RAC  最核心的工作机制,它把所有实例的 SGA 虚拟成一个大的 SGA 区。每当不同的实例请求相同的数据块时,这个数据块就通过 Private Interconnect  在实例间进行传递。 
整个 Cache Fusion  有两个服务组成:GCS和GES。GCS负责数据库在实例间的传递,GES 负责锁管理 

5.4    RAC集群 


5.4.1 Clusterware 

    在单机环境下,Oracle 是运行在 OS Kernel 之上的。  OS Kernel 负责管理硬件设备,并提供硬件访问接口。Oracle 不会直接操作硬件,而是有 OS Kernel代替它来完成对硬件的调用请求。

    在集群环境下,存储设备是共享的。OS Kernel  的设计都是针对单机的,只能控制单机上多个进程间的访问。 如果还依赖 OS Kernel 的服务,就无法保证多个主机间的协调工作。 这时就需要引入额外的控制机制,在 RAC 中,这个机制就是位于Oracle 和OS Kernel之间的Clusterware,它会在OS Kernel 之前截获请求,然后和其他结点上的 Clusterware协商,最终完成上层的请求。

       
    在 Oracle 10G 之前,RAC所需要的集群件依赖与硬件厂商,比如
    SUN,HP,Veritas. 从 Oracle 10.1 版本中,Oracle 推出了自己的集群产品. Cluster Ready Service(CRS),从此 RAC  不在依赖与任何厂商的集群软件。在Oracle 10.2版本中,这个产品改名为:Oracle Clusterware。

    所以我们可以看出,在整个RAC 集群中,实际上有 2个集群环境的存在,一个是由Clusterware软件组成的集群,另一个是由Database 组成的集群。 

5.4.2 Clusterware  组成 

Oracle Cluster是一个单独的安装包,安装后,在每个结点上的 Oracle Clusterware  会自动启动。Oracle Clusterware 的运行环境由 2 个磁盘文件(OCR,Voting Disk),若干进程和网络元素组成。

5.4.2.1  磁盘文件

 
Clusterware  在运行期间需要两个文件:OCR 和 Voting Disk.  这 2 个文件必须存放在共享存储上。OCR用于解决健忘问题,Voting Disk  用于解决脑裂问题。Oracle 建议使用裸设备来存放这 2个文件,每个文件创建一个裸设备,每个裸设备分配100M 左右的空间就够了。


(1)OCR 

健忘问题是由于每个节点都有配置信息的拷贝,修改节点的配置信息不同步引起的。Oracle  采用的解决方法就是把这个配置文件放在共享的存储上,这个文件就是OCR Disk。 

OCR  中保存整个集群的配置信息,配置信息以"Key-Value"  的形式保存其中。在 Oracle 10g以前,这个文件叫作Server Manageability Repository(SRVM). 在Oracle 10g,这部分内容被重新设计,并重名为 OCR.在Oracle Clusterware 安装的过程中, 安装程序会提示用户指定 OCR 位置。并且用户指定的这个位置会被记录在/etc/oracle/ocr.Loc(Linux System)  或者/var/opt/oracle/ocr.Loc(Solaris System)文件中。 而在 Oracle 9i RAC 中,对等的是 srvConfig.Loc文件。 Oracle Clusterware在启动时会根据这里面的内容从指定位置读入OCR内容。 

1). OCR key 
整个 OCR  的信息是树形结构,有3个大分支。分别是 SYSTEM,DATABASE 和CRS。每个分支下面又有许多小分支。这些记录的信息只能由 root用户修改。  

2) OCR process 
Oracle Clusterware在OCR中存放集群配置信息,故 OCR的内容非常的重要,所有对OCR的操作必须确保OCR  内容完整性,所以在ORACLE Clusterware运行过程中,并不是所有结点都能操作 OCR Disk. 

在每个节点的内存中都有一份 OCR 内容的拷贝,这份拷贝叫作 OCR Cache。  每个结点都有一个 OCR Process  来读写 OCR Cache,但只有一个节点的 OCR process 能读写OCR Disk 中的内容,这个节点叫作 OCR Master结点。 这个节点的OCR process  负责更新本地和其他结点的 OCR Cache内容。 
 
所有需要OCR  内容的其他进程,比如OCSSD,EVM等都叫作Client Process,这些进程不会直接访问 OCR Cache,而是像 OCR  Process 发送请求,借助 OCRProcess 获得内容,如果想要修改 OCR  内容,也要由该节点的 OCR Process 像Master node  的OCR process  提交申请,由Master OCR Process 完成物理读写,并同步所有节点OCR Cache中的内容。 

(2)Voting Disk 

Voting Disk  这个文件主要用于记录节点成员状态,在出现脑裂时,决定那个Partion 获得控制权,其他的 Partion 必须从集群中剔除。在安装 Clusterware 时也会提示指定这个位置。 安装完成后可以通过如下命令来查看 Voting Disk 位置。 
$crsctl query css votedisk 

5.4.2.2 Clusterware  后台进程 
Clusterware 由若干进程组成,其中最重要的 3个是: CRSD,CSSD,EVMD. 在安装 clusterware 的最后阶段,会要求在每个节点执行 root.sh 脚本, 这个脚本会在/etc/inittab  文件的最后把这3个进程加入启动项,这样以后每次系统启动时,Clusterware  也会自动启动,其中 EVMD 和 CRSD  两个进程如果出现异常,则系统会自动重启这两个进程,如果是 CSSD 进程异常,系统会立即重启。 
1). OCSSD 
OCSSD 这个进程是 Clusterware最关键的进程,如果这个进程出现异常,会导致系统重启,这个进程提供 CSS(Cluster Synchronization Service)服务。CSS  服务通过多种心跳机制实时监控集群状态,提供脑裂保护等基础集群服务功能。

CSS  服务有2种心跳机制: 一种是通过私有网络的 Network Heartbeat,另一种是通过Voting Disk的Disk Heartbeat. 

这 2 种心跳都有最大延时,对于 Disk Heartbeat, 这个延时叫作 IOT (I/O Timeout);对于Network Heartbeat,  这个延时叫 MC(Misscount)。 这2个参数都以秒为单位,缺省时 IOT 大于 MC,在默认情况下,这 2 个参数是 Oracle  自动判定的,并且不建议调整。可以通过如下命令来查看参数值: 
$crsctl get css disktimeout 
$crsctl get css misscount 

除了 Clusterware  需要这个进程,在单节点环境中如果使用了 ASM,也需要这个进程; 这个进程用于支持 ASM Instance  和 RDBMS Instance之间的通信。如果在使用了 ASM 的节点上安装 RAC,会遇到一个问题:RAC 节点要求只有一个 OCSSD 进程,并且应该是运行$CRS_HOME 目录下的,这时就需要先停止ASM,并通过$ORACLE_HOME/bin/localcfig.Sh delete  删除之前的inittab  条目。
之前安装 ASM 时 , 也 使 用 这 个 脚 本 来 启 动 OCSSD : 
$ORACLE_HOME/bin/localconfig.Sh add.   

猜你喜欢

转载自blog.csdn.net/shangyuanlang/article/details/82049200