暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

Oracle RAC体系结构介绍( 详细版)

原创 文盲筱烨 2021-12-13
10092

本文的主要从新学习整理Oracle11g RAC相关资料 --Firsouler

1.RAC体系结构

rac01_arch.jpg

Oracle RAC主要结构和组件如上图所示,RAC相比较与单实例,主要组件多了集群软件及其他组件,如ASM、SCAN IP、及相关进程。 主要特点是多实例管理一个数据库,共享数据库相关文件。

CSS(Cluster Synchronization Service)

负责构建集群、维护集群的一致性.

ocssd启动顺序(Oracle11g init.ohasd)

  • ocssd.bin守护进程被启动
  • ocssd.bin和gpnpd通信,读取gpnp profile中VF的discovery string,并扫描VF
  • 找到VF,获取集群基本配置信息,如misscount,reoot time,long I/O timeout,short I/O timeout
  • ocssd.bin继续跟gpnpd通信,获取私网信息,以便跟其他节点通信
  • ocssd.bin通过gipcd进程获得本地节点和远程节点具体私网连接信息
  • 节点私网建立连接,集群重新配置开始
  • 集群重新配置结束,集群成员列表被更新
CRS(Cluster Ready Service)

主要负责管理集群中的资源

OCR位置

cat /etc/oracle/ocr.loc
#查看ocr信息,可使用以下命令,root用户
./ocrdump /tmp/ocrdump
#检查
./ocrcheck
#查看备份
ls -lrt /u01/app/crs/cdata/crs
#恢复,前停止集群
./ocrconfig -resotre /u01/app/crs/cdaa/crs/backup00.ocr

OCR主要包含以下内容

  • SYSTEM:包含集群CSS/CRS/EVM 三个组件的重要配置信息,如css层面的集群网络配置信息、VF等;CRS层面的安全和验证信息、CRSD之间的通信配置;EVM层面的通信配置。
  • DATABASE:包含集群定义的资源的一部分配置信息,如VIPCA、dbca、netca等
  • CRS :记录CRSD管理的所有资源的属性
集群套件
  • voting disk : 表决盘,集群中每个节点定期评估自身的健康情况,然后会把它的状态信息放入到表决磁盘上。节点间互相查看运行状态,并把相关信息传送给其他节点进而写入表决磁盘,所以磁盘需要共享。
  • OCR : Oracle Cluster Registry,集群注册服务,主要用于记录RAC中集群和数据库的配置信息。这些信息包括了集群节点的列表、集群数据库实例到节点的映射以及CRS应用程序资源信息。OCR使用两种方式验证节点状态,一个是表决盘,另一个是心跳。如果时间超出会造成节点驱逐。 查看时间设置命令如下:
#查看表决盘信息
crsctl query css votedisk
#网络心跳超时
crsctl get css misscount
#磁盘超时
crsctl get css disktimeout
集群启动顺序

集群大概可分为四个层次

  • OHAS:负责集群的初始化资源和进程
  • CSS :负责构建集群并保证集群的一致性
  • CRS :负责管理集群的各种应用程序的资源
  • EVM :负责在集群节点间传递集群事件

rac04_start_level.png

RAC并发

RAC主要通过Distributed Lock Management(DLM:分布式锁管理器) 来解决并发问题,RAC 的DLM 叫作 Cache Fusion,DLM中,根据资源数量、活动密集程度把资源分为两类:

  • Cache Fusion :指数据块这种资源,包括普通数据库,索引数据库,段头块(Segment Header),undo 数据库
  • Non-Cache Fusion : 是所有的非数据库块资源, 包括数据文件,控制文件,数据字典,Library Cache,share Pool的Row Cache等。Row Cache 中存放的是数据字典,它的目的是在编译过程中减少对磁盘的访问。(典型的Non-Cache Fusion资源是 Shared Pool中的 Row Cache 和 Library Cache中的内容。)

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

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

