连续可用性的代码

当对应用程序隐藏计划的维护、计划外停机和数据库负载不平衡时,应用程序将实现连续可用性。应用优秀实践、简单配置和 Oracle Autonomous Database 的组合可确保您的应用持续可用。

在应用程序中隐藏计划内维护活动的最佳方法是透明地从每个数据库工作负载位置排出该工作负载位置的维护窗口之前的工作量。Oracle 的连接池和中层(包括 WebLogic Server、Oracle Universal Connection Pool (UCP)、OCI 会话池和 ODP.NET 非托管提供程序)可识别快速应用程序通知 (FAN),因此在数据库服务计划在维护之前移动以允许正常耗尽工作之前收到通知。FAN 通知会自动触发关闭空闲连接、在新服务位置打开新连接,并允许在即将关闭的服务位置为活动工作完成提供可配置的时间。使用 UCP 配置时,主要的第三方 JDBC 中层(例如 IBM WebSphere)允许相同的行为。对于无法使用 UCP 的基于 JDBC 的应用,Oracle 提供了使用 Oracle 驱动程序和连接测试的解决方案。

为了隐藏因组件或通信故障而导致的计划外停机,Oracle 提供:

  • 通知。FAN 是隐藏中断的第一步。FAN 会通知客户机,并在发生中断时将其从当前网络等待中中断。这样可以避免应用程序在长时间的网络等待中停滞不前。重要的是,FAN 还会在服务再次可用时调用会话的重新平衡。

  • 恢复。通知客户机后,透明应用程序连续性 (Transparent Application Continuity,TAC) 或应用程序连续性 (Application Continuity,AC) 会重新建立到新工作负载位置(运行数据库的 Real Application Clusters (Real Application Clusters,RAC) 配置中的另一个数据库实例)的连接,并在可能的情况下重放 (uncommitted) 工作。通过在新位置重放飞行中工作,应用程序通常可以在不知道发生任何故障的情况下继续执行。

在计划的维护期间,TAC 或 AC 还会在分配的排空间隔内为不排空(完成其当前数据库操作)的会话执行。

应用程序配置清单

您可以按照以下准则使应用程序持续可用:

提示:

请参阅《 Continuous Availability for Applications on ATP-Direct White Paper 》,了解使用 an Autonomous Database 为应用实现持续可用性的最佳实践。

使用数据库服务进行连接

数据库服务为底层基础设施提供透明度:FAN、连接数据、透明应用连续性 (Transparent Application Continuity,TAC)、应用连续性 (Application Continuity,AC)、切换、使用者组以及许多其他特性和操作都基于服务的使用。

Autonomous Database on Dedicated Exadata Infrastructure 提供多对预定义数据库服务供您选择,如 Predefined Database Service Names for Autonomous Databases 中所述。所有选项均提供 FAN 和耗尽,默认情况下,两个事务处理对启用了 TAC。API 可用于更改所有预定义服务的 TAC 或 AC 设置(请参见 Enable Service Attributes for Failover )。

为高可用性配置连接字符串

Oracle 建议在连接到 Oracle Autonomous Database 时使用如下所示的连接字符串配置。以这种方式配置 Oracle 提供的 tnsnames.ora 文件中嵌入的连接字符串。请勿在客户端上使用轻松连接命名,因为此类连接没有高可用性功能。

对于所有 Oracle 客户机版本 12.2 或更高版本,请使用此 TNS:

alias = 
(DESCRIPTION =
(CONNECT_TIMEOUT= 120)(RETRY_COUNT=20)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)
 (ADDRESS_LIST =
   (LOAD_BALANCE=on)
   (ADDRESS = (PROTOCOL = TCP)(HOST=scan-host)(PORT=1521)))
 (CONNECT_DATA=(SERVICE_NAME = service-name)))

对于使用 Oracle 驱动程序版本 12.1 或更低版本的 JDBC 连接,请使用以下命令

alias =
(DESCRIPTION =
(CONNECT_TIMEOUT= 15)(RETRY_COUNT=20)(RETRY_DELAY=3)
(ADDRESS_LIST =
  (LOAD_BALANCE=on)
  (ADDRESS = (PROTOCOL = TCP)(HOST=scan-host)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME = service-name)))

