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

相关文章
|
22天前
|
Oracle 关系型数据库
oracle rac 手工安装补丁,不适用auto
oracle rac 手工安装补丁,不适用auto
15 3
|
26天前
|
存储 Oracle 关系型数据库
【数据库数据恢复】Oracle数据库ASM磁盘组掉线的数据恢复案例
oracle数据库ASM磁盘组掉线,ASM实例不能挂载。数据库管理员尝试修复数据库,但是没有成功。
【数据库数据恢复】Oracle数据库ASM磁盘组掉线的数据恢复案例
|
1月前
|
SQL Oracle 关系型数据库
Oracle PL/SQL基础知识及应用案例
Oracle PL/SQL基础知识及应用案例
18 0
|
2月前
|
运维 Oracle 关系型数据库
服务器数据恢复-raid5故障导致上层oracle数据库故障的数据恢复案例
服务器数据恢复环境: 一台服务器中有一组由24块FC硬盘组建的raid5磁盘阵列,linux操作系统+ext3文件系统,服务器上层部署有oracle数据库。 服务器故障&检测: raid5阵列中有两块硬盘出现故障掉线,导致服务器上层卷无法挂载,oracle数据库无法正常使用。 通过管理后台查看服务器中硬盘的状态,显示有两块硬盘处于离线状态。
|
2月前
|
Oracle 关系型数据库 数据库
oracle数据恢复—服务器断电导致Oracle数据库报错的数据恢复案例
一台Windows server操作系统的服务器上部署Oracle数据库。 服务器意外断电导致oracle数据库报错,报错信息:“system01.dbf需要更多的恢复来保持一致性”。由于该oracle数据库并没有备份,仅有一些断断续续的归档日志,无法通过备份文件恢复oracle数据库的数据。管理员联系北亚企安数据恢复中心要求修复Oracle数据库。
oracle数据恢复—服务器断电导致Oracle数据库报错的数据恢复案例
|
3月前
|
SQL Oracle 关系型数据库
本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
109 0
|
4月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—断电导致Oracle数据库报错的数据恢复案例
北京某公司一台运行oracle数据库的服务器,机房意外断电导致该服务器重启,重启后发现oracle数据库报错。该Oracle数据库没有备份。
数据库数据恢复—断电导致Oracle数据库报错的数据恢复案例
|
4月前
|
存储 运维 Oracle
数据库数据恢复-oracle数据库无法打开的数据恢复案例
oracle数据库数据恢复环境: 一台服务器,底层由12块硬盘组成一组磁盘阵列,上层操作系统上运行oracle数据库。 oracle数据库故障: 数据库无法打开,报错:“数据库无法打开”,管理员第一时间将服务器关机,联系我们中心恢复数据。
|
5月前
|
存储 Oracle 算法
数据库数据恢复-ORACLE数据库常见故障的数据恢复可能性分析
ORACLE数据库常见故障: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE数据库ASM存储破坏。 3、ORACLE数据库数据文件丢失。 4、ORACLE数据库数据文件部分损坏。 5、ORACLE数据库DUMP文件损坏。