RAC本质还是一个数据库,采用了分布式锁管理器。DLM作用是协调实例间对资源的竞争访问,而实例内部的竞争和单实例一样。在RAC数据库中一个节点想要修改数据,都需要想DLM发送请求,通过DLM控制授权节点实例间的数据访问,RAC间实例访问粒度是数据块。DLM协调资源使用的功能叫做同步,所有的资源访问都是需要同步。RAC 将锁分为本地锁和全局锁,本地锁用于本地进程间的并发控制,也就是单实例中的锁机制。全局锁用于集群间的并发控制。
全局锁分为cache fusion和non-cache fusion
non-cache susion资源有限主要是row cache存放对象定义,library cache存放SQL代码,执行计划等,这些都是有限的,同时这些资源修改的频率也很小,所以oracle采用了类似广播的机制,每个节点的变化都要通告给其他节点,任何节点对对象的修改,所有其他节点上的对象都会失效。每个引用对象都会被LCK0进程多加上一个shared-mode的IV instance lock,由LMD进程负责LCK之间的广播通信。
cache fusions:主要是buufer cache数据块多,修改密集,不太适合每个修改都需要节点实例间广播,其首要解决的问题就是数据拷贝在集群间的 状态分布图。
在RAC中GRD(Global Resource Directory)是一个位于SGA中,记录每个数据块在集群间的分布图的内部数据块,每个实例都是部分GRD,所有实例的GRD汇总在一起才是一个完整的GRD。RAC根据资源名称在集群中选择一个节点为master node,其GRD中记录该资源在所有的节点使用信息;而其他节点作为shadow node的GRD只是记录资源在该节点的使用信息。
RAC的后台进程:
LMSn:cache fusion主要进程,负责数据块在实例间传递,对应的服务叫GCS,来源于Lock Manager Server,数量是通过GCS_SERVER_PROCESS来控制,范围为0-9
LMD:提供Global Enqeue Service(GES).负责进程在多个实例间协调对数据块的访问顺序,保证数据访问的一致性。
LCK:负责non-cache fusion资源的同步访问,每个实例一个。
LMON:各个实例间进行定期通信,以坚持各节点的健康状况,当某个节点出现故障时,负责重构集群、GRD恢复等操作,它提供了Cluster Group Services(CGS).其服务有以下要点:
DIAG:监控进程实例的状态,并在实例出现运行错误时收集诊断数据记录到alert.log日志中。
GSD:负责客户端工具如srvctl用户命令管理接口
文件布局特点:
spfile,放在共享存储
redo thread ,每个实例有一套自己的redo log文件记录日志
archive log,每个实例都有自己的归档日志,做media recovery时才会用到全部归档,也就才需要共享存储,采用nfs,CIA或者ASM就可以
Undo tablespace,每个实例都要有自己的单独回滚表空间。
SCN:由GCS维护,所有实例节点都带有SCN,每个节点将收到的SCN与本机的SCN对比,如果本机的SCN小,则调整本机的SCN和接收到的一致,节点间定期通报,每个commit操作后需要向其他节点通报SCN。
cache fusion通过高速的private interconnect在实例间进行数据块传递,这个是RAC的核心工作机制,整个cache funsion有两个服务:GCS和GES,GCS负责数据块在实例间的传递,而后者负责锁管理。