GRD(Global Resource Directory)
Cache Fusion要对数据块进行管理,首要解决的问题是, 数据块拷贝在集群节点间的状态分布图,而这是通过GRD来实现的。GRD 是一个内存结构,在所有的实例中分配。GRD里面记录着每个数据块在集群间的分布图,位于每个实例的SGA中。每个实例都是部分GRD,所有实例的GRD 汇总在一起才是一个完整的GRD。RAC会给每一个资源(数据块)选择一个节点作为它的Master Node,而其他节点作为Shadow Node。 可以通过以下sql查询数据块的master node。

--可以通过以下sql查询数据块的master node select b.dbablk, r.kjblmaster master_node from x$lel, x$kjblr, x$bhb where b.obj = <DataObjectId> and b.le_addr= l.le_addr and l.le_kjbl = r.kjbllockp;

2.内存融合技术

共享池主要保存与内存融合相关的资源管理信息,如gcs(global cache service) 和GES(global enqueue service)资源的定义信息和他们相关的锁信息以及其他信息.如

select count(block_count) from v$gc_element;
RAC主要进程

rac03_process.png

如上图所示,RAC中多出需要进程,主要有:

  • LMSn : 这个进程是Cache Fusion的主要进程,负责数据块在实例间的传递,对应的服务叫作GCS(Global Cache Service), 这个进程的名称来源与Lock Manager Service。
  • LMD : 这个进程负责的是Global Enqueue Service(GES),具体来说,这个进程负责在多个实例之间协调对数据块的访问顺序,保证数据的一致性访问。 它和LMSn进程的GCS服务还有GRD共同构成RAC最核心的功能Cache Fusion。
  • LCK : 这个进程负责Non-Cache Fusion 资源的同步访问,每个实例有一个LCK 进程
  • LMON :各个实例的LMON进程会定期通信,以检查集群中各个节点的健康状态,当某个节点出现故障时,负责集群重构,GRD恢复等操作,它提供的服务叫作:Cluster Group Services(CGS)。 其主要借助节点间心跳网络(定期ping检测各节点)和控制文件的磁盘心跳(每个节点CKPT进程每3秒更新一次控制文件的一个块,块叫Checkpoint Progress Record,实例间相互检查对方是否及时更新来判断)来完成健康检查。
  • DIAG : DIAG 进程监控实例的健康状态,并在实例出现运行错误时手机诊断数据记录到alert.log 文件
  • GSD : 为客户端提供管理接口,如srvctl 接收用户命令
  • LMHB :Global cache/Enqueue Service Heartbeat Monitor,作用监控LMS/LMD/LMON/LCK等于rac相关的主要后台进程
Cache Fusion,GCS,GES关系

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

整个Cache Fusion 有两个服务组成:GCS(LMS)和GES(LMD)。 GCS 负责数据库在实例间的传递,GES负责锁管理。

需要了解几个名词 CR(读一致性)/ DRM(Dynamic Remastering)

3.RAC心跳机制

网络心跳

网络心跳主要是确保节点间的连通性, ocssd.bin进程每秒向其他节点发送网络心跳,确认连通性。

ocssd.bin进程包含以下线程:

  • 发送线程(clssnmSending Thread) : 每秒向其他节点发送网络心跳信息
  • 分析线程(clssnmPolling Thread) : 分析处理,如发现某节点持续丢失心跳,就会通知集群进行重配。
  • 集群重配线程(clssnmRcfgMgr Thread) : 该进程负责重配
  • 派遣进程(clssnmClusterListener): 接收远端消息,根据消息种类发给相关进程
磁盘心跳

解决脑裂问题,投票决定节点去留。每个节点每秒都会向表决盘注册本地节点的磁盘心跳信息,相关进程

  • 磁盘心跳线程(clssnmvDiskPing Thread): 负责向集群的表决盘发送磁盘心跳,也负责读取表决盘中的kill block信息,以确定本地节点是否需要重新启动
  • 磁盘心跳监控线程(clssnmvDiskPingMonitor Thread) : 监控磁盘心跳线程能是否正常工作
  • kill block线程(clssnmv KillBlock Thread) : 负责监控VF的KILL BLOCK信息
本地心跳

本地心跳的作用是监控ocssd.bin进程以及本地节点的状态。

