oracle11gRAC的一些基本概念(一)总的来说,oracle11gr2RAC提供了以下功能:1.高可用:shared-everything模式保证了单节点的故障不会停止服务,集群中的其他节点将快速接管2.可扩展性:多节点分担负载,可以提供远超单机数据库能提供的处理能力。且增删节点可以在线完成,不需要停机3.易用性:多个数据库可以加入到一个集群中4.低成本:RAC可以部署在标准硬件上,硬件上节省的成本抵消了购买license的成本Oracle11gr2还提供了一个叫RACOneNode的新功能。Oracle发现一些RAC的部署纯粹只是为了高可用,而虚拟化越来越多的被用户所使用,并成为了一个新的趋势。OracleOneNode建立在以下基础之上:OracleClusterware、OracleASM、Oracledatabase。我们再来看一眼RAC的结构图相比较单机数据库,RAC需要一个共享存储;一个私有网络来进行集群内部通讯;一个公有网络来连接应用和客户端;配置虚拟IP来提高节点故障时的连接速度,当一个节点出现故障,它的虚拟ip立即指向其他节点的ip上(若不配置vip,当一个节点发生故障时,新的连接将会发生等待,直到与该节点ip的通讯出现timeout)。Failover的连接配置有两种连接方式可以实现数据库连接的failover1.TAF(TransparentApplicationFailover)让我们看一下官方文档。TAF让OracleNet将一个失效的连接从故障点转移到另一个监听上,用户能使用这个新的连接来继续未完成的工作,这是一个client端的功能。TAF可以配置为使用client端的(TransparentNetworkSubstrate)TNS连接字符串来连接,或者使用server端的服务。如果两种方式同时使用,则使用server端的服务配置。TAF可以工作在两种模式下:sessionfailover和selectfailover。前者在failover时会重建失败的连接,后者则能够继续进程中未完成的查询(如果failover前一个session正在从一个游标中获取数据,则新的session将在相同的snapshot下重新运行select语句,并返回余下的行)。如果failover时,session执行了DML操作且未提交,则failover后,若不执行rollback回滚而执行新的操作,将会收到一条错误信息ORA-25402:transactionmustrollbackTAF在dataguard中使用,可以自动进行failover一个典型的使用了TAF的TNS连接串如下:NEWSDB=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=1521))(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=dyora)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=180)(DELAY=5))))failover_mode参数介绍failover_mode参数说明BACKUP备用连接的网络服务名。若使用了preconnect的连接方法,则需要指定这个参数DELAY连接重试的时间间隔(秒)。如果指定了RETRIES参数,若不指定该参数,默认为1秒。若注册了callback,该参数将被忽略METHOD设置failover方法。basic:failover时才尝试连接备用实例的监听;preconnect:每次连接数据库时,都会在备用实例上也产生一个连接,以实现更快的切换RETRIESfailover后,尝试连接的次数。如果指定了DELAY参数,则RETRIES默认为5次。若注册了callback,则该参数将被忽略TYPEOCI默认提供了3种类型:session:若用户连接丢失,将在备用节点上重新创建;select:除了重建连接外,将继续从打开的游标中获取数据,如果采用这种方式,普通select操作也将在客户端产生开销;none:默认值,也可显示指定来禁用failover功能2.FCF(FastConnectFailover)oracle11g提供了FCF方式连接数据库,它支持JDBCThin和JDBCOCI驱动;与连接缓存(implicitconnectioncache)协同工作提供更高的连接性能和高可用;可以在应用代码中设置,无需另外配置需要的条件:启用了隐含连接缓存,FCF需要与JDBC的连接缓存机制共同工作,为应用管理连接以确保高可用;应用使用服务名而非服务标识符来连接数据库;JDBC运行的节点上配置并启用了OracleNotificationService(ONS);JDBC例程运行的java虚拟机必须包含oracle.ons.oraclehome并指向ORACLE_HOME例子:配置ONSods.setONSConfiguration(nodes=racnode1.example.com:4200,racnode2.example.com:4200);启用FCF//declaredatasourceods.setUrl(jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=service_name))));ods.setUser(scott);ods.setConnectionCachingEnabled(true);ods.setFastConnectionFailoverEnabled(true):ctx.bind(myDS,ods);ds=(OracleDataSource)ctx.lookup(MyDS);try{ds.getConnection();//transparentlycreatesandaccessescachecatch(SQLExceptionSE{}}看糊涂了?上面的java代码包含一个异常处理。工作过程如下:1.一个实例宕掉了,在缓存中留下一些过期连接2.RAC产生一个事件,并将其发送给包含JDBC的java虚拟机3.JVM中的后台线程找出所有受到该RAC事件影响的所有连接,通过sql异常(ORA-17008)通知它们关闭连接,并回滚事务4.连接接收到sql异常并重新执行失败的操作FCF与TAF相比有如下不同:1.FCF支持应用级别的连接重试,由应用来决定failover时如何处理,是重新执行,还是抛出异常;TAF只能在OCI/NET的层面进行重新连接2.FCF与连接缓存很好地结合起来,让连接缓存管理器来管理缓存,失败的连接在缓存中会自动失效。而TAF在网络层面做预连接,当一个连接失效,连接缓存不能检测到3.FCF基于OracleRAC事件,可以快速为活跃/闲置的连接检测到故障4.FCF通过实例的UP事件实现负载均衡,分配到在线的RAC实例中oracle建议不要在一个应用中同时使用TAF和FCForacle11gRAC的一些基本概念(二)集群的相关概念配置Active/active集群在这种模式下,所有的节点都能提供服务(不会有用户请求在standby上被闲置的情况)。大部分案例中,集群成员的硬件配置都是相同的,避免可能的性能问题,也更容易实现负载均衡。Active/active集群需要更复杂的管理软件来管理所有资源,比如磁盘和内存需要在所有节点间进行同步。更常见的,一个私有网络被用做心跳连接。集群管理软件必须能够检测到节点问题,比如节点故障或者集群通讯问题脑裂(split-brain)是集群中的一个糟糕的情况:集群中的所有集群正在工作的时候,内部通讯被断开。这种情况下,集群被分成了几个部分,每个部分的集群软件都会尝试去接管其他节点的资源,因为在它看来,别的节点发生了故障。可能会出现以下问题:如果应用能够正常连接集群的这些部分,因为此时这些集群部分不同步,可能会有不同的数据会被写入到磁盘中。脑裂对集群的危害显而易见,集群软件的供应商必须提供方案来解决这个问题oracle的集群软件(11g中的GridInfrastructure),使用一个仲裁设备(quorumdevice),称作votingdisk,来决定集群中的成员。集群中的所有节点共享一个votingdisk,当一个节点不能向内部网络和votingdisk发送心跳时,它就会被逐出集群。若一个节点不能和其他节点通讯,但依然能连接到votingdisk,集群在这种情况下将进行投票,并发出指令将该节点剔除。这个投票使用的是STONITH方式,软件将发出一个请求,使被踢出的节点自动重启。当需要重启的节点hung住的时候,重启指令变得不可用,这种情况比较棘手。幸运的是,若硬件允许,GridInfrastructure可以支持IPMI(智能平台管理接口),可以向一个节点发出结束指令。当一个节点故障或被踢出集群,剩余的节点能够接管用户服务请求。配置Active/passive集群一个active/passive集群工作方式与active/active不同。一个active/passive集群中的成员硬件配置依然应该一致或基本一致,但同一时间两个节点中只有一个节点能处理用户请求。集群管理软件会不断地监控集群中资源的健康状况,当一个资源失败,集群管理软件会尝试将该资源重启数次,若还是无效,备用节点将进行接管。根据安装时的选项,集群的资源可以分配在共享存储或文件系统上,后者在资源failover的时候也会进行一次failover。使用共享文件系统比使用非共享的文件系统更有优势,后者在重新挂载到standby节点上以前可能需要进行fsck(8)检测。Veritas集群套件、Sun(Oracle)集群和IBM的HACMP就可用作安装active/passive集群的集群管理工具。鲜为人知的是,使用OracleGridInfrastructure来安装一个active/passive集群非常简单,利用GridInfrastructure的应用程序接口和作为集群逻辑卷管理器的OracleASM,可以轻松地不间断监控一个单实例oracle数据库。当一个节点发生故障,数据库会自动迁移到备用节点。根据初始化参数fast_start_mttr_target和恢复集的大小,这个故障切换可能非常迅速。不过,作为failover过程的一部分,用户的数据库连接将被断开。Active/passive模式可以通过将active_instance_count参数设置为1来打开,但仅当节点数为2时才有效。配置Shared-All架构一个所有节点同时访问共享存储和数据的集群被称为shared-all或者shared-everything结构。OracleRAC就是基于shared-everything架构:一个数据库位于共享存储中,通过集群各个节点上运行的实例来访问。在Oracle术语中,一个实例由内存结构和一些进程组成。对应的,数据库存储在磁盘中的数据文件里。在RAC中,实例的故障并不意味着该实例管理的数据的丢失。在一个节点发生故障后,集群中的另一个实例将会进行实例恢复,所有剩余节点都将继续服务。使用高可用技术,例如FCF或TAF,可以将实例失效对用户造成的影响降到最低。故障节点最后将重新加入集群并分担工作量。配置Shared-Nothing架构在一个shared-nothing数据库集群中,每个节点有它私有的独立存储,其他节点不能访问。数据库被集群中的节点分割成几个部分,返回的查询结构集是各个节点结果集的结合。丢失一个节点会导致对应的数据无法访问。因此,一个shared-noting集群经常被实