使用快速应用程序通知 (FAN)

FAN 在出现服务中断或恢复时立即向应用程序提供通知。如果没有 FAN,应用程序可能会在硬件和网络故障后挂起 TCP/IP 超时,并在资源恢复时省略以重新平衡。所有 Oracle 池和所有 Oracle 应用服务器都使用 FAN。第三方 JAVA 应用服务器可以使用 UCP 启用 FAN。

使用 FAN 不需要进行任何应用程序更改。这些只是配置更改。

要在计划内维护期间持续提供服务,请使用具有以下功能的 FAN:

  • Oracle 池或
  • UCP 与第三方 JDBC 应用程序服务器或
  • 最新 Oracle 客户端驱动程序

要在计划外停机期间持续提供服务,请将 FAN 用于:

  • 透明的应用连续性或
  • 应用连续性

FAN 保险范围

FAN 事件与以下项集成:

  • Oracle Fusion Middleware 和 Oracle WebLogic Server
  • Oracle Data Guard 中介
  • JDBC 瘦接口和 Oracle Call Interface (OCI) 接口的 Oracle JDBC 通用连接池或驱动程序
  • ODP.NET 非托管和托管提供者的连接池
  • Oracle Tuxedo
  • SQL*Plus
  • 适用于 Python、Node.js 和 PHP 等语言的 Oracle Database 驱动程序
  • 全局数据服务
  • 使用 Oracle JDBC Universal Connection Pool 的第三方 JDBC 应用程序服务器
  • 监听程序

在客户机中启用 FAN

使用 Configure Connection String for High Availability 中显示的 TNS 别名。此连接字符串用于在使用 Oracle Database 12c 或更高版本的客户机驱动程序时,在客户机上为 FAN 事件接收自动配置 Oracle Notification Service (ONS) 订阅。ONS 在数据库层和客户机层之间提供安全通信路径,允许客户机收到服务可用性通知(组件停止或启动)以及运行时负载平衡建议,以便在正常操作期间更好地安排工作。

根据客户机,在应用程序配置属性中启用 FAN,如下所示:

  • 通用连接池或 JDBC 瘦驱动程序(启动 12.2)

    设置属性 FastConnectionFailoverEnabled

  • WebLogic Active GridLink for Oracle

    默认情况下,RAC FAN 和快速连接故障转移处于启用状态。

  • Oracle WebLogic Server、IBM WebSphere、IBM Liberty、Apache Tomcat、Red Hat WildFly (JBoss)、JDBC 应用程序

    使用 Universal Connection Pool 作为连接池替换。

  • ODP.Net 客户端(托管和非托管提供商)

    如果使用 ODP.Net 12.1 或更低版本,请在连接字符串中设置 "HA events = true;pooling=true"

  • Oracle Call Interface (OCI) 客户端和基于 OCI 的驱动程序

    没有本机设置的 Oracle Call Interface (OCI) 客户端可以使用 oraacces.xml 文件并将 events 设置为 true

    Python、Node.js 和 PHP 具有原生选项。在 Python 和 Node.js 中,可以在创建连接池时设置事件模式。在 PHP 中,编辑 php.ini 添加条目 oci8.events=on

  • SQL*Plus

    默认情况下会启用 FAN。

预定义数据库服务提供使用基于 TLS wallet 的验证的 TCPS 连接。根据应用程序类型(JDBC 或 Oracle Call Interface),Wallet 配置必须遵循特定规则,如 Configure Clients for FAN Including Optional Wallet 中所述。

使用建议的练习允许排水

应用程序使用的最佳做法是签出需要连接的时间,然后在当前操作完成时将其重新检入池中。这对于实现良好的性能、在运行时重新平衡工作以及在耗尽工作的维护窗口期间非常重要。

