用service 和 SCAN实现sqlplus/jdbc连接Oracle 11g RAC时负载均衡

news2025/5/26 5:14:21

说明

11.2推出的SCAN ,简化了客户端连接(当增加或者减少RAC实例时,不需要修改客户端配置,并且scan listener有各个实例的负载情况,可以实现连接时负载均衡。

不过客户端需要使用专门建立的service,而不能用RAC数据库本身的数据库名连接,否则不能实现连接时负载均衡。

使用service 连接时,可以用此sql在每个instance查看其负载,其中goodness就是负载。

 select service_name,goodness,delta,flags from v$servicemetric

本文分别用sqlplus和jdbc测试Oracle 数据库连接时负载均衡。

RAC环境

rac环境,11.2.0.4 PSU Jul20 , RHEL7.9

scan: 56.78

节点1: 56.71, 56.75(vip)

节点2: 56.72, 56.76(vip)

设置java 环境

测试使用java 1.6 ,

https://www.oracle.com/java/technologies/javase-java-archive-javase6-downloads.html

jdk6u45 下载地址:
https://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin

安装步骤:

切换到root,cd /usr/local,执行/home/oracle/jdk-6u211-linux-x64.bin, 解压jdk包,建立soft link jdk到jdk-6u211-linux-x64.

修改oracle用户.bash_profile,PATH加入jdk目录
PATH=/usr/java/jdk1.6.0_211/bin:$PATH

[oracle@testdb1 jdbc]$ which java
/usr/local/jdk/bin/java
[oracle@testdb1 jdbc]$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

测试步骤

1. rac建立服务testlb

srvctl add service -d ctp -s testlb -r ctp1,ctp2
srvctl status service -d ctp
srvctl modify service -d ctp -s testlb -m basic -e select -q true -j short -B service_time
srvctl modify service -d ctp -s testlb -B THROUGHPUT

2. 压力测试配置

使用swingbench
swingbench是原oracle公司员工Dominic Giles为oralce内部项目而编写的开源软件,免费使用 。
测试使用的配置文件 test-rac-ctp1-notime.xml

数据库连接 (连接到节点1 的vip, 56.75 )

    <Connection>
        <UserName>soe</UserName>
        <Password>enc(cw4Xx9RgsQA=)</Password>
        <ConnectString>//192.168.56.75/testlb</ConnectString>
        <DriverType>Oracle jdbc Driver</DriverType>
        <Properties>
            <Property Key="StatementCaching">120</Property>
            <Property Key="FetchSize">20</Property>
        </Properties>
    </Connection> 

jdbc连接测试java代码

LoadBalanceTestSCAN.java
测试的java程序来自: 《Using SCAN With Oracle JDBC Thin Driver 11g And Higher (Doc ID 1290193.1)》

  [oracle@testdb1 jdbc]$ cat LoadBalanceTestSCAN.java
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import oracle.jdbc.pool.OracleDataSource;

// ref Using SCAN With Oracle JDBC Thin Driver 11g And Higher (Doc ID 1290193.1)
public class LoadBalanceTestSCAN {
  private OracleDataSource ods = null;
  public final String userId = "system";
  public final String password = "oracle";

  private static final String url = "jdbc:oracle:thin:@192.168.56.78:1521/testlb";
//  private static final String url = "jdbc:oracle:thin:@192.168.56.78:1521:testlb";
//  private static final String url = "jdbc:oracle:thin:@(DESCRIPTION= (LOAD_BALANCE=yes) (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.78)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=testlb)))";
//  private static final String url = "jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.75)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.76)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=ctp)))" ;

  public LoadBalanceTestSCAN() throws SQLException {
    ods = new OracleDataSource();
    ods.setUser(userId);
    ods.setPassword(password);
    ods.setURL(url);
  }

  public Connection getConnection() throws SQLException {
    return ods.getConnection();
  }

  public void run() throws SQLException {
    Connection[] connArray = new Connection[5];

    System.out.println("Obtaining 5 connections");
    for (int i = 0; i < connArray.length; i++) {
      connArray[i] = getConnection();
    }

    for (int j = 0; j < connArray.length; j++) {
      if (j == 0) {
        DatabaseMetaData meta = connArray[j].getMetaData();
        System.out.println("using URL : " + url + "\n");
        // gets driver info:

        System.out.println("\n=============\nDatabase Product Name is ... " +
                           meta.getDatabaseProductName());
        System.out.println("Database Product Version is " +
                           meta.getDatabaseProductVersion());
        System.out.println("=============\nJDBC Driver Name is ........ " +
                           meta.getDriverName());
        System.out.println("JDBC Driver Version is ..... " +
                           meta.getDriverVersion());
        System.out.println("JDBC Driver Major Version is " +
                           meta.getDriverMajorVersion());
        System.out.println("JDBC Driver Minor Version is " +
                           meta.getDriverMinorVersion());
        System.out.println("=============");
      }

      getInstanceDetails(connArray[j], j);
    }

    System.out.println("Closing Connections");
    for (int y = 0; y < connArray.length; y++) {
      connArray[y].close();
    }
  }

  public void getInstanceDetails(Connection conn, int i) throws SQLException {
    String sql = "select sys_context('userenv', 'instance_name'), "
                 + "sys_context('userenv', 'server_host'), "
                 + "sys_context('userenv', 'service_name') "
                 + "from dual";

    Statement stmt = conn.createStatement();
    ResultSet rset = stmt.executeQuery(sql);
    while (rset.next()) {
      System.out.println("Connection #" + i + " : instance[" +
                         rset.getString(1) + "], host[" + rset.getString(2) +
                         "], service[" + rset.getString(3) + "]");
    }

    rset.close();
    stmt.close();
  }

  public static void main(String[] args) {
    LoadBalanceTestSCAN loadBalanceTest;
    try {
      System.out.println("Test Started at " + new Date());
      loadBalanceTest = new LoadBalanceTestSCAN();
      loadBalanceTest.run();
      System.out.println("Test Ended at " + new Date());
    } catch (SQLException e) {
      e.printStackTrace();
      System.exit(1);
    }
  }
}
[oracle@testdb1 jdbc]$
  

sqlplus连接测试脚本

[oracle@testdb1 test_vip_scan]$ cat test_scan.sh
#!/usr/bin/env bash
#test scan ip
sqlplus system/oracle@testlb @sel_instance_name > scan.out
#sleep 2
sqlplus system/oracle@testlb @sel_instance_name >> scan.out
#sleep 2
sqlplus system/oracle@testlb @sel_instance_name >> scan.out
#sleep 2
sqlplus system/oracle@testlb @sel_instance_name >> scan.out
#sleep 2
sqlplus system/oracle@testlb @sel_instance_name >> scan.out

grep ctp  scan.out
[oracle@testdb1 test_vip_scan]$ cat sel_instance_name.sql
select instance_name from v$instance;
exit;
[oracle@testdb1 test_vip_scan]$
[oracle@testdb1 test_vip_scan]$ cat test_tnsnames.ora
testlb =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.78)(PORT = 1521))
    (CONNECT_DATA =
      (LOAD_BALANCE=ON)
      (SERVER = DEDICATED)
      (SERVICE_NAME = testlb)
    )
  )