cssdagent和cssdmonitor的功能就是监控本地节点的ocssd.bin进程状态和本地节点的状态,对于ocssd.bin进程的监控是通过本地心跳来实现的,Oracle会在每一秒钟,在发送网络心跳的同时向cssdagent和cssdmonitor发送本地ocssd.bin进程的状态(本地心跳)。如果本地心跳没有问题,cssdagent就认为ocssd.bin进程正常。如果ocssd.bin进程持续丢失本地心跳(到达misscount的时间)ocssdagent就会认为本地节点的ocssd.bin进程出现了问题,并重启该节点

心跳丢失日志信息
丢失网络心跳

丢失网络心跳,自11.2.0.2开始,只会重启GI,节点不会重启

#彼此不能访问
node1: at 50% heartbeat fatal,eviction in 15.919 seconds seedhbimpd 0
node2: at 50% heartbeat fatal,eviction in 15.919 seconds seedhbimpd 0
#互相宣称驱逐
node1: eviction started for node2,flags 00x04od,state 3,wt4c 0 seedhbimph
node2: eviction started for node1,flags 00x04od,state 3,wt4c 0 seedhbimph
#根据磁盘心跳判断
node1: node 2 is alive
node2: node 1 is alive
丢失磁盘心跳
21L22:333 [CSSD][1236798432] clssseExit:CSSD aborting from thread clssnmvDiskPingMonitorThread
丢失本地心跳
(:CLSN00111:) clsnproc_needreboot:Impending reboot at 90% of limit 27945;disk timeout 27742,
network timeout 27945,last heartbeat from CSSD at epoch seconds...

4.ASM介绍

ASM功能和架构

ASM可以存放的文件

  • 控制文件
  • 数据文件
  • 重做日志文件、归档文件、闪回日志文件
  • RMAN备份集

diskgroup.jpg

名词解释

  • AU(Allocate Unit): 分配单元,是ASM分配最小单位,类似数据块,默认1MB,可指定。AU大小需要是db_block_size的整数倍。
  • Extent:扩展,若干个AU构成的集合,每个Extent只能保存在同一个磁盘中,且只能属于一个ASM文件,Extent是ASM磁盘组分配空间的单位。ASM层面的Extent大小固定。 如下:
Extent 数量 Extent大小
<20 000 1个AU
20000-39999 4个AU
40000 16个AU

磁盘冗余

  • 不指定故障组时:每个磁盘作为故障组,普通冗余,允许损坏一个磁盘;高冗余允许损坏两块磁盘
    disk_redundancy.jpg

  • 指定故障组:普通冗余,允许损坏一个故障组不丢失数据;高冗余,允许损坏两个故障组不丢失数据
    group_redundancy.jpg

ASM实例

初始化参数位置 : gpnptool get

特有的进程

  • GMON(asm disk group monitor) :维护磁盘组各个磁盘状态一致性
  • RBAL(ASM rebalance Master) : 负责磁盘组的Rebal-ance操作
  • ASMB : 负责和ASM实例进行通信

数据库和ASM通信

  • RBAL : 数据库上的进程,负责数据库层面管理磁盘组。如打开、创建等
  • ASMB:ASM实例上的ASMB进程负责启动asm后和css的gm部分进行连接,获得连接asm实例锁需要的连接串,所有的asm实例的客户端都需要通过这个连接串和asm进行连接。数据库实例的asm负责和asm实例的asmb进行通信,完成客户端发送到asm实例的第一种请求。
--检查ocr文件名称 select f.group_number,f.file_number,a.name,f.type,f.redundancy from v$asm_file f,v$asm_alias a where a.file_number=f.file_number and a.group_number=f.group_number and f.type='OCRFILE'; --ocr包含的具体AU select k.number_kffxp,d.name,k.au_kffxp from x$kffxp k ,v$asm_disk d where k.disk_kffxp=d.number and d.group_number=2 and k.number_kffxp=255 order by k.au_kffxp;

5.RAC性能

相关的等待事件

