暂无图片
暂无图片
2
暂无图片
暂无图片
2
暂无图片

应用程序连续性 - 面向开发人员的数据库功能

甲骨文云技术 2023-03-11
1221

当数据库发生故障时,我们往往不希望让用户看到应用程序报错,而是希望应用可以透明切换到可用的冗余节点 - 可以是从RAC的一个节点切换到其余某个存活节点,也可以是切换到备库。为了实现这样的需求,Oracle引入了Application Continuity (AC)特性。当数据库层发生故障中断时,AC通过自动恢复进行中的会话,来为应用程序屏蔽数据库层故障,因此数据库层的中断对应用程序来说就像是稍微延迟的执行。

应用程序配置Application Continuity (AC) 后,用户将不再受到滚动补丁、数据库配置变更、甚至数据库崩溃的影响。

本文将为大家介绍Oracle Database 19c 中的Application Continuity (AC)特性。   

Application Continuity (AC)有何作用?  


Application Continuity (AC)对应用程序和最终用户隐藏了数据库层的中断。它有效地掩盖了如滚动打补丁、网络故障、数据库实例崩溃、以及切换到 Active Data Guard 备库等中断事件。配置Application Continuity (AC)后,用户将不再受到计划内停机或意外中断的影响。应用程序可以简单地继续工作,而不知道幕后正在发生计划内或计划外的中断事件。

它如何工作? 


Application Continuity (AC)可以完全按照最初应用程序提交的方式在数据库端重放数据库请求(无论是事务还是查询),以确保结果与请求一致。对于每个请求,它首先在一个幸存的数据库实例上恢复和验证会话,然后重放从开始请求到结束请求的所有语句并将结果返回给用户。      

可变变量(每次引用时返回新值的函数)都会被考虑在内,包括对 SYSDATE 和 SEQUENCES (NEXTVAL) 的调用。例如,从序列调用 NEXTVAL 在请求的原始返回值为47,则该请求的重放也必须使用 47 作为该值。Application Continuity (AC)还保证任何被重放的事务永远只会被提交一次。这是通过调用Transaction Guard来实现的,它提供了在重放期间跟踪和管理所有事务状态的功能。

支持哪些应用程序栈和配置?  


从Oracle Database 12.1版本开始引入Application Continuity (AC),支持JDBC thin应用程序,它需要使用 Oracle 连接池(例如用于JDBC客户端的Universal Connection Pool - UCP或 OCI Session Pool)。12.2版本中添加了对 OCI 和 ODP.NET 的支持,还可以为第三方应用程序堆栈配置 Oracle 连接池,例如 IBM WebSphere、RedHat JBoss 和 Apache Tomcat。

透明应用程序连续性 (Transparent Application Continuity - TAC) 在 Oracle Database 18c 中引入并在 Oracle Database 19c 中得到进一步增强,扩展了对不使用 Oracle 连接池的应用程序配置的支持。另外,TAC配置更简单,相对前面版本的AC来说也更透明。因此,推荐使用Oracle Database 19c中的TAC。


是否需要更改任何应用程序或数据库? 


不需要。运行良好的应用程序不需要更改代码。

只需要在数据库层和应用层进行简单配置即可实现TAC。

在数据库层面,需要下面3个配置步骤:

1.为TAC配置数据库服务。不同的应用程序或模块通常会使用不同的服务以方便管理,建议针对SLA要求高的应用配置具备TAC属性的服务。下面显示了如何为透明应用程序连续性 (TAC) 配置服务:

    $ srvctl add service -db mydb -service GOLD –preferred inst1 -available serv2 
    -failover_restore AUTO -failoverretry 1 -failoverdelay 3 -commit_outcome TRUE
    -failovertype AUTO -replay_init_time 600 -retention 86400 -notification TRUE
    -drain_timeout 300 -stopoption IMMEDIATE
    复制

    2.授予对可变对象的 KEEP 权限。这样在重放的时候,才能保证值不变,通常如果使用到了sequence, 需要设置sequence的keep属性。

      ALTER SEQUENCE.. [sequence object]  [KEEP|NOKEEP];


      -- 如果使用其它owner的sequence,还要设置一下权限:


      GRANT KEEP SEQUENCE on [sequence object] [TO USER];
      复制

      3.确保ONS默认端口6200畅通(数据库和应用之间双向)

      应用程序只需要配置以下2步:

      1.应用程序中使用推荐的 TNS 连接字符串。例如:

        Alias(或 URL)=
        (DESCRIPTION =
           (CONNECT_TIMEOUT=120) (RETRY_COUNT=20)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)
         (ADDRESS_LIST =
           (LOAD_BALANCE=on)
           (ADDRESS = (PROTOCOL = TCP)(HOST=primary- scan)(PORT=1521)))
         (ADDRESS_LIST =
           (LOAD_BALANCE=on)
           (ADDRESS = (PROTOCOL = TCP)(HOST=standby-scan)(PORT=1521)))      
        (CONNECT_DATA=(SERVICE_NAME = YOUR SERVICE)))
        复制

        例:Java程序中的URL:

          url=jdbc:oracle:thin:@(DESCRIPTION = (CONNECT_TIMEOUT=120) (RETRY_COUNT=20)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)(ADDRESS_LIST =(LOAD_BALANCE=on)(ADDRESS = (PROTOCOL = TCP)(HOST=primary- scan)(PORT=1521)))(ADDRESS_LIST =


          (LOAD_BALANC=on)(ADDRESS = (PROTOCOL = TCP)(HOST=standby-scan)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME = YOUR SERVICE)))
          复制

          上面最后的YOUR SERVICE即为前面在数据库层已经配置好的具备TAC属性的服务。

          2. 按照不同的客户端类型配置

          (a) 如果使用 JDBC thin客户端,请使用最新版本的Oracle 驱动程序API。通常需要ons.jar、ucp.jar 和重放驱动程序(ojdbcX.jar,其中 X 为 8 或 11)。这些必须作为一个集合来替换以确保正确的互操作性。

          (b) 如果为 OCI 客户端配置,请将所有出现的 OCIStmtPrepare 替换为 OCIStmtPrepare2(OCIStmtPrepare 在 12.2 中已弃用,并且不会重放)。另外,在推荐的连接字符串中加入HA EVENTS = TRUE,确保dba已经配置数据库服务aq_ha_notifications = True。

          详细的配置说明可以参考最新官方白皮书:Application Checklist for Continuous Service for MAA Solutions[1]

          结论


          应用程序连续性Application Continuity (AC)可在数据库层中断期间实现工作负载处理的连续性。AC在实现应用程序工作负载处理连续的同时保证返回给用户的交易、数据和结果的完整性。并且,19c中的TAC几乎不需要更改应用程序就可以轻松实现应用程序连续性功能。

          参考链接:[1] https://www.oracle.com/docs/tech/application-checklist-for-continuous-availability-for-maa.pdf

          :萧宇

          文章转载自甲骨文云技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论

          李宏达
          暂无图片
          2年前
          评论
          暂无图片 0
          当数据库发生故障时,我们往往不希望让用户看到应用程序报错,而是希望应用可以透明切换到可用的冗余节点 - 可以是从RAC的一个节点切换到其余某个存活节点,也可以是切换到备库。
          2年前
          暂无图片 点赞
          评论
          超越无限D
          暂无图片
          2年前
          评论
          暂无图片 0
          当数据库发生故障时,我们往往不希望让用户看到应用程序报错,而是希望应用可以透明切换到可用的冗余节点 - 可以是从RAC的一个节点切换到其余某个存活节点,也可以是切换到备库。
          2年前
          暂无图片 点赞
          评论