testlb定义使用的service_nme是testlb

测试记录

压力测试

在这里插入图片描述

查看2个节点的sar
在这里插入图片描述
节点1 的idle 是0, 节点2 的idle 90%左右。

节点1满负载运行。

sqlplus测试连接

在这里插入图片描述

测试jdbc连接

在这里插入图片描述
从测试看,无论sqlplus还是jdbc, 绝大部分连接到没有压力的节点2。
连接时负载均衡正常。

参考文档

Using SCAN With Oracle JDBC Thin Driver 11g And Higher (Doc ID 1290193.1)

https://mp.weixin.qq.com/s/nnO9SpkWpUVsqPZU02i1Mg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2385855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

防火墙流量管理

带宽管理介绍 针对企业用户流量&#xff0c;防火墙提供了带宽管理功能&#xff0c;基于出/入接口、源/目的安全区域、源/目的地址、时间段、报文DSCP优先级等信息&#xff0c;对通过自身的流量进行管理和控制。 带宽管理提供带宽限制、带宽保证和连接数限制功能&#xff0c;可…

Linux系统移植①:uboot概念

Linux系统移植①&#xff1a;uboot概念 uboot概念 1、uboot是一个比较复杂的裸机程序。 2、uboot就是一个bootloader,作用就是用原于启动Linux或其他系统。uboot最主要的工作就是初始化DDR。因为Linux是运行再DDR里面的。一般Linux镜像zImage&#xff08;uImage&#xff09;设…