TX enqueue:这个排队代表进程在等待以下的情况之一

  • 情况1:进程等待其他的事务(Transaction)提交或者回滚,对应的等待事件是enq:TX-row lock contention。这种情况的产生绝大部分是由应用程序设计导致的
  • 情况2:进程在等待需要操作的索引块分裂。对应的等待事件是enq:TX-indexcontention。这种情况的产生大部分是由于对包含有单向增长的主键索引(或者唯一索引)的表进行大量的并发的插入操作。另外,很多时候读者会发现这个等待事件会与gc相关的等待事件同时出现
  • 情况3:进程等待在数据块中分配新的事务槽位(ITL)对应的等待事件是enq:TX-allocate ITL entry。这种情况的产生大部分是由于数据块比较大,数据行长度小,这导致了大量并发事务集中到了少量的数据块中.

SQ enqueue
SQ enqueue:这个排队是和序列(Sequence)相关的,它表示某个进程需要持有一个序列,以便从中获得一个值(nextval)。对于RAC系统,如果多个实例同时使用相同序列,而且使用的频率很高,就会出现这个等待。另外,每当序列产生一组新的cache值时都需要更新序列的定义信息,所以这个排队经常与rowcache lock一起出现,而解决办法如下

  • 加大序列的cache值
  • 修改序列的排序属性为noorder
  • 为不同的实例创建不同的序列

gc相关的等待事件
PCM资源(也就是数据块资源)对应的等待事件大部分都是以gc开头的,而且等待事件的名称与之前介绍的统计信息的名称是相对应的。gc相关的等待事件是由以下的部分构成的:

  • 标识符:一定是gc(global cache)
  • buffer的类型:可能是当前或者CR
  • 完成的阶段:如果是块,表示已经获得了PCM锁,要去访问buffer了;如果是grant,表示还处在获得PCM锁的过程中,还没有开始访问buffer
  • 性能提示(或者叫可能出现性能问题的地方):如果是2-way或者3-way,表明问题出现在网络层面或者主机层面;如果是busy,说明问题出现在buffer上;如果是congested,说明问题出现在LMS进程上。

p1表示文件编号,p2表示数据块编号,p3表示申请模式、持有模式和数据块类型

常见的gc相关的等待事件

  • 1.gc current/cr block request:这个等待事件表示当前的进程要申请一个当前块或CR块,但是资源主节点的LMS进程还没有响应它的请求,也就是说,这个等待事件是一个placeholder等待事件,因为真正的消息传输和数据传输还没有开始
  • 2.gc current/cr block 2 way:这个等待事件表示当前进程通过一个2路通信,向远程实例申请了一个current或者CR块,而这个申请请求在整个申请过程中并没有出现过超时
  • 3.gc current/cr block 3 way:这个等待事件和gc current/cr block 2 way基本一致,只不过这个请求需要经过3个实例.
  • 4.gc current/cr block busy:这个等待事件说明本地进程向远程实例申请一个当前块或者CR块,而远程实例在发送这个数据块时发现它正在被其他进程使用(或者被其他进程pin住)。注意,因为在申请当前块的时候可能会发生redoflush,这部分时间也是要计算在gc current block busy等待时间之内的。同样,对于CR块的请求,服务实例需要构建CR块,而且也可能会发生redo flush,这两部分时间也是要计算在gc cr block busy等待时间之内的。当发现gc currentblock busy等待出现了很多次,而且产生了很长的等待时间的话,需要查看一下相关信息去进一步分析。
  • 5.gc current/cr grant 2-way:这个等待事件说明当前实例向主节点申请了一个current或者CR块,而且这个申请已经被主节点响应,其中并没有出现过超时。但是,这个等待事件与gc current/cr block 2/3-way的区别在于,这个被申请的数据块不包含在任何实例的数据库缓冲区(buffer cache)中,它是需要申请实例从数据文件读取出来的,所以不会有等待事件gc current/cr grant 3-way存在,因为这时只有申请者实例和主实例,没有持有者实例。而在等待事件gc current/cr block2/3-way中,申请者实例获得的数据块是远程实例发送过来的,也就是说申请者实例、主实例和持有者实例可能是3个不同的实例。
  • 6.gc current grant busy:这个等待事件说明当前实例申请了一个当前块,而且主节点也已经确认申请者实例可以持有这个数据块,但是申请者在等待其他申请者完成它们的申请请求。这个等待事件说明申请者是以独占(X)的方式申请数据块的,但是其他实例上还有一些申请者以共享(S)的方式申请这个块,所以独占的申请请求要等待比它先到达的共享请求
  • 7.gc current/cr block congested:这个等待事件说明本地进程向远程实例申请了一个current或者CR块,而远程实例也已经收到了请求,但是LMS进程并没有及时响应这个请求——将数据发送给申请者实例
  • 8.gc current/cr grant congested:这个等待事件说明本地进程向远程实例申请一个当前块或者CR块,而远程实例也已经收到了请求,但是LMS进程并没有及时响应——将反馈消息(acknowledge message)发送给申请者实例。
  • 9.gc cr failure/gc current retry:这个等待事件说明申请者实例没有收到一个CR块或者当前块。绝大部分情况下,这种问题都是由网络问题或者UDP参数设置问题导致的
  • 10.gc current/cr multi block request:这个等待事件说明申请者实例需要向远程实例(可能是多个)申请多个(具体的数据块数量取决于参数db_file_mulitblock_read_count的设置)current或者CR块。这个等待事件只有在申请的所有数据块都被成功返回之后才会结束,也就是说,如果其中的一个数据块因为某种原因没有被成功接收的话,就需要重新申请所有的数据块。这也是为什么gc current/cr multi block request经常和等待事件gc cr failure/gc current retry同时出现的原因。对于大部分的系统,少量的gc current/cr multi block request等待事件不会影响系统的性能

