备注:本文摘抄于张晓明《大话Oracle RAC:集群 高可用性 备份与恢复》
因为集群环境需要多个计算机协同工作,要达到理想状态,必须要考虑在集群环境下面临的新挑战。
1.并发控制
在集群环境中,关键数据通常是并发存放的,比如放在共享磁盘上。而集群内各个成员的生身份是对等的,所有节点对数据有相同的访问权利。这时就必须有某种机制能够控制节点对数据的访问。
在Oracle rac中,是利用DLM (Distribute Look Management)机制来进行多个实例间的并发控制。
2.健忘症 (Amnesia)
这个问题发生在集群配置文件不是集中存放,而是每个节点都有一个本地副本。在集群正常运行时,用户可以在任何节点更改集群的配置,并且这种更改会自动同步到其他节点。
但考虑这样一种场景:两个节点的集群,节点1因为正常的维护需要被关闭,然后在节点2修改了某些配置,然后关闭节点2,启动节点1。因为之前在节点2做的配置修改没有同步到节点1,所以节点1启动后,它仍然是用旧的配置文件工作,这时就会造成配置丢失,也基于是所谓的"健忘症"。
解决"健忘症"最简单的办法是,整个集群使用一个集群配置文件,无论哪个节点修改了配置信息都是同一分,配置信息对每个节点都是一样的。
Oracle RAC使用OCR DISK 文件来解决这个问题。
3.脑裂 (Split Brain)
在集群里,节点间需要通过某种机制(心跳)了解彼此的健康状况,以确保各节点协调工作。假设只是"心跳"出现故障,但各个节点还在正常运行。这时,每个节点都认为其他节点宕机,自己是整个集群环境中的"唯一健在者",自己应该获得集群的"控制权"。在集群环境中,存储设备都是共享的,(都来控制独享,势必会破坏数据的完整性和一致性)这就意味着数据灾难,这样一种状况就是"脑裂"。
解决这个问题的通常办法是使用投票算法(Quorum Algorithm),这个算法的原理如下:
集群中各个节点需要心跳机制来通报彼此的"健康状况",假设每收到一个节点的"通报"代表一票。对于三个节点的集群,正常运行时,每个节点都会有3票(自己和另外两个节点的通报)。假设节点1的心跳出现故障,但是节点1还在运行:这时整个集群就会分裂为两个小的Partition。节点1自己是一个Partition,节点2和节点3是一个Partition。这时就必须剔出一个Partition,应该剔出哪个Partition呢?
这时节点2和节点3组成的Partition,每个节点有两票;节点1自己是一个partition,节点1只有一票。安装投票算法节点2和节点3组成的小集群获得了控制权,而节点1被踢出,由节点2和节点3组成的新的集群继续对外提供服务。
如果集群只有两个节点,则上面的算法就没有用了,因为每个节点只有一票,没有办法比较。这必须要引入第3个设备Quorum Device。
Quorum Device通常采用的是共享磁盘,这个磁盘也叫Quorum Disk,这个Quorum Disk也代表一票。当新跳出现故障时,两个节点同时去争取Quorum Disk这一票,最早到达的请求被最先满足,后到达的这个节点就无法获得这一票。这时,最先获得Quorum Disk的节点就获得两票,而另一个节点只有一票,就会被踢出集群。
在ORACLE RAC中Voting Disk用来记录节点间成员的状态,当出现脑裂时,仲裁哪个partition获得控制权,其他的partition被踢出。
4.IO隔离 (IO Fencing)
这个问题是脑裂问题的延伸,当集群出现"脑裂"时,必须要能够判断出哪个节点应该获得集群的控制权,哪些节点要被赶出集群,这就是"投票算法"要解决的问题,前一部分已经做了解释。
但仅仅这样做是不够的,还必须保证被赶出来的节点不能操作共享数据。因为这时该节点可能还在运行中,如果不加限制很有可能会修改共享数据。这是IO隔离(IO Fencing)要解决的问题。
IO Fencing实现有硬件和软件两种方式。对于支持SCSI Reserve/Release命令的存储设备,可以使用SG命令实现。正常节点使用SCSI Reserve命令"锁住"存储设备,故障节点发现存储设备被锁后,就知道自己被赶出集群了,也就是说知道自己出现了异常状况,就要自行重启,以恢复到正常工作状态,这个机制也叫做suicide (自杀),Sun和Veritas使用的是这种机制。
STONITH (Shoot The Other Node In The Head)是另一种实现方式,这种方式直接操作电源开关。当一个节点发生故障时,另一个节点如果能够侦测到,就会通过串行口发出命令,控制故障节点的电源开关,通过暂时断电,而后又上当的方式使得故障节点被重启动。这种方式需要硬件支持。
Oracle Rac采用的是软件方式,直接重启故障节点。无论采用哪种方式,IO Fencing目的都是相同的,为了保障故障节点不能再继续访问共享数据。
------摘抄于张晓明《大话Oracle RAC:集群 高可用性 备份与恢复》