DAY 35

import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler import time import matplotlib.pyplot as plt# 设置GPU设…

AWS EC2实例安全远程访问最佳实践

EC2 远程连接方案对比 远程访问 Amazon EC2 实例主要有以下四种方式&#xff1a; Secure Shell (SSH) 远程访问AWS Systems Manager 会话管理器适用于 Linux 实例的 EC2 Serial ConsoleAmazon EC2 Instance Connect SSH 远程访问 SSH&#xff08;Secure Shell&#xff09;广…

【强化学习】#7 基于表格型方法的规划和学习

主要参考学习资料&#xff1a;《强化学习&#xff08;第2版&#xff09;》[加]Richard S.Suttion [美]Andrew G.Barto 著 文章源文件&#xff1a;https://github.com/INKEM/Knowledge_Base 本章更是厘清概念厘到头秃&#xff0c;如有表达不恰当之处还请多多指教—— 概述 环境…

EasyRTC嵌入式音视频通信SDK一对一音视频通信,打造远程办公/医疗/教育等场景解决方案

一、方案概述​ 数字技术发展促使在线教育、远程医疗等行业对一对一实时音视频通信需求激增。传统方式存在低延迟、高画质及多场景适配不足等问题&#xff0c;而EasyRTC凭借音视频处理、高效信令交互与智能网络适配技术&#xff0c;打造稳定低延迟通信&#xff0c;满足基础通信…

网络安全-等级保护(等保) 3-2-1 GB/T 28449-2019 第6章 方案编制活动

################################################################################ GB/T 28449-2019《信息安全技术 网络安全等级保护测评过程指南》是规定了等级测评过程&#xff0c;是纵向的流程&#xff0c;包括&#xff1a;四个基本测评活动:测评准备活动、方案编制活…

【免费使用】剪Y专业版 8.1/CapCut 视频编辑处理,素材和滤镜

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VOQxk38EUe3_8Et86ZCH84JsA1?pwdkp7h# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/388008091ab4 【​本章下载三】&#xff1a;https://drive.uc.cn/s/d5ae5c725637…

实现rpc通信机制(待定)

一、概述 &#xff08;1&#xff09;rpc&#xff08;remote procedure call, 远程接口调用&#xff09;,就像在本地调用函数一样&#xff0c;是应用组成服务内部分布式的基础功能。应用场景是在内网中的计算&#xff0c;比如&#xff1a;(a) 为上传的一张图片加水印、&#xf…

代码随想录打卡|Day45 图论(孤岛的总面积 、沉没孤岛、水流问题、建造最大岛屿)

图论part03 孤岛的总面积 代码随想录链接 题目链接 视频讲解链接 思路&#xff1a;既然某个网格在边界上的岛屿不是孤岛&#xff0c;那么就把非 孤岛的所有岛屿变成海洋&#xff0c;最后再次统计还剩余的岛屿占据的网格总数即可。 dfs&#xff1a; import java.util.Scanner…

SpringCloud实战:使用Sentinel构建可靠的微服务熔断机制