Oracle 建议使用可识别 FAN 的 Oracle 连接池来隐藏计划内维护。当应用程序使用带 FAN 的 Oracle 池并返回请求之间的池连接时,不会影响用户。您无需进行任何应用程序更改即可使用 FAN。当 Oracle 连接池在计划停机时收到 FAN 事件时,它会标记实例上要排空的所有连接。立即关闭已检入连接,以免重新使用它们。当使用中的连接返回到池时,它们将被关闭。这允许随着时间的推移正常关闭所有连接。

如果您使用的是基于 Java 的第三方应用服务器,则实现耗尽和故障转移的最有效方法是将池化数据源替换为 UCP。许多应用服务器支持此方法,包括 Oracle WebLogic Server、IBM WebSphere、IBM Liberty、Apache Tomcat、Red Hat WildFly (JBoss)、Spring、Hibernate 等。Oracle 和 IBM 等其他提供商的白皮书介绍了如何将这些应用服务器与 UCP 一起使用。使用 UCP 作为数据源,可以将 UCP 功能(如快速连接故障转移、运行时负载平衡、应用程序连续性和透明应用程序连续性)用于完全认证。

启用透明应用连续性 (TAC) 或应用连续性 (AC)

TAC 透明地跟踪和记录会话和事务处理状态,以便在可恢复的中断后恢复数据库会话。预定义数据库服务的两个事务处理对默认情况下启用了 TAC。

AC 是可定制的,允许您选择重放副作用,或者在 TAC 不允许的故障转移时添加复杂的回调。如果您使用的是 Oracle 12c 驱动程序(JDBC 瘦驱动程序或 Oracle Call Interface),或者想要使用副作用或回调进行定制,或者具有使用状态(如会话持续时间临时表)且不会在请求之间进行清除的应用程序,请使用 AC。

使用透明应用程序连续性的步骤

  • 如果需要在所使用的数据库服务中启用透明应用程序连续性,请参见 Enable Service Attributes for Failover

  • 使用以下受支持的客户机之一。

    Oracle 强烈建议您使用最新的客户机驱动程序。Oracle Database 19c 客户端驱动程序和更高版本为 TAC 提供全面支持。

    • Oracle JDBC 重放驱动程序 18c 或更高版本。这是 Oracle Database 18c for Application Continuity 附带的 JDBC 驱动程序功能。
    • Oracle Universal Connection Pool (UCP) 18c 或更高版本以及 Oracle JDBC Replay Driver 18c 或更高版本。
    • 使用 UCP 和 Oracle JDBC Replay Driver 18c 或更高版本的 Oracle WebLogic Server Active GridLink 或第三方 JDBC 应用程序服务器。
    • 使用 Oracle JDBC Replay Driver 18c 或更高版本的 Java 连接池或独立 Java 应用程序。
    • Oracle Call Interface 会话池 19c 或更高版本。
    • SQL*Plus 19c (19.3) 或更高版本
    • ODP.NET 池化、非托管驱动程序 18c 或更高版本(在 12.2 及更高版本中为 "Pooling=true" 默认值)。
    • 使用 19c OCI 驱动程序或更高版本的基于 Oracle Call Interface 的应用。
  • 将连接返回到连接池。

    如果应用程序使用连接,则无需对应用程序进行任何更改来标识请求边界:

    • 从 Oracle 连接池或
    • 来自 Oracle JDBC 重放驱动程序 18c 或更高版本或更高版本
    • 从使用 19c 或更高版本的基于 Oracle Call Interface 的应用程序

    使用连接池时,应用程序应在每个请求完成后返回到池的连接。Oracle 建议应用程序仅在需要连接的时间检查连接。在不使用时保持连接是不好的做法。带有列出的驱动程序的透明应用程序连续性还检测可以在何处添加边界并创建自己的边界。

  • 使用 FAILOVER_RESTORE

    启用透明应用程序连续性会自动恢复预设的会话状态。如果您发现除了标准集之外还需要预设会话状态,则可以注册回调或 UCP 标签以恢复这些状态。如果您发现需要恢复复杂的会话状态(如临时表或 SYS_CONTEXT),请使用提供这种灵活性的应用程序连续性。

  • 在应用程序中启用可变用途

    可变函数是每次执行时都可以返回新值的函数。为 SYSDATESYSTIMESTAMPSYS_GUIDsequence.NEXTVAL 提供了保留原始结果的支持。应用程序连续性 19c 及更高版本会自动为 SQL 提供 KEEP 可变项。如果应用程序使用或对可变函数敏感,则 DBA 必须发出 GRANT KEEP 权限。授予 KEEP 权限时,重放将在重放时应用原始函数结果。例如:

    SQL> GRANT [KEEP DATE TIME | KEEP SYSGUID] … TO USER
    SQL> GRANT KEEP SEQUENCE mySequence TO myUser ON sequence.object
  • 已禁用副作用

    副作用是外部操作,例如发送邮件、传输文件或使用 TCP。透明的应用连续性可检测副作用,不会重放副作用。如果您希望重放副作用,请使用允许这种额外灵活性的应用程序连续性。

