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

相关文章
|
7月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
1190 64
|
8月前
|
存储 Oracle 关系型数据库
oracle数据恢复—oracle数据库执行错误truncate命令的数据恢复案例
oracle数据库误执行truncate命令导致数据丢失是一种常见情况。通常情况下,oracle数据库误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况,例如数据库备份无法使用或者还原报错等。下面和大家分享一例oracle数据库误执行truncate命令导致数据丢失的数据库数据恢复过程。
|
10月前
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
402 6
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
386 5
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
存储 Oracle 关系型数据库
oracle数据恢复—Oracle数据库文件大小变为0kb的数据恢复案例
存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组存储位图信息,重新导出控制文件中记录的数据文件,发现这些文件的大小依然为0kb。
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
SQL 存储 Oracle
Oracle数据库SQL语句详解与应用指南
在数字化时代,数据库已成为各类企业和组织不可或缺的核心组件。Oracle数据库作为业界领先的数据库管理系统之一,广泛应用于各种业务场景。掌握Oracle数据库的SQL语句是数据库管理员、开发人员及运维人员的基本技能。本文将详细介绍Oracle数据库SQL语句的基本概念、语法、应用及最佳实践。一、Or
589 3
|
Oracle 关系型数据库 数据库
Oracle数据恢复—异常断电导致Oracle数据库数据丢失的数据恢复案例
Oracle数据库故障: 机房异常断电后,Oracle数据库启库报错:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。数据库没有备份,归档日志不连续。用户方提供了Oracle数据库的在线文件,需要恢复zxfg用户的数据。 Oracle数据库恢复方案: 检测数据库故障;尝试挂起并修复数据库;解析数据文件。

推荐镜像

更多