Oracle RAC原理
单点数据库VS RAC
![](https://pic3.zhimg.com/80/v2-beac885ba46a2098e9d2089e44009312_720w.jpg)
单节点数据库,如果实例宕机了,如果一个业务链接在实例上面,那么这个业务就中断了。这个时候系统就不具有可用性了,那么这个时候单节点的可用性是很差的。
对于RAC来说,和单实例一样,还是一份数据文件,都是相同的存储上面放着oracle的文件,但是是由三个实例共用同一份数据文件。这样的好处是在三个实例之间做了冗余,在上面三个实例当中任意两个坏了业务都可以链接到剩下的一个实例,都可以正常的工作。RAC提供了在实例级别的冗余。
RAC不能够解决在数据的安全,尽管有多个实例,但是只有一份数据文件,这样只要数据文件损坏了,那么整个数据库就损坏了。
什么是RAC
![](https://pic4.zhimg.com/80/v2-035a041d45538e871586b70f87e4c933_720w.jpg)
一般每个实例都放在不同的服务器上面,这样可以起到冗余作用。所有的数据库文件都放在共享存储上面,但是还有一些文件放在每个实例自己的本地的磁盘上面,比如参数文件,每一个实例都可以有自己的参数文件,这个参数文件既可以放在本地也可以放在共享存储上面,多个实例都使用同一个参数文件。
在RAC里面,最重要的就是实例和实例之间的交互,即使是分离的实例,但是读取的数据是相同的,RAC不是分布式的系统,因为它只有一个存储,分布式系统是指数据发布在不同的数据库上面,然后通过中间件来协调做查询。RAC还是一台数据库,多个实例。
RAC架构
![](https://pic4.zhimg.com/80/v2-4220d72dccce8523fca9760b907ea157_720w.jpg)
对于RAC来说至少有两套物理上不同的网络,私有网络是专门用来实例之间的数据交互。如果私有网络,所有的数据都在一个网络下面,那么那么就会对数据造成影响,严重的影响RAC的性能了。实例之间数据之间传递使用私有网络和对外服务提供的网络之间是物理分开的。所以RAC至少有两套网络,一个是实例之间的数据的传递,另外一个是公有网络,是对外提供服务的,外面的业务是提供公有网络的IP链接到数据库的。
RAC的特点
除了具有普通的数据库特性外:
每一个节点的instance都有自己的SGA
每一个节点的instance都有自己的background process
每一个节点的instance都有自己的redo logs
每一个节点的instance都有自己的undo表空间
每一个节点的实例都有自己的SGA,但是之间在SGA里面的数据块都是需要相互传递的。
每一个节点都有自己的redo,redo不是共用的。虽然redo是放在共享磁盘上面,但是每个实例都有自己的redo,各有各的。当实例2坏了,实例1做恢复的时候可以通过实例2的redo信息来进行恢复。
每个实例都要处理自己的一套事务,所以需要使用自己的UNDO。
所以在RAC架构下面,每一套实例都有自己的东西。
RAC如何容错的
![](https://pic4.zhimg.com/80/v2-bc2f5b6a0a1c7138ec5cbc1d545d3b27_720w.jpg)
使用SAN存储,存储和服务器就不在一起了,而是和服务器分离了,是一个网络的存储系统,服务器是服务器,存储是存储,完全分离的。
当节点1坏了,不仅仅只是将业务切换到节点2,这个时候还要处理节点1坏了遗留下来的问题。主要是一些提交和未提交的事务。比如实例1坏了,实例2就要从实例1的redo里面读最后一次checkpoint之后的信息,就是实例1最后将所有的数据写到磁盘之后产生的所有的redo应用,该回滚的回滚,该恢复的恢复。即现将以提交和未提交的事务产生的redo都先应用,因为是最后一次checkpoint之后的信息,之前的信息是已经写到磁盘上面了,所谓的恢复是将未写到磁盘上面的信息进行恢复。(虽然实例坏了,但是实例的redo并没有坏,放置在共享存储上面,它的redo还是允许其他实例访问的)实例2读取实例1的redo,然后全部应用一遍,之后再回滚未提交的事务修改的数据块,这个有点像实例的恢复。
RAC Background Processes
![](https://pic1.zhimg.com/80/v2-46bf426b31a48f0f783ecc58abfe5fe8_720w.jpg)
这里面会比单实例环境下面的实例多出几个进程。多出来的进程就用来保证在rac环境下面rac之间交换需要做的比如锁,资源交换之间的控制。
RAC相关的后台进程
LMS - Gobal Cache Service Process 全局缓存服务进程
LMS进程是在RAC环境下面最重要的一个进程,是处理全局的缓存,所谓的缓存就是数据库一个实例到另外一个实例数据的交换进程。
LMD - Global Enqueue Service Daemon 全局查询服务守护进程
LMON - Global Enqueue Service Monitor全局查询服务监视进程
LCK0 - Instance Enqueue Process 实例查询进程
DIAG (Diagnostic Daemon) 诊断守护进程
RAC后台进程
LMON--Lock Monitor Processes
监控整个集群状况,维护GCS的内存结构。
处理非正常终止的进程和实例。
当实例离开和加入集群时,锁和资源的重新配置。
管理全局的锁和资源。
监控全局的锁资源,处理死锁和阻塞。
也被称为Global enqueue service monitor
LMSn-- Lock Monitor Services
LMS进程主要用来管理集群内数据块的访问,并在不同实例的BUFFER CACHE
中传输块镜像。
当在某个数据块上发生一致性读时,LMS负责回滚该数据块,并将它copy到请求的实例上。
每个RAC节点至少有2个LMS进程。 也称作 GCS (Global Cache Services) processes.
LCK--Lock Process
LCK进程主要用来管理实例间资源请求和跨实例调用操作,调用操作包括数据字典等对象的访问;并处理非CACEH FUSION的CHACE资源请求(例如:DICTIONARY CACHE或row cache的请求)由于LMS进程负责主要的锁管理功能,所以每个实例只有一个LCK进程。
可以看到有这么多的进程都和锁有关系,归根结底就是一个数据块从一个实例到另外一个实例,维护一致性的依据就是锁。只有通过锁才可以维护数据块在两个实例之间的一致性。
LMD--Lock Monitor Daemon Process
LMD进程主要管理对全局队列和资源的访问,并更新相应队列的状态,处理来
自于其他实例的资源请求。
每一个全局队列的当前状态存储在相应的实例共享内存中,该状态表明该实例
具有相应的权利使用该资源。
一个实例(master)的共享内存中存在一个特殊的队列,该队列纪录来自其他远
程实例的资源请求,当远程实例的LMD进程发出一个资源请求时,该请求指向
master实例的LMD,当master实例的LMD进程受到该请求后,在共享内存中的
特殊队列中监测该资源是否无效,如果有效则LMD进程更新该资源对列的状态
,并通知请求资源的LMD进程该资源队列可以使用了,如果资源队列正在被其
他实例使用或者当前无效,则LMD进程通知正在使用中的实例的LMD进程应该
释放该资源,等资源释放变得有效时,MASTER实例的LMD进程更新该资源队
列的状态并通知请求资源实例的LMD进程该资源队列可以使用了。
DIAG (Diagnostic Daemon)
Oracle10g新的后台进程。
例行对实例的健康情况进行监控,同时也监控实例是否挂起或者出现死锁。
收集实例和进程出错时的关键诊断信息。
这个进程会更新alert日志文件,写入一些重要告警信息。
上面这些都是RAC下面实例多出的进程,下面就是RAC自己的进程了。
RAC的服务进程
独立的服务CRS
CRS- 集群资源服务
CSS - 集群同步服务
EVMD 事件管理服务
ONS--事件的发布及订阅服务
用来协调两个实例之间来访问存储,这个架构就是CRS。在RAC下面因为要对全局资源进行控制,所以实例不能直接访问存储,必须通过CRS层来访问。(RAC指的是架构,具体是由CRS这套服务来实现的,这套服务里面有上面的四个服务组成)。
CRS--Cluster Ready Services
管理集群内高可用操作的基本程序。
CRS管理的任何事物被称之为资源
数据库、实例、监听、虚拟IP(VIP)地址、应用进程等等
CRS是根据存储于OCR中的资源配置信息来管理这些资源
当一资源的状态改变时,CRS进程生成一个事件。
CSS--Cluster Synchronization Service
管理集群节点的成员资格
控制哪个结点为集群的成员、结点在加入或离开集群时通知集群成员来控制
集群的配置信息
此进程发生故障导致集群重启
EVM--Event Management
事件管理守护进程。
发布CRS创建事件的后台进程
ONS--Oracle Notification Service
通信的快速应用通知事件的发布及订阅服务
Oracle集群体系结构
Oracle RAC,全称是Oracle Real Application Cluster,即正真的应用集群,是Oracle提供的一个并行集群系统,整个集群系统由Oracle Clusterware(集群就绪软件)和Real Aplication(RAC)两大部分组成。
Oracle RAC的实质是位于不同的操作系统的Oracle实例节点同时访问访问同一个Oracle数据库,每个节点间可以通过私有网络进行通信,互相监控节点的运行状态,Oracle数据库所有的数据文件,联机日志文件,控制文件等均放在集群的共享设备上面,而共享设备可以是RAW,ASM,OCFS2等,所有集群节点可以同时读写共享存储,Oracle RAC的基本拓扑结构如下。(RAW就是裸设备,没有文件系统,就是直接在硬盘上面进行读写)。
![](https://pic2.zhimg.com/80/v2-ae9ea6bbae7dd0694fdfab06e835eaa9_720w.jpg)
这个图分为三个部分,第一个部分就是客户端,第二个部分是节点部分,最后一部分是共享存储部分。
作为用户会去访问集群数据库,在节点层有许多节点,每一个节点相当于一个主机,或者一个操作系统。每一个操作系统是安装在一台服务器上独立完成的。最底层是os,即操作系统。在操作系统上层安装的是clusterware,这是一个高可用的集群软件。再上面一层是oracle rac数据库,这个数据库还启动了rac监听,每一个节点都是有os,clusterware,oracle rac listener三部分组成的。
在10g之前的产品,如果要使用rac集群就必须要借助第三方高可用软件。在10g之后Oracle推出了自己的一款clusterware,对于高可用软件这部分可以使用oracle自身的,也可以使用第三方的。
在每一个节点上面启动相关的实例,每一个实例会启动相关的监听端口。这个端口就是监听客户端过来的请求,在Oracle集群当中可以有多个节点。
共享存储是rac为了实现数据的共享,实现共享方式有很多种,比如raw,asm等。
由拓扑结构可知:
一个Oracle Rac数据库有多个服务器节点组成,每个服务节点上面都有自己独立的OS,ClusterWare,Oracle RAC数据库程序等,每个节点都有自己的网络监听器。ClusterWare是一个集群软件,主要用于集群系统管理,Oracle RAC数据库程序用于提供Oracle实例进程,以提供客户端访问集群系统,监听服务主要用于监控自己网络端口的信息,所有的服务和程序提供操作系统都去访问一个共享存储,最终完成数据的读写。共享存储的方式有很多种,可以通过自动存储管理(ASM),Oracle集群文件系统(OCFS),裸设备(RAW),网络共享区域存储(NAS)等来保证整个集群系统的数据一致性。
Oracle rac数据库和经常所说的数据库有什么区别呢?Oracle rac数据库主要是提供oracle实例进程,以供客户端访问集群系统。从Oracle运行机制来说,集群中每台服务器就是一个Oracle实例,多个实例对应同一个Oracle数据库,组成了Oracle数据库的集群。
从图中可以看出,运行在两个节点上面的数据库访问同一个RAC数据库,并且两个节点的本地磁盘仅用存放Oracle安装程序和ClusterWare软件,而在共享存储上,存放着Oracle的控制文件,数据文件,联机日志文件,归档日志文件等,这是安装Oracle Rac时的一种数据存储方式,其实,RAC提供了多种数据存储方式。
集群里面的每一个服务器或者里面的每一个节点就是一个Oracle实例,有多个节点或者说是多个实例同时访问同一个数据库。从上图可以看到节点的本地磁盘上面存储的是Oracle的安装程序和clusterware集群软件的程序。在共享存储上面存放着Oracle的数据文件,控制文件,联机文件等等。