上篇文章简单介绍了SpringCloud系列Gateway的基本用法以及Demo搭建&#xff0c;今天继续讲解下SpringCloud Gateway实战指南&#xff01;在分享之前继续回顾下本次SpringCloud的专题要讲的内容&#xff1a; 本教程demo源码已放入附件内 技术准备 读者须知&#xff1a; 本教程…

张 Prompt Tuning--中文数据准确率提升:理性与冲动识别新突破

Prompt Tuning–中文数据准确率提升:理性与冲动识别新突破 中文数据,准确率 数据标签三类:冲动21,理性21,(中性设为理性40:说明prompt 修正的有效性) 测试数据:冲动4,理性4,中性设为理性10 为了可视化做了 词嵌入 空间的相似文本计算,但是实际当loss 比较小的时…

深入解析 MySQL 中的 SHOW_ROUTINE 权限

目录 前言 权限作用 授权方法 MySQL8.0.20以上 MySQL8.0.20以下 总结 前言 SHOW_ROUTINE 是 MySQL 中用于控制用户查看存储过程和函数定义的权限。拥有该权限的用户可以通过 SHOW CREATE PROCEDURE 和 SHOW CREATE FUNCTION 等语句查看存储过程和函数的详细定义&#xff…

电脑网络如何改ip地址?ip地址改不了怎么回事

在日常使用电脑上网时&#xff0c;我们有时会遇到需要更改IP地址的情况&#xff0c;比如访问某些受限制的网站、解决网络冲突问题&#xff0c;或者出于隐私保护的需求。然而&#xff0c;许多用户在尝试修改IP地址时可能会遇到各种问题&#xff0c;例如IP地址无法更改、修改后无…

打开小程序提示请求失败(小程序页面空白)

1、小程序代码是商城后台下载的还是自己编译的 &#xff08;1&#xff09;要是商城后台下载的&#xff0c;检查设置里面的域名是不是https的 &#xff08;2&#xff09;要是自己编译的&#xff0c;检查app.js里面的接口域名是不是https的&#xff0c;填了以后有没有保存 注&a…

一张纸决定的高度

从我捧起《格局》这个本书开始&#xff0c;转眼间两个月过去了。 回头望一望&#xff0c;好似还在昨天。 这两个月&#xff0c;心态在变&#xff0c;前进的方向在变&#xff0c;但唯一不变的就是每天晚上睡前&#xff0c;留给自己十分钟的读书时光。 我也从来没想过&#xf…

IP查询基础介绍

IP 查询原理 IP 地址是网络设备唯一标识&#xff0c;IP 查询通过解析 IP 地址获取地理位置、运营商等信息。目前主流的 IPv4&#xff08;32 位&#xff09;与 IPv6&#xff08;128 位&#xff09;协议&#xff0c;前者理论提供约 43 亿地址&#xff0c;后者地址空间近乎无限。…

常见的gittee开源项目推荐

https://gitee.com/macrozheng/mall https://doc.ruoyi.vip/ https://eladmin.vip/ https://gitee.com/dromara/RuoYi-Cloud-Plus https://gitee.com/dromara/RuoYi-Vue-Plus https://gitee.com/ZhongBangKeJi/crmeb_java

日常效率工具【Tools】【持续更新】

日常效率工具【Tools】 VScodevscode原理&#xff08;居然和Chrome同源&#xff09;Chromium(Chrome开源版)node.js:让JavaScript可以运行在wab之外的环境 配置文件setting.jesn vscode快捷键万事不求人&#xff08;Ctrl K,Ctrl S&#xff09;vscode修改光标所在行的背景色Gene…

数据结构与算法——链式二叉树

链式二叉树 遍历方式与其规则代码的实现递归的复习前&#xff0c;中&#xff0c;后序遍历的实现二叉树结点个数二叉树叶子结点个数二叉树第k层结点个数二叉树的深度/高度二叉树查找值为x的结点二叉树销毁层序遍历 遍历方式与其规则 前序遍历&#xff1a;访问根结点的操作发⽣在…