什么是集群
集群(Cluster)是由两台或多台节点机(服务器)构成的一种松散耦合的计算节点集合,为用户提供网络服务或应用程序(包括数据库、Web服务 和文件服务等)的单一客户视图。集群系统一般通过两台或多台节点服务器系统通过相应的硬件及软件互连,每个群集节点都是运行其自己进程的独立服务器。这些 进程可以彼此通信,对网络客户机来说就像是形成了一个单一系统,协同起来向用户提供应用程序、系统资源和数据。除了作为单一系统提供服务,集群系统还具有 恢复服务器级故障的能力。集群系统还可通过在集群中继续增加服务器的方式,从内部增加服务器的处理能力,并通过系统级的冗余提供固有的可靠性和可用性。
集群的分类:
1、高性能计算集群:
高性能计算集群采用将计算任务分配到不同节点来提高整体计算能力主要应用在科学计算领域。
2、负载均衡集群LB:
负载均衡集群为企业需求提供更实用的系统。该系统使各节点的负载流量可以在服务器集群中尽可能平均合理地分摊处理。该负载需要均衡计算的应用程序处 理端口负载或网络流量负载。这样的系统非常适合于运行同一组应用程序的大量用户。每个节点都可以处理一部分负载,并且可以在节点之间动态分配负载,以实现 平衡。对于网络流量也如此。通常,网络服务器应用程序接受了大量入网流量,无法迅速处理,这就需要将流量发送给在其它节点。负载均衡算法还可以根据每个节 点不同的可用资源或网络的特殊环境来进行优化。
3、高可用性集群HA:
为保证集群整体服务的高可用,考虑计算硬件和软件的容错性。如果高可用性群集中的某个节点发生了故障,那么将由另外的节点代替它。整个系统环境对于用户是一致的。
实际应用中HA与LB经常是同时具备,ORACLE RAC就同时具备HA和LB。
集群环境的特殊问题
1、并发控制
在集群环境中,关键数据都必须是共享存放的 。各个节点都对数据有平等的访问权利 。因此必须要有某种机制控制节点对 数据的访问。
2、健忘症 Amnesia
在特殊的情况下比如:两个节点的集群,节点1因为正常维护需 要关闭,然后在节点2修改了某些配置,然后关闭节点2,启动节点1。因为在节点2修改的配置内容没有同步到节点1,所以节点1启动后,它仍然是用旧的配置 文件工作,这时就会造成配置丢失,也就是所谓的“健忘症“ 。
这个问题发生在集群环境配置文件不是集中存放,而是每个节点都有一个本地副本。在集群正常运行时,用户可以在任务节点更改集群的配置,并且更改会自动同步到其它节点。
3、脑裂Split Brain
在集群里,节点间需要通过心跳机制了解彼此的健康状况,以确保各节点协调工作。假设只是“心跳”出现故障,但各个节点还在正常运行 。这时每个节点都认为其它节点宕机,自己是集群中唯一健在者,自己应该获得整个集群的控制权。在集群环境里,存储设备是共享的,这就意味着数据灾难,这种 状况就是“脑裂”。
解决这个问题的算法通常就是投票算法。集群中各节点通过心跳来通报彼此的健康状况,假设每收到一个节点的通报代表 一票。对于一个三节点的集群,正常运行时 每个节点都会有3票。假设节点1 的心跳出现故障,但是节点1还在运行:这时整个集群就分裂成二个小的partition。节点1自己一个partition,节点2和节点3是一个 partition。 这就必须剔除一个partition。这时节点2和节点3所在的partition 每个节点有二票,节点1只有一票。所以节点2和节点3组成的小集群获得控制权,节点1被踢出。
如果集群只有二个节点,上面的算法就没用了,此时子集群内数目相等,则拥有最低节点号的子集群(Sub-cluster with lowest node number)将获得控制权,即总是1号节点会获胜。
关于节点间的脑裂问题,可参见笔者的如下文章
http://czmmiao.iteye.com/blog/1577531
4、IO 隔离 IO Fencing
这个问题是上一个问题的延伸。当集群系统出现脑裂时,必须判断那些节点获得控制权,那些节点要踢出集群。但这样还不够,还必须保证被赶出集群的节点不能操作共享数据。这就是IO隔离要解决的问题。
IO Fencing的实现有硬件方式和软件方式。对于支持SCSI Reserve/Release命令的存储设备,可以用SG命令实现。正常节点使用SCSI Reserve命令“锁住”存储设备,故障节点发现存储设备被锁住后,就知道自己已经被赶出了集群,就会自行重启,以恢复正常工作,这种机制叫 suicide。Sun和Veritas使用的是这种机制。
利用STONITH是另一种方式,这种方式直接操作电源开关。当一个节点发送故障时,另一个节点如果能侦测到,就会通过串行口发出命令,控制故障节点的电源开关,通过暂时断电而后又加上点的方式使得故障节点被重启。这种方式需要硬件支持。
ORACLE RAC采用的是软件方式,直接重启故障节点。无论采用哪种方式,IO Fencing目的都是相同的,为了保证故障节点不能再继续访问数据。
集群软件
集群层由各个节点上的集群软件组成,集群软件在集群环境的作用和地位与OS Kernel在单机系统中的地位和作用是一样的。在单机系统中,硬件资源是由OS Kernel管理的,应用软件是不能访问硬件的,必须通过OS Kernel提供的API接口间接访问。OS Kernel除了要完成用户请求,还要通过进程调度等机制来控制每台主机多进程对资源的使用。但是到了集群环境,硬件尤其是存储设备是共享使用的,不仅需 要协调每台主机内多进程的共享使用,还需要协调主机间进程的共享使用。这种需要传统的OS Kernel就无法满足了,这就需要集群软件的介入。
ORACLE Clusterware有以下几个组件
1、OCR(Oracle Cluster Registry)
负责维护整个集群的配置信息,包括RAC以及Clusterware资源,包括的信息有节点成员、数据库、实例、服务、监听器、应用程序等。
为了解决集群“健忘”的问题,最简单的解决办法就是整个集群只有一份配置,所有节点共用这份配置。ORACLE采用的方法就是把这个配置文件放在共 享存储上,这个文件就是OCR DISK。 节点通过OCR Process读写OCR。 但只有一个节点能够读写OCR DISK 叫OCR Master节点,其它节点通过本节点的OCR process 向master node的OCR process提交请求,由master OCR Process完成物理读写,并同步所有节点OCR cache中的内容。就OCR而言,每个集群都会有一个Master节点,这个节点一半来说是集群中生存时间最长的那个节点(生存时间最长也就意味着该节 点越稳定)。
我们在安装Clusterware的在选择OCR的存储位置时,如果选择"Normal Redundancy",则会存储两份相互镜像的OCR。如果选择"External Redundancy"则表明存储本身已经坐了冗余配置,不需要创建镜像OCR。该位置会记录在/etc/oracle/ocr.loc(Linux)或 /var/opt/oracle/ocr.loc(Solaris)中。
OCR key:整个OCR 的信息是树形结构,有3个大分支。分别是SYSTEM,DATABASE 和CRS。每个分支下面又有许多小分支。这些记录的信息只能由root用户修改。
2、Voting Disk 这个文件也要放在共享存储上,主要用于管理集群的节点成员身份,根据这里的记录判断哪些节点是集群的成员。并在出现脑裂时,仲裁哪个Partition获得集群的控制权。关于Voting Disk的跟多资料可以参见笔者的如下文章:
http://czmmiao.iteye.com/blog/1577531
网络层
在整个RAC环境中,实际上有三个网络
Public
网卡接入的网络,对外提供服务
Private
网卡组成的私有网络,用于RAC的心跳和Cache Fusion。之所以单独开辟一条链路是由于这些通信内容的特点是数据量大,低延迟。如果和对外网络在一起,会占用对外服务带宽。最为廉价常用的是采用G级以太网,有钱一点的可用采用InfiniBand
存储网络
由存储设备,光纤交换机和每个节点的HBA卡组成,用于村上SCSI数据。
VIP和scan
我们都知道Oracle RAC中每个节点都有一个虚拟IP,简称VIP,与公网IP在同一个网段。
没有VIP时,Oracle客户端是靠“TCP/IP协议栈超时”来判断服务器故障。而TCP/IP协议栈是作为OS Kernel的一部分来实现,不同的OS有不同的阀值,用户获悉数据库异常的时间完全取决于OS Kernel的实现,虽然有些OS允许修改这个阀值,但是会对其它程序产生未知影响。因此,oracle RAC引入了VIP,从而避开对TCP协议栈超时的依赖。
VIP和IP最主要的不同之处在于:VIP是浮动的,而IP是固定的。在所有节点都正常运行时,每个节点的VIP会被分配到public NIC上;在linux下ifconfig查看,public网卡上是2个IP地址;如果一个节点宕机,这个节点的VIP会被转移到还在运行的节点上。也 就是幸存的节点的public NIC这个网卡上,会有3个IP地址。
当一个节点宕机,这个节点真实IP就连接不上了,但是这个节点的虚拟IP是可以连接的,他会自动把客户端的连接请求转接给存活的节点。
在tnsname.ora文件里,指定Address列表,客户端会随机选择一个节点来连接数据库,而不是顺序选择的。
VIP特点:
1 VIP是在clusterware安装最后阶段,通过脚本VIPCA创建的;
2 VIP作为一个Nodeapps类型的CRS Resource注册到OCR中,并由CRS维护状态;
3 VIP会绑定到节点的public 网卡上;那么public网卡就有两个地址了;
4 当某个节点发生故障时,CRS会把故障节点的VIP转移到其他节点上;
5 每个节点的Listener会同时在public网卡的public IP和VIP两个地址上监听;
6 客户端的tnsname.ora一般会配置指向节点的VIP;
从上面第6条可以引出一个问题。如果增加一个节点,那么客户端的tnsname.ora需要加入新增节点的VIP。那么想象一下:多个客户端,增加多个节点,那么维护起来特别麻烦。因此到了Oracle11gR2,引入了一个scan的概念。
scan,single client access name,这是一个唯一的名称,在整个公司网络内部唯一,客户端连接的时候只需要知道这个名称并连接即可。Oracle 11gR2 客户端缺省是通过 SCAN 来连接整个 RAC 环境的,如下是 SCAN 的架构图:
如上图所示,如果使用了 DNS 或者 GNS (Grid Naming Service),那么最多可以有 3 个 SCAN VIP 和 3 个 SCAN Listener。 每个SCAN VIP对应一个scan listener,cluster内部的service在每个scan listener上都有注册,scan listener接受客户端的请求,并foward到不同的Local listener中去,还是由local 的listener提供服务给客户端。如果没有使用 DNS 或者 GNS,而是选择使用 hosts 文件,则只会有1个SCAN VIP 和1个SCANListener。
注意:scan不一定要resolve到三个ip,一个也够了。只不过为了防止scan单点故障而推荐3个。
参考至:《大话Oracle RAC》张晓明著
http://www.oracle.com/technetwork/cn/articles/database-performance/oracle-rac-connection-mgmt-1650424-zhs.html
http://hi.baidu.com/loveyurui/item/ac12d8d6f3c292ca1a72b406
http://wenku.baidu.com/view/f336b76f25c52cc58bd6be54.html 本文原创,转载请注明出处、作者
如有错误,欢迎指正
邮箱:[email protected]