如果在数据库性能出现2/3等待次数很多且耗时,可能会出现以下问题

  • 私有网络带宽出现了问题。
  • UDP层面出现了问题。如果使用了RDS的话,可能表示RDS层面出现了问题。
  • 系统资源出现了问题。例如:CPU出现了竞争、过长的run queue。
  • 应用角度:热点块、少量数据块并发读写频繁、如果CR块,过多事务被指定到了少量的回滚段

需要检查:AWR报告中的Global Cache andEnqueue Services-Workload Characteristics

如果出现4问题,需要检查

  • 信息1:远程实例的AWR的Global Cache and Enqueue Services-WorkloadCharacteristics一节中Avg global cache current block pin time(ms)和Avgglobal cache current block flush time(ms)部分的统计值。如果没有AWR的信息,也可以查看视图V$INSTANCE_CACHE_TRANSFER中与当前块相关的列
  • 远程实例的LGWR进程的跟踪日志文件和log file sync的等待时间、次数
  • 远程实例的DBWR的性能和checkpoint incomplete的次数
  • 应用角度:热点块、相同表大量并发的DML、带有主键的表大量并发insert

如果出现5中问题等待事件多且耗时,可能原因如下

  • 网络带宽
  • 系统工作负载
  • 应用角度:某些sql执行计划问题,导致大量数据块被访问;数据块缓冲区被设置太小,频繁写入数据文件;检查点过于频繁

如果出现6特别多且耗时,可能原因

  • 网络带宽
  • 系统负载
  • 应用角度:某一个实例不断修改一些数据块,二其他实例不断读取对应的数据块

如果出现8特别多,可能原因

  • LMS进程出现了问题。例如:实例之间的LMS进程数量不同;LMS进程优先级不够而导致不能及时获取CPU时间
  • 过多的实例间消息和数据传输使LMS进程过载
  • 操作系统出现了资源竞争。例如:CPU利用率过高、出现了swap、内存耗尽等
  • UDP层面的参数设置不正确或者私网性能问题

如果出现10特别多,可能原因

  • 网络带宽
  • UDP参数设置问题
  • 应用角度:sql语句使用不正常执行计划,如full table scan

注意:由于内部限制,内存融合每次最多只能发送16个数据块

gc请求的5个阶段

  • 阶段1:申请者进程发送一个请求
  • 阶段2:主节点的LMS进程收到请求并响应
  • 阶段3:主节点发送请求给持有者实例的LMS进程
  • 阶段4:持有者实例的LMS进程响应申请者的请求
  • 阶段5:持有者实例的LMS进程将需要的数据发送给申请者进程

各个等待事件出现的阶段:

rac_wait_event.jpg

常见的性能问题

序列

