集群、RAC和MAA
集群:是一种由两台或多台节点机构成的松散耦合的计算节点集合,这个集合在整个网络中表现为单一的系统,并通过单一接口进行使用和管理。给用户提供网络服务或应用程序的单一视图。大多数模式下,集群中所有计算机都拥有一个相同的名称,集群内任意一个系统都可以被所有网络客户所使用。当一个应用服务发生故障时,应用服务将被重新启动或被另一台服务器接管。客户将能很快连接到新应用服务器上,理想情况下用户甚至感觉不到这种故障存在。
一、集群技术基础
1.集群地址
维护集群地址的设施被称为负载均衡器。对内负责管理各节点加入和退出,对外负责集群地址向内部实体地址转换。
2.内部通信
节点间心跳测试信息、服务实体间任务执行上下文信息的通信。
3.集群仲裁
二、集群术语
1.两大特性:可扩展性和高可用性
可扩展:新的服务实体可以动态的加入集群,从而增强集群性能。
高可用性:通过对服务实体的冗余配置,使客户端减少遇到“服务宕机”的可能性。
2.两大核心能力:负载均衡和故障转移
负载均衡:把处理任务尽可能均衡的分散到集群中的每个节点和网络资源。
故障转移:集群中正在执行任务的服务出现故障,另一服务实体中执行同一任务的资源将接手并继续完成任务,这个过程叫故障转移。
三、集群组成元素
-
Cluster
通过心跳网络,基于共享存储磁盘的心跳网络,将一组机器整合而成的一个集群。 -
Node
Cluster中的一个主机 -
Resource
可以从主机接管到备机上的逻辑实体,比如IP地址、文件系统、应用程序
四、集群分类
根据不同功能分类
-
高性能计算集群
将计算任务分配到不同计算节点来提高整体计算能力,多见于搜索引擎、文本挖掘等互联网业务。 -
负载均衡集群(LB)
核心是把业务的负载流量尽可能平均合理的分摊到集群各个节点。每个节点可以处理一部分负载,并且可以根据节点负载进行动态平衡。 -
高可用性集群(HA)
侧重提高系统可用性,通过集成硬件和软件容错性来实现整体服务高可用。如果某节点发生故障,将由另外节点代替。RAC就同时具有HA和LB两种能力。
五、Oracle高可用架构(MAA)
最大可用性体系架构
MAA是通过把所有可用技术组合起来,减少或者消除计划内和计划外的系统宕机时间,包括来自各方面的风险,从硬件故障导致的数据破坏、到自然灾害引起的大范围瘫痪。
RAC不是一个独立的产品,更像是一个实施方案或者指导方针,把Oracle产品中可用于数据保护的技术汇集在一起,进行归纳、整理、分析,最终提出一个“最佳时间规划”。
1.MAA实例
MAA核心思想就是冗余,通过数据、软件、硬件、网络等各种组件的冗余,实现最大程度的数据保护。
易混淆概念:
1)双机热备
两个或多个主机连接一个共享的存储设备,当主机服务器发生故障时,一旦Cluster软件侦测到故障,就会把备用机器激活,保证应用继续提供服务。
2)双机互备
双机热备技术的扩展,当一个服务器出现故障时,另一台机器可以很快把服务接管过来,保证业务连续性。
3)Oracle DataGuard
DataGuard环境也有多个数据库节点,其中一个是活跃的,其余为备用状态Standby,由Primary节点对外提供服务,Primary节点和Standby节点之间通过日志传递,日志恢复机制实现数据同步。当Primary节点发生故障时,可以由DBA或者系统自动进行Primary、Standby角色切换。
区别:DataGuard环境中的两个或者多个主机 并不需要共享存储设备,每个有自己的存储数据,其次DataGuard环境中并不需要心跳机制。
2.RAC集群
逻辑上看,RAC集群由存储层、网络层、集群件层、应用层4层组成
存储层:
RAC是一个多实例、单份数据的系统。数据文件、联机日志文件、控制文件等文件在集群中只有一份。不管有几个节点,这些节点都平等的使用这些数据文件。一般采用EMC等存储阵列,每个服务器通过HBA卡和光纤线连接到存储上。
网络层:
RAC环境有3个物理网络存在:
一个是由每台服务器的Public网卡组成的网络,对外提供数据查询等服务;
一个是由每台服务器的Private网卡组成的私有网络,用于RAC心跳网络和Cache Fusion
一个是存储设备、光纤交换机、每个节点HBA组成的存储网络。
前两个传输IP数据,后一个传输SCSI数据
集群件层:
Clusterware会在OS Kernel之前截获数据库发出的请求,然后和其他节点上Clusterware协商,最终完成上层请求。
应用层:
整个应用层由若干CRS组成,可以简单的理解,一个Resource通常是一个进程、或者由一组进程组成的一个完整服务。
3.RAC集群环境问题3.RAC集群环境问题
1)并发控制
集群环境只能很高数据是共享存放,而集群内各个节点身份是对等的,所有节点对数据有相同的访问权利。利用DML(Distribute Lock Management)机制进行多个实例间的并发控制。
2)健忘症
两个节点集群,节点1因为正常的维护需要被关闭,然后在节点2修改了某些配置,然后关闭了节点2,启动节点1,因为节点2的配置修改没有同步到节点1,所以节点1启动后仍然使用旧配置文件工作,这时就会造成配置丢失,就是所谓的“健忘症”。
3)脑裂
集群里,节点间需要通过某种机制(心跳)了解彼此健康状况,以确保节点间协调工作,假设只是“心跳”出现故障,但各节点还在正常运行,这时每个节点都认为其他节点宕机,自己是整个集群环境中的“唯一健在者”,自己应该获得整个集群的“控制权”。在集群环境中,设备都是共享的,这就意味着数据灾难,这种情况就是“脑裂”。
解决脑裂的通常办法是使用投票算法:
集群中各节点需要心跳机制来通报彼此“健康状况”,假设每收到一个节点的“通报”代表一票。对于一个三节点集群,正常运行时,每个节点都会有3票,假设节点1的心跳出现故障,但是节点1还在运行:这时整个集群就分裂成两个小的partition,节点1自己是一个partition,节点2和节点3是一个partition。这时就必须剔除一个partition,应该剔除哪一个?
这时节点2和节点3组成的partition,每个节点有两票:节点1自己一个partition,节点1只有一票。节点2和节点3组成的小集群获得控制权,而节点1被踢出,由节点2和节点3组成的新的集群继续对外提供服务。
如果集群中只有两个节点,则就必须引入第三个设备Quorum Device。
Quorum Device通常采用共享磁盘,这个磁盘叫Quorum Disk。整个Quorum Disk也代表一票。当心跳出现故障时,两个节点同时去争取Quorum Disk这一票,最早到达的请求最先被满足,最后到达的节点就无法获得这一票,只有一票的节点就会被踢出集群。
4)IO隔离
为了保证被踢出集群的节点不能操作共享数据,这就是IO隔离要解决的问题。
有软硬两种方式:
支持SCSI Reserve/Release命令的存储设备,可以用SG命令实现。正常节点使用SCSI Reserve命令“锁住”存储设备,故障节点发现存储设备被锁住后,就知道自己已经被赶出集群了,就要自行重启,这个机制也叫自杀。
STONTH是另一种实现方式,直接操作电源开关。当一个节点发生故障时,另一节点如果能侦测到,就会通过串行口发出命令,控制故障节点的电源开关,通过暂时断电而后又上电的方式使得故障节点被重启动,这种方式需要硬件支持。
Oracle RAC采用的是软件方式,直接重启故障节点。
5.RAC优点
- 增加可用性
- 增加扩展能力
- 增加可维护性
- 减少总持有成本
1)增加可用性
RAC确实可以有效较少计划外宕机时间,但也不是百分百消除,让然会有部分停止响应时间。
当一个节点或者实例Failed时,RAC Database会发生Crash Recovery。在其他健康节点上的Oracle Clusterware软件能够检查到这个节点或者实例Failure,并通知其他节点。最先察觉到发生故障的那个节点,会读取故障节点的联机日志内容(从最后一次检查点开始读起),并且把这些日子在数据库上重演,这个过程就是前滚(roll-forward),然后所有未提交的事物被回滚撤销掉(roll-back)。在前滚和回滚过程中,整个集群处于冻结状态forzen,这个节点不能处理任何请求,只有全部完成后,才能继续对外提供服务。这个过程叫做“brown-out”阶段。知识这个阶段可能很短。
但是,RAC环境数据本身只有一份,没有任何冗余数据,同时结构也变复杂,包括共享存储、私有网络、光纤网络也引入了更多的故障点。升级也变的复杂,数据库升级必须关闭整个数据库,不能减少计划内宕机时间。
2)扩展性
通过增加资源的方式导致系统吞吐量增长。
对于RAC而言,最好的扩展能力是1.8,应为数据库扩展能力很大部分取决于应用系统的使用方式。
3)容易管理
原来企业中有多个数据库,通过 部署RAC把原来多个数据库整合成一个多节点的RAC数据库,随着数据库减少,DBA管理任务自然减少。
但是RAC环境下,升级是一个很复杂的操作,其次多应用整合到一个数据库中,RAC宕机将影响更多的应用系统,计划内宕机时间更短,人力成本更高。
是否应该选择RAC,最有资格做决定是DBA自己,因为只有你自己知道你的需求、预算、预期。一定要问清自己想通过RAC解决什么问题。RAC并不是包治百病的“万金油”,因此,在考虑RAC之前一定要确定你已经考虑过其他解决方案。
一个好或者坏的系统都是被设计出来的,最初的视野决定了最终系统的负载能力。决定选择RAC之前,一定要确保理解了RAC的优缺点,一定要确保其他方案无法奏效,只有RAC一条路可以走。那种单节点表现极差,并且没有做过任何调整,就企图用RAC解决性能问题的,无异于自寻死路。
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">