负载均衡和故障转换(Failover)的连接RAC方法

TAF:Transparent Application Failover,透明的应用切换,即在切换的过程中,用户感知不到。可以实现会话的切换(无法实现事务的切换,即没有提交的事务会回滚),即在不断开连接的情况下,将当前会话切换到另一个实例。JDBC驱动无法使用TAF特性,因此只能断开连接并重新连接。

SCANIP+SERVICE实现负载均衡和TAF

1.配置SERVICE

以上为添加Service的语法,重点关注几个选项。

-d 给哪一个数据库添加service,有可能clusterware管理好几个数据库

-s 新建的service的名称

-r 优先选择哪一个实例,实例间用逗号隔开

-a 优先选择的实例全部不可用时使用这里面的实例。

-r 内的实例是负载均衡的,-r和-a之间是FailOver的,因此两节点的实例需要负载均衡的话,应该讲两节点实例都写入-a中

-p 一般选择basic,perconnect即在其中一个实例建立会话的时候,在另一个实例上面也新建一个连接。当第一个实例不可用时,可以实现会话的快速转移。但是,这种方法想到耗费资源、

    basic,只有当实例1的不可用时,才在实例2创建会话并将会话转移过来

-y 自动FAILOVER还是手动FAILOVER

-e session的话是FAILOVER的时候不会返回剩余的SELECT结果集。SELECT不会断开会话,未提交的事务回归。select语句返回剩余的结果集、

-m 一般与-p参数相同

-w 失败重试的时间间隔

-z 失败重试几次

[oracle@rac01 ~]$ srvctl add service -d racdb -s rac -r racdb1,racdb2 -P BASIC -y AUTOMATIC -e select -m BASIC -w 3 -z 10
[oracle@rac01 ~]$ srvctl start service -d racdb -s rac
[oracle@rac01 ~]$ srvctl config service -d racdb -s rac

2.配置客户端TNS

复制代码
DG=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=10.206.132.238)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=rac)
    )
  )
复制代码

中间10.206.132.238是SCANIP,SERVICE_NAME是Service的名称

测试负载均衡:使用swingbench压测工具,创建50个连接,执行如下SQL可以看到,50个连接平均的分配到两个实例上

测试TAF:JDBC无法使用TAF特性,因此不要使用JDBC类客户端,这里直接用SQLPLUS进行测试

 连接后,查询到会话在实例1上面

 

重启实例1所在服务器,再次查询

这时打开连接数据库的sqlplus发现并没有断开,而且依旧可以执行命令

 

配置本地TNS实现负载均衡和TAF

1.删除上一步创建的service

 

2.配置本地的TNS

复制代码
MONKEY=
  (DESCRIPTION=
    (FAILOVER=on)
    (LOAD_BALANCE=on)
    (ADDRESS_LIST=
      (ADDRESS=
        (PROTOCOL=TCP)
        (HOST=10.206.132.237)
        (PORT=1521)
      )
      (ADDRESS=
        (PROTOCOL=TCP)
        (HOST=10.206.132.238)
        (PORT=1521)
      )
    )
    (CONNECT_DATA=
      (FAILOVER_MODE=
        (TYPE=select)
        (METHOD=basic)
      )
      (SERVER=dedicated)
      (SERVICE_NAME=racdb)
    )
  )
复制代码

10.206.132.236和10.206.132.238是两个VIP。连接的时候会随机选择一个IP实现负载均衡。

这种情况下,没有测出来负载均衡,但是可以实现TAF

 

SCANIP和SERVICE实现TAF,并分业务(不用负载均衡)

[oracle@rac01 ~]$ srvctl add service -d racdb -s rac01 -r racdb1 -a racdb2 -P basic -y automatic -e select
[oracle@rac01 ~]$ srvctl add service -d racdb -s rac02 -r racdb2 -a racdb1 -P basic -y automatic -e select
[oracle@rac01 ~]$ srvctl start service -d racdb
[oracle@rac01 ~]$ srvctl status service -d racdb

客户端连接

sqlplus monkey/monkey@10.206.132.239:1521/rac01
sqlplus monkey/monkey@10.206.132.239:1521/rac02

可以实现业务分离和TAF

 

本地TNS实现TAF,并分业务(不用负载均衡)

复制代码
MONKEY=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (FAILOVER=on)
      (LOAD_BALANCE=off)
      (ADDRESS=
        (PROTOCOL=TCP)
        (HOST=10.206.132.237)
        (PORT=1521)
      )
      (ADDRESS=
        (PROTOCOL=TCP)
        (HOST=10.206.132.238)
        (PORT=1521)
      )
    )
    (CONNECT_DATA=
      (FAILOVER_MODE=
        (TYPE=select)
        (METHOD=basic)
        (RETRIES=10)
        (DELAY=3)
      )
      (SERVICE_NAME=racdb)
    )
  )
复制代码

 

posted @   monkey6  阅读(938)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示