--eg noorder 方式 create sequence seq_test start with 1 increment by 1 cache 2 nomaxvalue nocycle noorder; --查看,两个实例单独,实例1 1-20,实例2 21-40; select seq_test.nextval from dual; --order 方式 每个节点循环,1,2,3 注意这种方式争用会多,性能会变差 create sequence seq_test1 start with 1 increment by 1 cache 20 maxvalue 999999999999999 nocycle order;

对于RAC数据库,每个实例都会产生对于的cache值。cache+order的组合在RAC数据库中是被支持的,但是这同时也代表序列默认会被当作nocache来进行处理,也就是说,每次从序列获取一个新的值时就要访问一次数据字典信息。

注意事项(引起"row cache lock"/“DFS lock handle”):

  • 尽量使用大的cache值来减少对数据字典信息的访问
  • 尽量避免使用order选项

HW序列(“HW-contenttion”)
HW序列是进程在升高数据库对象(例如:表或者索引)高水位(High WaterMark)值时需要持有的资源,它的作用是防止多个进程同时修改高水位。下面场景出现最多

  • 表空间的存储参数设置有问题,导致数据库对象频繁地申请空间
  • 大量并发的parallel DML语句或者bulk insert语句
--eg 通过表空间存储参数缓解多实例并发引起的HW排队 create tablespace test1 datafile '+data' size 100m reuse extent management local uniform size 10M;

索引争用
同时多个实例会争用相同的索引(或者表)块,经常出现的等待事件有gcbuffer busy、enq:TX-index contention、gc current block busy、gc currentsplit等。 出现上述问题,建议如下:

  • 使用hash或者range的方式对表进行分区
  • 如果索引的列值是被顺序插入的(例如是通过序列产生的),可以考虑使用反向索引(Reverse Index),或者调整应用,使得插入进来的索引值能够被分布到更多的叶子块中。
  • 考虑调整应用来避免将连续的键值插入表和索引当中

缓存尺寸导致的性能问题
内存融合在实例之间的通信是通过UDP来实现的,UDP协议,由于它是应用层到IP层的数据发送,而且不建立连接,也没有数据重发和超时机制,所以网络的性能和操作系统层面的UDP缓存参数设置也就显得非常重要。举例如下:

  • 1.节点1的LMS进程需要发送一个数据块(db_block_size=8k,MTU=1500)给节点2,并把该请求通知OS
  • 2.节点1操作系统需要将这个数据块切成大概6个数据分片,并放入节点1相应端口的UDP以发送缓存(Send Buffer)
  • 3.数据分片通过网络被陆续发送给节点2
  • 4.节点2的操作系统收到了发送过来的数据包,并将其保存到对应的UDP以接收缓存(Recevie Buffer)
  • 5.节点2开始组装数据分片,当所有的6个数据分片都被成功组装之后,OS将组装过的数据包发送给相应的接收进程
  • 6.节点2的接收进程处理收到的数据包

UDP问题时"gc currentblock 2-way"等待事件耗时多,linux相关参数如下:

net.core.wmem_max = 1048576 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.rmem_default = 262144
11gR2新特性之HW

挂起(hang)是指某一个进程由于无法获得需要申请的资源而进入的等待状态,这种等待状态只有在获得申请的资源后才能够被解除。因此,hang的情况有两种:死锁(Dead Lock)和等待链(Wait Chain)。对于死锁,在RAC数据库中LMD进程会进行相应的处理,等待链会造成数据库缓慢。

基于此,Oracle在11g R2推出新特性Hang Manager(HW),来实现对hang(等待链)的管理,其中包括了对于hang的监控、分析、记录和解决,11.2.0.2版本才真正起作用。它能够主动发现数据库中存在的等待链,并从多个角度对它们分析。 相关文件

  • dia0进程的主跟踪文件(DIA0.trc):这个日志会记录dia0进程工作的详细信息,包括发现、分析、处理hang的过程
  • dia0进程的历史跟踪日志(_DIA0__n.trc): 定期刷新
  • Incident日志文件:如果HM通过终止进程来解决hang的话,会首先在alert.log中记录一个ORA-32701错误
  • 也可以通过视图:VHANG_INFO;VHANG_SESSION_INFO 相关的会话信息;V$HANG_STATISTICS 数据库统计信息

6.RAC管理

