RAC 的一些概念性和原理性的知识(转自戴明明的一篇文章)
1.1 并发控制
在集群环境中, 关键数据通常是共享存放的,比如放在共享磁盘上。 而各个节点的对数据有相同的访问权限, 这时就必须有某种机制能够控制节点对数据的访问。 Oracle RAC 是利用DLM(Distribute Lock Management) 机制来进行多个实例间的并发控制。
1.2 健忘症(Amnesia)
集群环境配置文件不是集中存放的,而是每个节点都有一个本地副本,在集群正常运行时,用户可以在任何节点更改集群的配置,并且这种更改会自动同步到其他节点。
有一种特殊情况: 节点A 正常关闭, 在节点B上修改配置, 关闭结点A,启动结点B。 这种情况下,修改的配置文件是丢失的, 就是所谓的健忘症。
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命令"锁住"存储设备, 故障节点发现存储设备被锁住后,就知道自己被赶出了集群,也就是说自己出现了异常情况, 就要自己进行重启,以恢复到正常状态。 这个机制也叫作 Sicide(自杀). Sun 和Veritas 使用的就是这种机制。
硬件方式:STONITH(Shoot The Other Node in the Head), 这种方式直接操作电源开关,当一个节点发生故障时,另一个节点如果能侦测到,就会通过串口发出命令,控制故障节点的电源开关,通过暂时断电,而又上电的方式使故障节点被重启动, 这种方式需要硬件支持。
二 RAC 集群
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,DATABASE 和CRS。每个分支下面又有许多小分支。这些记录的信息只能由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必须从集