编者按:
本文作者系肖遥(花名),原甲骨文技术支持工程师 ,专注于Oracle RAC领域。个人主页:
https://blog.csdn.net/weixin_50510978。
【免责声明】本号文章仅代表个人观点,与任何公司无关。
编辑|SQL和数据库技术(ID:SQLplusDB)
浅谈RAC系列:
浅谈Oracle RAC (2)--集群管理软件GI基本架构
浅谈Oracle RAC(6) 之实战:节点reboot问题的调查方法
今天我们介绍一下RAC DB与Oracle单实例数据库在进程上面的一些主要差别。
1.内存融合技术
在谈RAC DB特有进程的时候,我们首先需要了解一个基础概念就是内存融合技术(Cache Fusion)。可以说这是RAC DB最核心的技术。
RAC 数据库是对单实例数据库的一个延申。RAC 数据库虽然有很多节点,但是从应用程序的角度看,RAC数据库与单节点数据库并没有什么区别。RAC数据库各个节点实例对应用程序来说是透明的,应用程序通过统一的接口(SCAN)连接到RAC数据库,具体由哪个节点提供服务,则由RAC按照一定的负载均衡的policy自动调整(当然应用程序也是可以设定连接到特定节点的),应用程序不需要做额外的操作。也就是说RAC数据库与一些分布式数据库不同点是,RAC数据库的每个节点都可以进行读写操作。为了保证事务的ACID特性,各个节点的内存状态必须互相知晓,所以内存融合技术应运而生。
RAC 数据库特有的进程,很多都是与内存融合技术有关。
关于RAC 数据库的内存结构和内存融合技术,我们以后会拿出很大的篇幅来做介绍。
2.ASM(Automatic Storage Management)
另外,Oracle DB的数据文件一般存储在ASM上,数据库实例则通过ASM实例得到数据文件的位置信息。所以区别于Oracle单实例数据库,Oracle RAC还有专门与ASM实例进行连接用的特有进程。
关于ASM以后会拿出相当多篇幅介绍。
3.LMON
这个进程存在于每个RAC数据库节点实例中,是RAC数据库维护数据库集群层面实例关系的主要进程。
各节点实例的LMON会定期与其它节点实例进行心跳通信,当节点间出现通信问题时,该进程负责完成自己所在节点的Reconfiguration。RAC Reconfiguration会单独拿出来讨论。
同样的,当某个节点实例启动或者停止时,其它节点会通过LMON来获得实例加入或者退出集群的信息。
在DB alert日志中会有类似下面的信息输出:
Tues March 29 11:03:45 2022
Reconfiguration started (old inc 4, new inc 6)
List of nodes:
0
…
Reconfiguration complete
4.LMS
内存融合技术的实质就是节点间内存中的数据块通过私网通信进行传递的技术。完成这项任务的进程则是LMS进程。
可以说这个进程是RAC DB内存融合体系中最繁忙的进程,所以LMS进程的优先级为RT(CPU资源优先分配给LMS),每个实例中可以存在复数个LMS。
LMS进程是内存融合技术的主要进程,所以说LMS的个数和性能会严重影响SQL性能。
RAC DB会根据CPU的数量按照某种算法算出一个初始的LMS的个数,但是根据不同环境的配置情况,我们可以通过gcs_server_process参数来定义LMS的数量以此改善SQL性能。特别是对于大SGA的RAC数据库(SGA超过100GB)时,甲骨文推荐将gcs_server_process设定为初始值的2倍(只在12.2以下版本做此推荐)。设定gcs_server_process时需要注意的是,为了避免LMS无法及时分配到CPU资源的情况,一个节点上的所有数据库实例的LMS的总数不能大于该节点CPU的核数。比如某4核CPU的服务器,装有2套RAC数据库的2个实例,那么2个实例中设定的LMS的总数不能大于4.
因为LMS的个数和性能会严重影响到SQL性能,所以RAC数据库要求各个节点的服务器硬件配置要一致。否则配置高的节点LMS处理数据能力强,而配置低的节点LMS处理数据能力无法跟上配置高的节点数据处理能力,会造成数据块在节点间不能及时传送,出现大量的长时间gc待机事件。
5.LMD
该进程主要负责RAC数据库内存中排队(Enqueue)资源的管理。由于RAC数据库各个实例可以对同一个资源进行操作,所以需要LMD进程对这些排队资源进行管理和协调。
6.LCK
该进程主要负责处理对除数据块以外的资源申请要求的。主要用来管理library cache lock, row cache lock。当一个进程需要申请持有一个library cache lock或者row cache lock时,LCK会向所有实例的LCK发送这个请求。如果其它节点的LCK以不兼容的方式持有这个锁,则该节点LCK会通知持有该资源的进程释放对应的锁。
7.LMHB
该进程主要用来对LMS, LMON,LMD,LCK等进程进行心跳,以此获得这些进程的状态。当以上进程因为某些原因出现夯时,LMHB会在DB alert日志中输出ORA-29770告警信息。当夯的时间超时的时候,LMHB会将夯住的进程terminate。这样会导致instance宕机。
8.ASMB
RAC DB数据库实例和ASM实例中存在的进程。DB数据库实例中的ASMB进程是用来与ASM实例进行连接通信的进程。当某个节点的ASM实例出现故障时,ASMB可以向健存的ASM实例发起再连接。
9.DIAG、DIA0
诊断进程,用来将RAC DB中的性能信息 dump到trace文件中。诊断进程是轻量级的,并不会对数据库造成性能影响。
当数据库发生夯时,dia0会监知到夯的信息,并尝试解决。
dia0动作分为6个阶段:
1.DETECT Phase
dia0会每32秒取一次session的snapshort,取3次之后会比较其结果,如果处于同一个待机事件,或者处于not in a wait的状态时,会视该session处于夯的状态。
2.HA (Global Hang Analyze) Phase
从各节点的dia0进程收集可能处于夯状态的session信息,制成Wait For Graphs。
3.ANALYZE Phase
根据收集到的信息确定引起夯的root session。
4.VERIFY Phase
继续确认是否处于夯的状态。
5.VICTIM (Victim Selection and Hang Resolution) Phase
kill 掉 root session或者进程,尝试解除夯。
6.HAONLY Phase
绘制全局 Wait-For-Graphs。