连续可用性的代码
当对应用程序隐藏计划的维护、计划外停机和数据库负载不平衡时,您的应用可实现持续可用性。应用优秀实践、简单配置和 Oracle Autonomous AI Database 的组合可确保您的应用持续可用。
将计划内维护活动从应用程序中隐藏的最佳方法是透明地从每个数据库工作负载位置排出工作,然后再为该工作负载位置设置维护窗口。Oracle 的连接池和中间层(包括 WebLogic Server、Oracle Universal Connection Pool (UCP)、OCI 会话池和 ODP.NET 非托管提供程序)可识别快速应用程序通知 (FAN),因此在安排数据库服务移动之前会收到通知,以允许在维护之前正常耗尽工作。FAN 通知自动触发关闭空闲连接,在新服务位置中打开新连接,并允许在即将关闭的服务位置为活动工作完成配置时间。主要的第三方 JDBC 中层(例如 IBM WebSphere)在配置 UCP 时允许相同的行为。对于无法使用 UCP 的基于 JDBC 的应用,Oracle 提供了使用 Oracle 驱动程序和连接测试的解决方案。
为了隐藏由于组件或通信失败而导致的计划外停机,Oracle 提供了:
-
通知。 FAN 是隐藏中断的第一步。FAN 通知客户机并在发生中断时将其从当前网络中断开。这样可以避免长时间网络等待的应用程序延迟。重要的是,当服务再次可用时,FAN 还会调用会话的重新平衡。
-
恢复。 在通知客户机后,透明应用程序连续性 (Transparent Application Continuity,TAC) 或应用程序连续性 (Application Continuity,AC) 会重新建立与新工作负荷位置(运行数据库的 Real Application Clusters (RAC) 配置中的另一个数据库实例)的连接,并在可能的情况下重放正在进行的(未提交)工作。通过在新位置上重放飞行中工作,应用程序通常可以继续执行,而不会知道发生任何故障。
TAC 或 AC 还会在计划内维护期间执行,这些会话在分配的耗尽间隔内不会耗尽(完成其当前数据库操作)。
应用程序配置核对清单
您可以按照以下准则使应用程序持续可用:
提示:有关使用自治 AI 数据库为应用实现持续可用性的优秀实践,请参阅 ATP 直接白皮书中的应用持续可用性。
使用数据库服务进行连接
数据库服务可为底层基础设施提供透明度:FAN、连接数据、透明应用连续性 (Transparent Application Continuity,TAC)、应用连续性 (Application Continuity,AC)、切换、使用者组以及许多其他特性和操作都依赖于服务的使用。
专用 Exadata 基础结构上的自治 AI 数据库提供多种预定义数据库服务供您选择,如自治 AI 数据库的预定义数据库服务名称中所述。所有这些都提供 FAN 和排空功能,并且两个事务处理对默认启用了 TAC。API 可用于更改所有预定义服务的 TAC 或 AC 设置(请参见 Enable Service Attributes for Failover )。
配置连接字符串以实现高可用性
Oracle 建议在连接到 Oracle Autonomous AI 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 或更高版本的客户机驱动程序时,在客户机上自动配置 Oracle Notification Service (ONS) 订阅以接收 FAN 事件。ONS 在数据库层和客户机层之间提供安全通信路径,允许向客户机通知服务可用性(停止或启动的组件)以及运行时负载平衡建议,以便在正常运行期间更好地放置工作。
根据客户机,在应用程序配置属性中启用 FAN,如下所示:
-
通用连接池或 JDBC 瘦驱动程序(从 12.2 开始)
设置属性
FastConnectionFailoverEnabled。 -
适用于 Oracle 的 WebLogic Active GridLink
RAC FAN 和快速连接故障转移默认处于启用状态。
-
Oracle WebLogic Server、IBM WebSphere、IBM Liberty、Apache Tomcat、Red Hat WildFly (JBoss)、JDBC 应用
使用通用连接池替换连接池。
-
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),钱包配置必须遵循特定规则,如 Configure Clients for FAN Including Optional Wallets 中所述。
使用建议的练习来允许排水
应用使用情况的最佳做法是检查连接所需的时间,然后在当前操作完成时将其重新检入池。这对于实现良好的性能、在运行时重新平衡工作以及在维护窗口期间排空工作非常重要。
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 功能(例如快速连接故障转移、运行时负载平衡、应用程序连续性和透明应用程序连续性)用于完全认证。
启用透明应用连续性 (Transparent Application Continuity,TAC) 或应用连续性 (Application Continuity,AC)
TAC 透明地跟踪和记录会话和事务状态,以便可以在可恢复的中断后恢复数据库会话。预定义数据库服务的两个事务处理对默认启用了 TAC。
AC 是可定制的,允许您选择重放副作用或在 TAC 不允许的故障转移时添加复杂的回调。如果使用的是 Oracle 12c 驱动程序(JDBC-thin 或 Oracle Call Interface),或者要使用副作用或回调进行定制,或者具有使用会话持续时间临时表等状态且不跨请求进行清理的应用程序,请使用 AC。
使用透明应用程序连续性的步骤
-
如果需要在所使用的数据库服务中启用透明应用程序连续性,请参见 Enable Service Attributes for Failover 。
-
使用以下受支持的客户机之一。
Oracle 强烈建议您使用最新的客户机驱动程序。Oracle Database 19c 客户端驱动程序及更高版本为 TAC 提供全面支持。
-
Oracle JDBC Replay Driver 18c 或更高版本。这是 Oracle Database 18c 为应用连续性提供的 JDBC 驱动程序功能。
-
带有 Oracle JDBC Replay Driver 18c 或更高版本的 Oracle Universal Connection Pool (UCP) 18c 或更高版本。
-
Oracle WebLogic Server Active GridLink 或将 UCP 与 Oracle JDBC Replay Driver 18c 或更高版本结合使用的第三方 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 Replay Driver 18c 或更高版本或
-
使用 19c 或更高版本的基于 Oracle Call Interface 的应用
使用连接池时,应用程序应在每个请求完成时返回到池的连接。Oracle 建议应用程序仅在连接需要时进行检查。在不使用时保持连接是不好的做法。带有所列驱动程序的透明应用程序连续性还可以检测可以在何处添加边界并创建自己的边界。
-
-
使用
FAILOVER_RESTORE启用透明应用程序连续性会自动恢复预设会话状态。如果您发现除了标准集之外还需要预设会话状态,则可以注册回调或 UCP 标签以恢复这些状态。如果发现需要恢复的复杂会话状态(例如临时表或
SYS_CONTEXT),则使用提供这种灵活性的应用程序连续性。 -
在应用程序中启用可变用途
可变函数是可以在每次执行新值时返回新值的函数。对于
SYSDATE、SYSTIMESTAMP、SYS_GUID和sequence.NEXTVAL,提供了保留原始结果的支持。应用程序连续性 19c 及更高版本会自动为 SQL 提供KEEP可变项。如果应用程序使用或敏感于可变函数,则 DBA 必须发出GRANT KEEP权限。授予KEEP特权后,重放将在重放时应用原始函数结果。例如:SQL> GRANT [KEEP DATE TIME | KEEP SYSGUID] ... TO USERSQL> GRANT KEEP SEQUENCE mySequence TO myUser ON sequence.object -
禁用副作用
副作用是外部操作,例如发送邮件、传输文件或使用 TCP。Transparent Application Continuity 可检测副作用,不会重放。如果您希望重放副作用,请使用 Application Continuity,以实现这种额外的灵活性。
使用应用程序连续性的步骤
-
如果需要在所使用的数据库服务中启用应用程序连续性,请参见 Enable Service Attributes for Failover 。
-
使用以下受支持的客户机之一。
-
Oracle JDBC Replay Driver 12c 或更高版本。这是 Oracle Database 12c 为应用程序连续性提供的 JDBC 驱动程序功能。
-
带有 Oracle JDBC Replay Driver 12c 或更高版本的 Oracle Universal Connection Pool (UCP) 12c 或更高版本。
-
将 UCP 与 Oracle JDBC Replay Driver 12c 或更高版本结合使用的 Oracle WebLogic Server Active GridLink 和第三方 JDBC 应用服务器。
-
使用 Oracle JDBC Replay Driver 12c 或更高版本以及请求边界或池化数据源的 Java 连接池或独立 Java 应用程序。
-
使用 Oracle Call Interface Session Pool 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 Server 连接标签
-
-
在应用程序中启用可变用途
可变函数是可以在每次执行新值时返回新值的函数。对于
SYSDATE、SYSTIMESTAMP、SYS_GUID和sequence.NEXTVAL,提供了保留原始结果的支持。应用程序连续性 19c 及更高版本会自动为 SQL 提供KEEP可变项,因此无需执行任何操作。如果需要 PL/SQL 的可变项,则 DBA 必须发出GRANT KEEP权限。授予KEEP特权后,重放将在重放时应用原始函数结果。例如:SQL> GRANT [KEEP DATE TIME | KEEP SYSGUID] ... TO USERSQL> GRANT KEEP SEQUENCE mySequence TO myUser ON sequence.object -
决定是否要重放副作用
副作用是外部操作,例如发送邮件、传输文件或使用 TCP。使用 Application Continuity 时,除非应用程序另有指定,否则将重放副作用。如果请求具有不应重放的外部操作,则该请求可以使用未启用 Application Continuity 的连接,也可以使用
disableReplay()API for Java 或OCIRequestDisableReplay()for Oracle Call Interface 来禁用该请求的重放。如果您不希望重放所有副作用,请使用透明应用程序连续性。