使用应用程序连续性的步骤

  • 如果需要在所使用的数据库服务中启用应用程序连续性,请参见 Enable Service Attributes for Failover

  • 使用以下受支持的客户机之一。

    • Oracle JDBC 重放驱动程序 12c 或更高版本。这是 Oracle Database 12c for Application Continuity 附带的 JDBC 驱动程序功能。
    • Oracle Universal Connection Pool (UCP) 12c 或更高版本以及 Oracle JDBC Replay Driver 12c 或更高版本。
    • 使用 UCP 和 Oracle JDBC Replay Driver 12c 或更高版本的 Oracle WebLogic Server Active GridLink 和第三方 JDBC 应用程序服务器。
    • 使用具有请求边界或池化数据源的 Oracle JDBC 重放驱动程序 12c 或更高版本的 Java 连接池或独立 Java 应用程序。
    • 使用 Oracle Call Interface 会话池 12c 发行版 2 或更高版本的应用程序和语言驱动程序。
    • SQL*Plus 19.3 或更高版本。
    • ODP.NET 池化、非托管驱动程序 12c 发行版 2 或更高版本(在 12.2 及更高版本中为 "Pooling=true";"Application Continuity=true" 默认值)
  • 将连接返回到连接池。

    如果应用程序使用支持请求边界的 Oracle 连接池或第三方 JDBC 池,则无需对应用程序进行任何更改来标识请求边界。最佳做法是使用 Oracle 池并在请求之间返回到该池的连接。Oracle 建议应用程序仅在需要连接的时间检查连接。在不使用时保持连接是不好的做法,它将防止透明的计划维护。

  • 使用 FAILOVER_RESTORE

    使用 FAILOVER_RESTORE=LEVEL1 自动恢复大多数常见状态。如果应用程序除标准集外还预设了会话状态,则必须注册回调或 UCP 标签才能恢复这些状态。在服务上设置 FAILOVER_RESTORE=LEVEL1 并使用:

    • Java 的连接初始化回调或(旧的)Oracle Call Interface 的 TAF 回调或
    • 通用连接池或 WebLogic 服务器连接标签
  • 在应用程序中启用可变用途

    可变函数是每次执行时都可以返回新值的函数。为 SYSDATESYSTIMESTAMPSYS_GUIDsequence.NEXTVAL 提供了保留原始结果的支持。应用程序连续性 19c 和更高版本会自动为 SQL KEEP 变量,因此无需执行任何操作。如果 PL/SQL 需要可变项,则 DBA 必须发出 GRANT KEEP 权限。授予 KEEP 权限时,重放将在重放时应用原始函数结果。例如:

    SQL> GRANT [KEEP DATE TIME | KEEP SYSGUID] … TO USER
    SQL> GRANT KEEP SEQUENCE mySequence TO myUser ON sequence.object
  • 决定是否要重放副作用

    副作用是外部操作,例如发送邮件、传输文件或使用 TCP。使用应用程序连续性时,将重放副作用,除非应用程序另有指定。如果请求具有不应重放的外部操作,则该请求可以使用未启用应用程序连续性的连接,也可以使用 disableReplay() API for Java 或 OCIRequestDisableReplay() for Oracle Call Interface 为该请求禁用重放。如果您不希望重放所有副作用,请使用透明应用程序连续性。