对于RAC来说,最重要的还是要理解内部原理和体系结构。安装不是非常难的事情。排错和维护都离不开体系结构以及内部原理。
1、高性能计算
计算任务分配到不同计算机节点来提高整体计算能力,主要应用在科学计算领域。主要利用的是并行计算。
2、负载均衡集群(LB)
把业务的负载流量尽可能的平均合理的分配到集群的各个节点上,每个节点都可以处理一部分负载,并且可以根据负载情况进行动态的平衡。负载均衡算法不是简单的平均,而是根据每个节点的可用资源或网络的特殊情况来进行优化分配。因此分配+合理才是负载均衡的核心。
3、高可用性(HA)
侧重于提高系统的可用性,集成硬件和软件的容错性来实现整体服务的高可用性。如果某个节点发生故障,另外的节点代替他。
RAC是真正的LB和HA的复合体。从某种意义上说,只有最终应用(数据库)才能实现真正意义上的LB,而绝大多数的集群都是HA。
集群环境的特殊问题
1、并发控制
集群环境中,存在共享存储的问题。集群中各个节点对共享存储是对等的,所有节点对数据有相同的访问权限,因此需要某种机制来控制节点对数据的访问。
在RAC中,采用的是DLM(Distribute Lock Management)机制来进行实例间的并发控制。
2、健忘症(Amnesia)
如果集群环境的配置文件不是集中存放,每个节点都有一个本地副本,集群正常运行的时候,用户可以在任何节点修改集群的配置,并且这些更改都会自动同步到其他节点。
如果节点1因为正常的维护需要关机,节点2修改了配置,然后关闭节点2.启动节点1,因为之前节点2做的配置修改没有同步到节点1,所以将节点1启动以后,他仍然使用旧的配置文件,造成配置丢失。
3、脑裂(split brain)
集群中,节点之间需要通过某种机制(心跳)了解彼此的健康情况,以确保各个节点协调工作。假设只是心跳出现故障,各个节点还在正常的工作,每个节点都认为其他节点宕机,自己是整个集群的唯一健在者,因此需要获得整个集群的“控制权”。存储是共享的,这就意味着灾难,这种情况就是“脑裂”。
投票算法可以解决这个问题
每个节点会在投票区记录自己的票数(自己收到了多少节点的心跳,一个心跳是一票),各个节点会读取其与节点的票数。
如果一个集群分成了两个partition,一个partition是3个节点,一个partition是2个节点。那么3个节点的partition里面所有的节点的票数都是3,两个节点的partition里面所有节点的票数都是2.拥有两个节点的partition会被踢出,自动重启。如果两个partition的节点都相同,那么第一个控制投票区的partiton将会存活,另外一个partition将会被踢出而重启,这种情况通常是master节点(一般是第一个启动的节点)所在的partition将会存活。
4、IO隔离(IO Fencing)、
集群出现故障,必须判断哪个节点应该获得集群的控制权,那些节点需要被踢出。这时投票需要解决的问题。
仅仅将他们踢出还不足够,因为他们可能还在继续运行(只是离开了这个集群),需要保证他们不再访问共享数据。这就是IO隔离要解决的问题。
IO Fencing实现有硬件和软件方式。各个集群厂商使用的方式不同,有些需要硬件的支持(主要是存储设备是否支持某些协议)。Oracle RAC使用的是软件的 方式,直接重启故障节点。
无论采用哪种方式,IO Fencing的目的就是保证故障节点不能继续访问共享数据。
有一些存储设备支持SCSI Reserve/Release命令,正常节点使用SCSI Reserve命令锁住存储设备,故障节点发现存储被锁定,就知道自己已经被踢出了cluster,自行重启,这种机制叫做自杀机制(suicide)。例如Sun和Veritas的集群使用的就是这种机制。
无论软件还是硬件,大致原理就是:正常节点通过某种方式告知故障节点,故障节点会进行重启。告知的方式有硬件和软件之分,硬件更加安全一些。