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

简介: 分享一个 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 的利弊,看是否需要针对性进行调整。

相关文章
|
4月前
|
存储 关系型数据库 数据库
【赵渝强老师】国产金仓数据库的体系架构
金仓数据库(KingbaseES)是基于PostgreSQL开发的国产关系型数据库,具有自主知识产权。其体系结构涵盖逻辑存储、物理存储、进程与内存管理,支持高可靠性与性能优化,广泛应用于关键信息基础设施领域。
740 1
|
运维 数据库 Windows
【ogg三】日常运维篇:清理归档日志,ogg进程注册服务,定期备份数据库
【ogg三】日常运维篇:清理归档日志,ogg进程注册服务,定期备份数据库
586 0
【ogg三】日常运维篇:清理归档日志,ogg进程注册服务,定期备份数据库
|
SQL 监控 Oracle
Oracle数据误删不用怕,跟我来学日志挖掘
Oracle数据误删不用怕,跟我来学日志挖掘
573 0
|
Oracle Java 关系型数据库
【问题】Cause: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
【问题】Cause: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
|
移动开发 前端开发 Java
过时的Java技术盘点:避免在这些领域浪费时间
【10月更文挑战第14天】 在快速发展的Java生态系统中,新技术层出不穷,而一些旧技术则逐渐被淘汰。对于Java开发者来说,了解哪些技术已经过时是至关重要的,这可以帮助他们避免在这些领域浪费时间,并将精力集中在更有前景的技术上。本文将盘点一些已经或即将被淘汰的Java技术,为开发者提供指导。
662 7
|
SQL 监控 Oracle
Oracle 性能优化之AWR、ASH和ADDM(含报告生成和参数解读)
Oracle 性能优化之AWR、ASH和ADDM(含报告生成和参数解读)
|
Oracle 关系型数据库 Linux
Linux 关闭透明大页(transparent_hugepage)和 NUMA
有些情况下需要关闭Linux 服务器的 透明大页和 NUMA,比如安装 Oracle 数据库!
Linux 关闭透明大页(transparent_hugepage)和 NUMA
|
8月前
|
SQL 关系型数据库 Apache
从 Flink 到 Doris 的实时数据写入实践 —— 基于 Flink CDC 构建更实时高效的数据集成链路
本文将深入解析 Flink-Doris-Connector 三大典型场景中的设计与实现,并结合 Flink CDC 详细介绍了整库同步的解决方案,助力构建更加高效、稳定的实时数据处理体系。
3061 0
从 Flink 到 Doris 的实时数据写入实践 —— 基于 Flink CDC 构建更实时高效的数据集成链路
|
消息中间件 Java Kafka
skywalking日志收集
skywalking日志收集
skywalking日志收集

热门文章

最新文章