(调整、新增、修改了部分内容)
一、 工作机制
1.1 并发控制
在集群环境中, 关键数据通常是共享存放的,比如放在共享磁盘上。 而各个节点的对数据有相同的访问权限, 这时就必须有某种机制能够控制节点对数据的访问。 Oracle RAC 是利用DLM(Distribute Lock Management) 机制来进行多个实例间的并发控制。
1.2 健忘症(Amnesia)
集群环境配置文件不是集中存放的,而是每个节点都有一个本地副本,在集群正常运行时,用户可以在任何节点更改集群的配置,并且这种更改会自动同步到其他节点。
有一种特殊情况: 节点A 正常关闭, 在节点B上修改配置, 关闭结点B,启动结点A。这种情况下,修改的配置文件是丢失的, 就是所谓的健忘症。
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票。另一个节点就会被剔除。
1.4 IO 隔离(Fencing)
当集群系统出现"脑裂"问题的时候,我们可以通过"投票算法"来解决谁获得集群控制权的问题。 但是这样是不够的,我们还必须保证被赶出去的节点不能操作共享数据。这就是IO Fencing 要解决的问题。
IO Fencing实现有硬件和软件2种方式:
软件方式:对于支持SCSI Reserve/Release 命令的存储设备,可以用SG命令来实现。 正常的节点使用SCSI Reserve命令"锁住"存储设备, 故障节点发现存储设备被锁住后,就知道自己被赶出了集群,也就是说自己出现了异常情况,就要自己进行重启,以恢复到正常状态。 这个机制也叫作 suicide(自杀). Sun 和Veritas 使用的就是这种机制。
硬件方式:STONITH(Shoot The Other Node in the Head), 这种方式直接操作电源开关,当一个节点发生故障时,另一个节点如果能侦测到,就会通过串口发出命令,控制故障节点的电源开关,通过暂时断电,而又上电的方式使故障节点被重启动,这种方式需要硬件支持。
二、 集群
2.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 组成的集群。
2.2 Clusterware 组成
Oracle Cluster 是一个单独的安装包,安装后,在每个结点上的Oracle Clusterware 会自动启动。 Oracle Clusterware的运行环境由:2个磁盘文件(OCR,Voting Disk)、集群服务进程和集群后台进程、网络元素组成。
2.2.1 磁盘文件
Clusterware 在运行期间需要两个文件:OCR和Voting Disk. 这2个文件必须存放在共享存储上。 OCR 用于解决健忘问题,Voting Disk 用于解决脑裂问题。 Oracle 建议使用裸设备来存放这2个文件,每个文件创建一个裸设备,每个裸设备分配100M左右的空间就够了。
2.2.1.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、CRS、DATABASE。每个分支下面又有许多小分支。这些记录的信息只能由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发送请求,借助OCR Process获得内容,如果想要修改OCR 内容,也要由该节点的OCR Process向Master node 的OCR process 提交申请,由Master OCR Process完成物理读写,并同步所有节点OCR Cache中的内容。
2.2.1.2 Voting Disk
Voting Disk 这个文件主要用于记录节点成员状态,在出现脑裂时,决定那个Partion获得控制权,其他的Partion必须从集群中剔除。在安装Clusterware时也会提示指定这个位置。安装完成后可以通过如下命令来查看Voting Disk位置。
$Crsctl query css votedisk
2.2.2 Clusterware 服务进程
Clusterware 由若干进程组成,其中最重要的3个是:CRSD、CSSD、EVMD. 在安装clusterware的最后阶段,会要求在每个节点执行root.sh 脚本, 这个脚本会在/etc/inittab 文件的最后把这3个进程加入启动项,这样以后每次系统启动时,Clusterware 也会自动启动,其中EVMD和CRSD 两个进程如果出现异常,则系统会自动重启这两个进程,如果是CSSD 进程异常,系统会立即重启。
1). CSSD
CSSD 这个进程是Clusterware最关键的进程,如果这个进程出现异常,会导致系统重启,这个进程提供CSS(Cluster Synchronization Service)服务。 CSS 服务通过多种心跳机制实时监控集群状态,提供脑裂保护等基础集群服务功能。
CSS 服务有2种心跳机制: 一种是节点间通过私有以太网的心跳Network Heartbeat,另一种是通过Voting Disk的Disk Heartbeat,ocssd进程每秒向votedisk写入一条心跳信息.
这2种心跳都有最大延时,对于Disk Heartbeat, 这个延时叫作 IOT (I/O Timeout);对于Network Heartbeat, 这个延时叫MC(Misscount)。这2个参数都以秒为单位,缺省时IOT大于MC,在默认情况下,这2个参数是Oracle 自动判定的,并且不建议调整。可以通过如下命令来查看参数值:
$crsctl get css disktimeout
$crsctl get css miscount
[root@node1 ~]# crsctl get css disktimeout
200
[root@node1 ~]# crsctl get css misscount
30
注:除了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
2). CRSD
CRSD是实现"高可用性(HA)"的主要进程,它提供的服务叫作CRS(Cluster Ready Service) 服务。
Oracle Clusterware是位于集群层的组件,它要为应用层资源(CRS Resource) 提供"高可用性服务",所以, Oracle Clusterware 必须监控这些资源,并在这些资源运行异常时进行干预,包括关闭,重启进程或者转移服务。CRSD进程提供的就是这些服务。
所有需要 高可用性 的组件,都会在安装配置的时候,以CRS Resource的形式登记到OCR中,而CRSD 进程就是根据OCR中的内容,决定监控哪些进程,如何监控,出现问题时又如何解决。也就是说,CRSD 进程负责监控CRS Resource 的运行状态,并要启动,停止,监控,Failover这些资源。默认情况下,CRS 会自动尝试重启资源5次,如果还是失败,则放弃尝试。
CRS Resource 包括GSD(Global Service Daemon)、ONS(Oracle Notification Service)、VIP、 Database、 Instance 和 Service. 这些资源被分成2类:
GSD、ONS、VIP 和 Listener 属于Nodeapps类
Database,Instance 和Service 属于 Database-Related Resource 类。
我们可以这样理解: Nodeapps 就是说每个节点只需要一个就够了,比如每个节点只有一个Listener,而Database-Related Resource 就是说这些资源和数据库有关,不受节点的限制,比如一个节点可以有多个实例,每个实例可以有多个Service。
GSD、ONS、VIP 这3个服务是在安装Clusterware的最后,执行VIPCA 时创建并登记到OCR中的。 而Database、 Listener、 Instance 和Service 是在各自的配置过程中自动或者手动登记到OCR中的。
3). EVMD
EVMD 这个进程负责发布CRS 产生的各种事件(Event). 这些Event可以通过2种方式发布给客户:ONS 和 Callout Script. 用户可以自定义回调脚本,放在特定的目录下,这样当有某些事件发生时,EVMD会自动扫描该目录,并调用用户的脚本,这种调用是通过racgevt进程来完成的。
EVMD 进程除了复杂发布事件之外,它还是CRSD 和CSSD 两个进程之间的桥梁。 CRS 和CSS 两个服务之前的通信就是通过EVMD 进程完成的。
4). RACGIMON
RACGIMON 这个进程负责检查数据库健康状态,负责Service的启动,停止,故障转移(Failover)。 这个进程会建立到数据库的持久连接,定期检查SGA中的特定信息,该信息由PMON 进程定时更新。
5). OPROCD
OPROCD 这个进程也叫作 Process Monitor Daemon.如果在非Linux 平台上,并且没有使用第三方的集群软件时,就会看到这个进程。 这个进程用来检查节点的Processor Hang(CPU 挂起), 如果调度时间超过1.5秒, 就会认为CPU 工作异常,会重启节点。 也就是说这个进程提供 “IO 隔离” 的功能。 从其在Windows 平台上的服务名: OraFnceService 也可以看出它的功能。而在Linux 平台上, 是利用Hangcheck-timer 模块来实现"IO 隔离"的。
2.3 VIP 原理和特点
Oracle 的TAF (Transparent Application Failover)就是建立在VIP 技术之上的。 IP 和VIP 区别在与: IP 是利用TCP层超时, VIP 利用的是应用层的立即响应。VIP 它是浮动的IP. 当一个节点出现问题时会自动的转到另一个节点上。
假设有一个2个节点的RAC,正常运行时每个节点上都有一个VIP。 VIP1 和VIP2. 当节点2发生故障,比如异常关系。RAC 会做如下操作:
1). CRS 在检测到rac2节点异常后,会触发Clusterware 重构,最后把rac2节点剔除集群,由节点1组成新的集群。
2). RAC的Failover 机制会把节点2的VIP转移到节点1上,这时节点1的PUBLIC 网卡上就有3个IP 地址: VIP1,VIP2, PUBLIC IP1.
3). 用户对VIP2的连接请求会被IP层路由转到节点1
4). 因为在节点1上有VIP2的地址,所有数据包会顺利通过路由层,网络层,传输层。
5). 但是,节点1上只监听VIP1和public IP1的两个IP地址。并没有监听VIP2,故应用层没有对应的程序接收这个数据包,这个错误立即被捕获。
6). 客户段能够立即接收到这个错误,然后客户段会重新发起向VIP1的连接请求。
VIP 特点:
1). VIP 是通过VIPCA脚本创建的
2). VIP 作为Nodeapps类型的CRS Resource 注册到OCR中,并由CRS 维护状态。
3). VIP 会绑定到节点的public 网卡上,故public 网卡有2个地址。
4). 当某个节点发生故障时,CRS 会把故障节点的VIP 转移到其他节点上。
5). 每个节点的Listener 会同时监听public 网卡上的 public ip 和VIP
6). 客户端的tnsnames.Ora 一般会配置指向节点的VIP.
2.4 Clusterware 的日志体系
Oracle Clusterware的辅助诊断,只能从log 和trace 进行。 而且它的日志体系比较复杂。
alert.log:
$ORA_CRS_HOME\log\hostname\alert.Log, 这是首选的查看文件。
Clusterware后台进程日志:
crsd.Log: $ORA_CRS_HOME\log\hostname\crsd\crsd.Log
ocssd.Log: $ORA_CRS_HOME\log\hostname\cssd\ocsd.Log
evmd.Log: $ORA_CRS_HOME\log\hostname\evmd\evmd.Log
Nodeapp日志位置:
$ORA_CRS_HOME\log\hostname\racg\
这里面放的是nodeapp的日志,包括ONS和VIP,比如:ora.Rac1.ons.Log
工具执行日志:
$ORA_CRS_HOME\log\hostname\client\
Clusterware 提供了许多命令行工具:
比如ocrcheck, ocrconfig,ocrdump,oifcfg和clscfg, 这些工具产生的日志就放在这个目录下
还有$ORACLE_HOME\log\hostname\client\ 和
$ORACLE_HOME\log\hostname\racg 也有相关的日志。
三. 并发机制
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( Parallel Cache Management)才能继续下一步,即:实例要获得数据块的使用权。
PCM - Parallel Cache Management
Oracle使用 PCM( Parallel Cache Management) 维护缓冲区的一致性,通过PCM Oracle允许一个节点访问位于另一个节点的缓冲区Cache中的数据;
IDLM - Integrated Distributed Lock Manager
Oracle通过集成分布式锁管理器(Integrated Distributed Lock Manager,IDLM)来协调资源的使用,防止发生冲突,从而实现PCM 并行Cache管理,专门的LCK进程用于实现实例间的数据一致。
Oracle并行服务器中的每个PCM锁可管理多个数据块。PCM锁管理的数据块的个数与分配给一个数据文件的PCM锁的个数及该数据文件的大小有关。一旦某个节点上的实例启动后,它就可以获取各种各样的DLM锁,这些锁主要划分为 PCM(Parallel Cache Management,并行Cache管理)锁和非PCM锁。PCM锁用于锁住数据库块,非PCM锁用于锁住所有其他的共享DLM资源(例如共享池中的数据文件和对象)
Cache Fusion要解决的首要问题就是:数据块拷贝在集群节点间的状态分布图,这是通过GRD 实现的。
3.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).
3.2 缓存融合原理
群集环境中所有节点共享且并发地对磁盘上的数据库进行更新,另外还要额外地需要同其它节点进行同步和串行机制,以避免两个或多个节点同时更新同一数据页上的记录。举个例子说明一下:
(1) 节点A读取一个全新的数据块,该数据块没有被任何节点读入
①节点A的请求发给GCS,GCS把这个请求转发给这个数据块的主节点,这里假定是节点B。因为这个数据块没有在任何节点的内存中,GCS标记这个数据块状态为S(shared,共享状态),并记录到GRD中。
②接着B告诉节点A状态修改了,准备工作都完成了。然后节点A记录共享状态在自己的实例中,并读入该数据块。这时,节点A持有了该数据块,并在GRD中进行记录,标记持有该数据块。此时,整个过程发生了一次IO操作。
(2) 节点C要修改刚才节点A读入的数据块,这里假定节点A刚才读入的数据块SCN是100。
①节点C找到该数据块的主节点,也就是节点B,要求能加一个X标记(exclusive,独占状态),表明要修改数据。但是这个数据块可能已经存在于多个节点的实例中,每个实例都有个S标记。
②GCS会告诉所有持有该数据块的实例,把状态S标记转换为N标记(null,空状态)。
③最后一个从S标记转换为N标记的实例把数据块发送到需要对其进行修改的节点如节点C上。
④这时节点C的实例就可以对该数据块加上X标记,并通知该数据块的主节点,也就是节点B的GCS,GCS将最新的标记与位置记录到GRD,并关闭以前节点的资源记录。这时节点C就可以修改该数据块了,假定把SCN从100修改成了101,这个时候磁盘上的数据块SCN还是100,整个过程是通过内部互联进行数据交换,没有磁盘IO产生。
(3) 节点D也要修改该数据块
①与节点C修改该数据块类似,节点D也会找到该数据块的主节点,也就是节点B,要求加一个X(exclusive,独占状态)的锁,表示要修改该数据块。
②这时GCS会告诉上一次修改成功的节点C,放弃它加上的X标记,因为别的节点也要修改这个数据块。
③节点C会确保这个数据块的改变,已经记入联机日志中,然后转换X标记为N标记,并把这个数据块拷贝到节点D。
④节点D加上X标记,并通知该数据块的主节点,也就是节点B的GCS,GCS将最新的标记与位置记录到GRD,并关闭以前节点上的资源记录。这时节点D就可以修改该数据块了,假定把该数据块的SCN从101又修改成102,但是磁盘的数据块上的SCN还是100。可以发现RAC在这个过程中,也没有任何磁盘操作,同样是通过内部互联来完成的。
(4) 节点A要重新读取该数据块
①节点A还是一样,首先找到该数据块的主节点,也就是节点B,希望能读取最新的数据块,也就是SCN为102的内容。
②GCS根据GRD得知最新的数据块在节点D上,于是GCS通知节点D。节点D需要确保刚才修改过的数据块已经记录在联机日志中,如果已经确定记录过,则把原来的X标记转换为S标记。
③节点D拷贝数据块到节点A的实例,这时节点A获得该数据块,并获得S标记。
④最后再告诉该数据块的主节点,也就是节点B,GCS记录最新的标记与位置到GRD,这个时候,节点A与节点D同时持有S标记的相同的数据块,数据块的SCN为102,但是磁盘中的数据块SCN还是100,最后如果发生写操作,只要最新的一个节点发生写操作即可,所以该数据块虽然在不同节点、不同实例中发生了多次改变,最终却只有一次写IO操作。
四. RAC 架构
4.1 SGA 的变化
和传统的单实例相比, RAC Insance的SGA 最显著的变化就是多了一个GRD部分。 Oracle 中的数据操作都是在内存的SGA区完成的,和传统的单实例不同,RAC 是有多个,每个数据块可以在任何一个Instance 的SGA中都有拷贝,RAC必须知道这些拷贝的分布版本,状态,而GRD就是这些信息的内存区。
GRD 虽然位于SGA中,但是不像Buffer Cache 或者 Log buffer等SGA 组件,有明确的参数来对应,每个节点中都只有部分GRD内容,所有的节点合在一起才构成完整的GRD.
4.2 后台进程的变化
每个RAC的实例和传统的单实例一样,都有DBWR、LGWR、ARCn、CKPT 这些后台进程,除了这些进程外,每个实例还增加了若干RAC特有的进程,要注意的是,这些进程名称和进程提供的服务名称差异很大,比如LMS进程提供的是GCS 服务,很不便与记忆,造成这种现象的原因是进程名称从9i 之前的OPS(RAC 前身)延续下来的,但是服务却已经在RAC中重新设计并命名。
4.2.1 LMSn (全局缓存服务进程 Global Cache Service Process)
这个进程是Cache Fusion的主要进程,负责数据块在实例间的传递,对应的服务叫作GCS(Global Cache Service), 这个进程的名称来源与Lock Manager Service。 从Oracle 9开始,Oracle 对这个服务重新命名成Global Cache Service, 但是进程名字确没有调整。这个进程的数量是通过参数GCS_SERVER_PROCESSES 来控制,缺省值是2个,取值范围为0-9.
4.2.2 LMD(全局队列服务守护进程 Global Enqueue Service Daemon)
这个进程负责的是Global Enqueue Service(GES),具体来说,这个进程负责在多个实例之间协调对数据块的访问顺序,保证数据的一致性访问。 它和LMSn进程的GCS服务还有GRD共同构成RAC最核心的功能Cache Fusion。
4.2.3 LCK0 (实例队列进程)
这个进程负责Non-Cache Fusion 资源的同步访问,每个实例有一个LCK 进程
4.2.4 LMON(全局队列服务监控器 Global Enqueue Service Monitor)
各个实例的LMON进程会定期通信,以检查集群中各个节点的健康状态,当某个节点出现故障时,负责集群重构,GRD恢复等操作,它提供的服务叫作:Cluster Group Services(CGS)。
LMON 主要借助两种心跳机制来完成健康检查:
1) 节点间的网络心跳(Network Heartbeat): 可以想象成节点间定时的发送ping包检测节点状态,如果能在规定时间内收到回应,就认为对方状态正常
2) 通过控制文件的磁盘心跳(Controlfile Heartbeat): 每个节点的CKPT进程每隔3秒更新一次控制文件一个数据块,这个数据块叫作Checkpoint Progress Record,控制文件是共享的,所以实例间可以相互检查对方是否及时更新来判断。
4.2.5 DIAG (诊断守护进程)
DIAG 进程监控实例的健康状态,并在实例出现运行错误时手机诊断数据记录到alert.log 文件
4.2.6 GSD(Global Service Daemon)
这个进程负责客户端工具,用于支持dbca,srvctl,oem等的交互工具,为用户提供管理接口。Oracle 11g RAC默认将oc4j以及gsd服务都处于offline状态。
示例图:
4.3 文件
Oracle 文件包括二进制执行文件,参数文件(pfile和spfile),密码文件,控制文件,数据文件,联机日志,归档日志,备份文件。
4.3.1 spfile
这个参数文件需要被所有节点访问,需要放在共享存储上
4.3.2 Redo Thread
每个实例用到的联机日志就是一个Redo Thread,单实例有且只有一个Redo Thread。在RAC环境下,每个实例都需要自己的联机日志,也就是每个实例都有自己的Redo Thread。这种每实例一个Redo Thread的设计是为了避免实例间共享Redo文件引发的竞争,提高系统性能。
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的这个节点必须能够访问到故障节点的联机日志,只有把联机日志放在共享存储上才能满足这个要求。
RAC环境下如有多个private日志线程,则在添加日志时必须指定线程号。
SQL> alter database add logfile thread 1 group5('+data/myrac/onlinelog/myrac1_redolog_group5_01') size 100m;
SQL> alter database add logfile member '+data/myrac/onlinelog/myrac1_redolog_group5_02' to group 5;
4.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,把上面的复杂性隐藏了,但原理都一样。
4.3.4 Undo Tablespace
和Redo Log 一样,在RAC 环境下,每个实例都需要有一个单独的回滚表空间,这个是通过参数SID.undo_tablespace 来配置的。
4.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
RedoLog Checkpoint 和 SCN关系
http://blog.csdn.net/tianlesoftware/archive/2010/01/25/5251916.aspx
4.5 Cache Fusion、 GCS、GES 关系
Cache Fusion(内存融合)是通过高速的Private Interconnect,在实例间进行数据块传递,它是RAC 最核心的工作机制,它把所有实例的SGA虚拟成一个大的SGA区。每当不同的实例请求相同的数据块时,这个数据块就通过Private Interconnect 在实例间进行传递。
整个Cache Fusion 有两个服务组成:GCS 和GES。 GCS 负责数据块在实例间的传递,GES 负责锁管理
参考:
https://blog.csdn.net/lqx0405/article/details/44776999
https://blog.csdn.net/lqx0405/article/details/44777001