数据库层面脑裂
  • 两个实例之间心跳网络出现问题,一段时间之后(默认300s),两个实例都无法和对方通信
  • 每个实例都尝试获得RR锁(抢表决盘),获得RR锁的实例访问控制文件中的实例状态,并决定新的集群实例列表
数据库连接

参数说明

  • local_listener :指定了数据库的PMON进程需要将本实例提供的服务注册到哪个endpoint,如果没设置,PMON默认将数据库的服务注册到本地节点的1521端口,这也是很多用户发现如果在默认位置创建了监听程序,数据库服务会被自动注册的原因
  • remote_listener :将本地实例的数据库服务注册到集群其他节点的监听程序或者SCAN监听程序上
  • listener_networks :在用户定义了多个集群公网时才需要设置,它的作用是将本地实例的数据库服务注册到多个公网的监听程序上

负载均衡
11g以后使用scan, 之前的版本tnsnames配置两个ip,并添加参数"LOAD_BALANCE=yes"

--查看负载均衡 select service_name,begin_time,end_time,goodness,delta,intsize_csec from v$servicemetric where service_name='racdb';
已存在的连接故障

当前连接的数据库实例或服务出现问题时,把已经存在的数据库连接(会话)透明地迁移到其他数据库实例中。Oracle实现的方式主要有TAF(Transparent ApplicationFailover)和FCF(Fast Connection Failover)

TFA

TAF针对使用OCI方式连接到数据库的会话。它可以在客户端或者服务器端进行配置,如果用户在两端都进行了配置,服务器端的配置会覆盖客户端的配置,也就是说,服务器端的配置具有更高的优先级。TAF目前可以做到

  • 使用相同数据库的用户在正常实例中创建一个会话
  • 在原有服务出现问题之前已经执行过的操作不会被重复执行
  • 对于正在执行的操作,如果是select语句,切换后会继续运行,但是对DML语句,它们会被自动回滚,用户需要重新运行。

说明:Oracle 12C推出的application continuity和transaction guard特性可以使TAF能够支持DML语句在会话切换后继续运行,但是本书并不会介绍这个的新特性

配置TAF有以下类型可以选:

  • session:表示在故障切换发生后,新的连接会被创建到正常实例,问题出现时正在运行的操作不会被继续执行
  • select:表示在故障切换发生后,新的连接会被创建到正常实例,问题出现时正在运行的select语句会被继续执行
  • none:不会有故障切换发生,也就是禁用TAF

配置方式

srvctl add service -d ora11g -s test -r ora11g1 -a ora11g2 -P basic -e SESSION -m basic -w 5 -z 3

--查看
srvctl config service -d ora11g -s test
  • -d :db_unique_name
  • -s :数据库服务名
  • -r :默认运行的数据库实例列表
  • -a : 故障切换的目标实例
  • -e : TAF类型
  • -w :每次切换的时间间隔
  • -z :切换次数

客户端FAT配置是通过参数FAILOVER_MODE方式,不建议客户端,如果服务端、客户端都配置了,优先服务端

FCF

FCF是针对非OCI连接的特性,例如:jdbc thin client连接,它需要和ONS、FAN(Fast ApplicationNotification)进行协作才能够正常工作。

相关概念:

  • ONS:Oracle集群的事件发布组件,它负责在集群的某些组件发生变化时向外发布事件信息
  • FAN:ONS实现事件发布的方式,换句话说,ONS负责向外发布FAN事件。FAN事件大致可以分为HA事件和负载均衡事件,HA事件是指集群的某个组件状态发生了变化,例如:节点宕掉、数据库实例被关闭或启动、数据库服务被停止或启动;负载均衡事件是指数据库服务的工作负载以及统计信息变化(这种事件需要对服务设置LBA相关的属性)

参考

  • http://blog.itpub.net/29487349/viewspace-2751618/

参考资料

  • RAC并发架构(https://www.cnblogs.com/youngerger/p/8996855.html)
  • 《Oracle RAC核心技术详解》 - 高斌(微信读书)
  • 部分命令参考(https://gitee.com/firsouler/my_db_scripts/blob/master/Oracle11g%E9%87%8D%E7%82%B9%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D.md)
最后修改时间:2023-03-08 10:45:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论