欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Oracle 11g RAC 的一些基础知识

程序员文章站 2022-05-10 09:27:01
...

Oracle 11g r2 还提供了一个叫RAC One Node的新功能。Oracle发现一些RAC的部署纯粹只是为了高可用,而虚拟化越来越多的被用户所

总的来说,Oracle 11g R2 RAC提供了以下功能:

  • 高可用:shared-everything 模式保证了单节点的故障不会停止服务,集群中的其他节点将快速接管
  • 可扩展性:多节点分担负载,可以提供远超单机数据库能提供的处理能力。且增删节点可以在线完成,不需要停机
  • 易用性:多个数据库可以加入到一个集群中
  • 低成本:RAC可以部署在标准硬件上,硬件上节省的成本抵消了购买license的成本
  • Oracle 11g r2 还提供了一个叫RAC One Node的新功能。Oracle发现一些RAC的部署纯粹只是为了高可用,而虚拟化越来越多的被用户所使用,并成为了一个新的趋势。Oracle One Node建立在以下基础之上:Oracle Clusterware、Oracle ASM、Oracle database。


    我们再来看一眼RAC的结构图

    Oracle 11g RAC 的一些基础知识



    相比较单机数据库,,RAC需要一个共享存储;一个私有网络来进行集群内部通讯;一个公有网络来连接应用和客户端;配置虚拟IP来提高节点故障时的连接速度,当一个节点出现故障,它的虚拟ip立即指向其他节点的ip上(若不配置vip,当一个节点发生故障时,新的连接将会发生等待,直到与该节点ip的通讯出现time out)。


    Failover的连接配置

    有两种连接方式可以实现数据库连接的failover


    1. TAF(Transparent Application Failover)

    让我们看一下官方文档。TAF让Oracle Net将一个失效的连接从故障点转移到另一个监听上,用户能使用这个新的连接来继续未完成的工作,这是一个client端的功能。

    TAF可以配置为使用client端的(Transparent Network Substrate)TNS连接字符串来连接,或者使用server端的服务。如果两种方式同时使用,则使用server端的服务配置。

    TAF可以工作在两种模式下:session failover和select failover。前者在failover时会重建失败的连接,后者则能够继续进程中未完成的查询(如果failover前一个session正在从一个游标中获取数据,则新的session将在相同的snapshot下重新运行select语句,并返回余下的行)。如果failover时,session执行了DML操作且未提交,则failover后,若不执行rollback回滚而执行新的操作,将会收到一条错误信息ORA-25402: transaction must roll back

    TAF在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: 每次连接数据库时,都会在备用实例上也产生一个连接,以实现更快的切换

    RETRIES failover后,尝试连接的次数。如果指定了DELAY参数,则RETRIES默认为5次。若注册了callback,则该参数将被忽略

    TYPE OCI默认提供了3种类型:session: 若用户连接丢失,将在备用节点上重新创建;select: 除了重建连接外,将继续从打开的游标中获取数据,如果采用这种方式,普通select操作也将在客户端产生开销;none: 默认值,也可显示指定来禁用failover功能


    2. FCF(Fast Connect Failover)

    oracle11g提供了FCF方式连接数据库,它支持JDBC Thin和JDBC OCI驱动;与连接缓存(implicit connection cache)协同工作提供更高的连接性能和高可用;可以在应用代码中设置,无需另外配置

    需要的条件:启用了隐含连接缓存,FCF需要与JDBC的连接缓存机制共同工作,为应用管理连接以确保高可用;应用使用服务名而非服务标识符来连接数据库;JDBC运行的节点上配置并启用了Oracle Notification Service (ONS);JDBC例程运行的java虚拟机必须包含oracle.ons.oraclehome并指向ORACLE_HOME

    例子:

    配置ONS

    ods.setONSConfiguration("nodes=racnode1.example.com:4200,racnode2.example.com:4200");

    启用FCF

    // declare datasource
    ods.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(); // transparently creates and accesses cache
    catch (SQLException SE {
    }
    }


    看糊涂了?上面的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基于Oracle RAC事件,可以快速为活跃/闲置的连接检测到故障

    4. FCF通过实例的UP事件实现负载均衡,分配到在线的RAC实例中


    oracle建议不要在一个应用中同时使用TAF和FCF

    Oracle 11g RAC 的一些基础知识