分享一个 Oracle RAC 模式下客户端建立JDBC初始连接时因ONS造成应用启动时卡顿30秒问题的排查分析案例

本文涉及的产品
云防火墙,500元 1000GB
简介: 分享一个 Oracle RAC 模式下客户端建立JDBC初始连接时因ONS造成应用启动时卡顿30秒问题的排查分析案例

分享一个 Oracle RAC 模式下客户端建立JDBC初始连接时因ONS造成应用启动时卡顿30秒问题的排查分析案例

最近在针对某系统进行性能优化时,遇到了一个应用程序建立JDBC连接到ORACLE RAC时因ons造成卡顿30秒的问题,由于该问题具有普适性,故特地拿出来跟大家分享下。

1 问题描述

当数据库服务器是oracle 12c及之后的版本且运行在RAC模式下时,如果RAC底层的ONS (Oracle Notification Service) 守护进程没有启动或防火墙没有开放客户端应用程序对ONS 端口(默认6200)的 TCP 连接,则客户端创建到ORACLE RAC服务器的JDBC连接时(默认1521端口)会卡顿30秒并报错,虽然此后可以成功建立JDBC连接并正常执行SQL查询,但建立初始JDBC连接时卡顿的30秒会影响微服务的启动速度,示例日志如下:

image.png


oracle.simplefan.impl.FanManager configure : attempt to configure ONS in FanManager failed with oracle.ons.NoServersAvailable: Subscription time out;,

注意:

  • 默认情况下,应用程序无论是直接建立JDBC连接,还是使用数据库连接池比如HikariCP 创建JDBC连接,只要上述条件成立(RAC底层的ONS守护进程没有启动或防火墙没有开放客户端应用程序对ONS 端口),当前进程首次建立JDBC连接时,上述卡顿30秒的问题都会出现;
  • 很多时候大家会忽视该问题,一个原因是上述先决条件不一定成立(RAC底层的ONS守护进程没有启动或防火墙没有开放客户端应用程序对ONS 端口),另一个原因可能是因为一旦初始JDBC连接建立完毕,后续JDBC连接的建立就不会卡顿30秒了;

2 技术背景 - ORACLE RAC:FAN+ONS

  • FAN (Fast Application Nofification) 是 ORACLE RAC 为提升数据库节点正常升级或异常故障时,应用的业务连续性和自动故障转移的一种机制,而 ONS(Oracle Notification Service) 是 Oracle Clusterware 实现 FAN 的基础;
  • The Oracle FAN functionality provides enhanced high availability allowing very fast detection of failures;

image.png

  • 在传统模型中,JDBC 客户端需要主动定期检索数据库服务器才能判断服务端的状态,这本质上是一种 PULL 模型,而 Oracle10 引入了一种全新的 Event Push 机制,即 FAN (Fast Application Notification),在该机制下,当服务端发生某些事件时(比如某台实例故障或压力过大),服务器会主动将这些变化通知到客户端,这样客户端就能尽早得知服务端的变化从而做出响应(比如 failover 到另一台实例);
  • 从 Oracle 12C 版本开始,RAC会自动配置并启用 FAN 机制,同时也会自动配置并启动 ons 守护进程,且Ons 默认使用 6200和6100端口;
  • image.png

image.png

  • 在默认情况下,当Oracle JDBC 客户端建立到 Oracle RAC 的JDBC 连接时,底层会自动尝试建立到 ONS 端口(默认6200)的 TCP 连接,所以如果服务端 ONS 异常(比如 ons 守护进程异常退出或手动srvctl stop ons 停止 ons),或者防火墙拦截了到 ons 端口的 TCP 连接,客户端就会卡顿30秒之后才会成功建立到服务器的JDBC连接(默认1521端口);
  • 客户端成功创建到ORACLE RAC的JDBC连接后,后台抓包可见,除了常规的1521监听器端口,还有ONS的6200端口:

image.png


3 解决方法

  • 如果需要使用Oracle RAC的FAN机制,需要确保服务端成功启动ONS守护进程(可以通过命令onsctl ping验证)且防火墙开放客户端应用程序对ONS 端口(默认6200和6100)的 TCP 连接;
  • 如果不需要使用Oracle RAC的FAN机制,可以在客户端使用如下任意方式进行配置:
  • Oracle JDBC Driver 支持通过系统参数或连接参数的形式配置oracle.jdbc.fanEnabled,所以可以在代码中通过如下方式指定不使用FAN机制:System.setProperty("oracle.jdbc.fanEnabled","false"); 或props.put("oracle.jdbc.fanEnabled",false);
  • 可以移除应用程序代码中 ojdbc8 底层的simplefan.jar和ons.jar,即更改pom排除掉 com.oracle.ojdbc.ojdbc8 下的依赖 com.oracle.ojdbc.simplefan/ons;
  • 可以通过命令行指定 JVM 启动参数,如:java -Doracle.jdbc.fanEnabled=false xxx;

大家根据自己系统的具体情况,如业务连续性和运维稳定行的要求,结合 Oracle RAC FAN/ONS 的利弊,看是否需要针对性进行调整。

相关文章
|
7月前
|
SQL Oracle 关系型数据库
oracle11g SAP测试机归档日志暴增排查(二)
oracle11g SAP测试机归档日志暴增排查(二)
338 1
|
7月前
|
Oracle 关系型数据库 Shell
oracle11g SAP测试机归档日志暴增排查(一)
oracle11g SAP测试机归档日志暴增排查(一)
86 1
|
4月前
|
运维 Oracle 前端开发
Oracle 11g RAC集群日常运维命令总结
Oracle 11g RAC集群日常运维命令总结
108 2
|
4月前
|
Oracle 关系型数据库
分布式锁设计问题之Oracle RAC保证多个节点写入内存Page的一致性如何解决
分布式锁设计问题之Oracle RAC保证多个节点写入内存Page的一致性如何解决
|
5月前
|
存储 负载均衡 Oracle
|
5月前
|
存储 Oracle 关系型数据库
|
7月前
|
SQL Java 关系型数据库
Scala应用 —— JDBC的创建
这篇文章介绍了如何使用Scala实现JDBC连接。首先,通过在pom.xml添加MySQL JDBC驱动依赖,然后使用`Class.forName()`加载驱动,接着创建连接对象。初始化执行器涉及创建执行器对象和设置参数。执行操作时,根据DML(数据修改语言)和DQL(数据查询语言)返回不同结果。文章提出了一个柯里化的`jdbc`函数,以处理不同操作步骤和多类型结果。结果类型通过枚举和抽象类`Three`的子类来表示,包括异常、DML影响行数和DQL查询结果。最后,展示了`jdbc`方法的实现,以及如何处理结果并转换为具体对象。代码示例中,查询结果被转换为`Test`对象数组并打印。
100 2
Scala应用 —— JDBC的创建
|
6月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用问题之同步oracle表时,数据量约800万,检查点异常,该如何排查
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
7月前
|
存储 Oracle 关系型数据库
Oracle RAC:数据库集群的舞动乐章
【4月更文挑战第19天】Oracle RAC是Oracle提供的高可用性数据库解决方案,允许多个实例共享同一数据库,确保业务连续性和数据完整性。通过集群件和全局缓存服务实现服务器间的协调和通信。RAC提供高可用性,通过故障转移应对故障,同时提升性能,多个实例并行处理请求。作为数据管理员,理解RAC的架构和管理至关重要,以发挥其在数据管理中的最大价值。