使用 Service 服务配置 Oracle 19c RAC TAF 透明应用程序故障转移

d1c2432bc2e77937520f220707a6c35c.gif

作者 | JiekeXu

来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)

如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)

大家好,我是 JiekeXu,江湖人称“强哥”,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle 11g OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看使用 Service 服务配置 Oracle 19c RAC TAF 透明应用程序故障转移欢迎点击最上方蓝字“JiekeXu DBA之路”关注我的微信公众号,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

前  言

再开始正文前,先插播一条重磅福利,各位看官,走过路过的进来看一看,瞧一瞧,保证不吃亏,免费抽奖送书,抽完奖的也可以帮忙点进来增加一下阅读量,600 以上阅读才能免费抽取 3 本《DBA实战手记》,快点下方红字进来参与吧。

DBA圈号主大联合免费抽奖送《DBA实战手记》https://mp.weixin.qq.com/s/gGF7SM5_zDekQTuroCGw-g

机械工业出版社联合 7 位 DBA 圈的博主,准备的送书活动,7 个活动可以同时参加,免费参加抽奖,价值 100 多块的彩印书籍,不来白嫖一下吗?又没什么损失。你好我好大家好的事儿,快来点上方红字进来参与吧。

故障转移

故障转移配置:如果用户端 tnsnames.ora 文件中配置了多个地址,则用户在发起连接请求时,会先尝试连接地址表中的第一个地址,如果这个连接失败,则继续尝试连接第二个地址,直至连接成功或遍历完所有的地址。这种故障转移方式只有在发起连接时才会去感知节点故障,如果节点没有反应,则自动尝试连接地址列表中的下一个地址。连接建立之后,即使节点出现故障也不会进行处理,会话中断,应用必须重新建立连接。这种故障转移方式在 tnsnames.ora 文件中添加 FAILOVER=ON 即可实现,默认是启用的,不添加该条目也可以使用该功能。

示例:

JiekeXu =
  (DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.11-vip1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.16.13-vip2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = JiekeXu)
    )
  )

423b301a15ca7573cd40a3f04cb5c563.png

TAF(Transparent Application Failover) 透明应用程序故障转移指建立连接后,如果某个实例发生故障,则连接到该实例上的会话会自动迁移到其他正常的实例上。对于应用程序而言,这个迁移过程是透明的,不需要用户的介入。TAF 的配置也很简单,只需要在客户端的 tnsnames.ora 文件中添加 FAILOVER_MODE 配置项,再配置以下 4 个参数。

METHOD:用户定义何时创建到其他实例的连接,有 BASIC 和PRECONNECT 两个可选值。
● BASIC:在感知到节点故障时,创建到其他实例的连接。
● PRECONNECT:在最初建立连接时就建立到所有实例的连接,当发生故障时,立刻就可以切换到其他链路上。BASIC 方式在故障转移时会有时间延迟,但节省资源,并且 RAC 出现故障的概率较小,所以一般选择BASIC方式。

TYPE:用于定义发生故障时对完成的SQL 语句的处理,有三种处理方式,即session、select和 none(默认值)。前面两种方式对未提交的事务都会自动回滚,区别在于对 select 语句的处理。对于 select 方式,用户正在执行的 select 语句会被转移到新的实例上,在新的节点上继续返回后续结果集,而已经返回的记录集则被抛弃。为了实现 select 方式,Oracle 必须为每个会话保存更多的内容,包括游标、用户上下文等,用资源换时间。

DELAY:重新连接的时间间隔。

RETRIES:重新连接的次数。

--连接示例:


JiekeXu =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.221.84-vip1)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.221.85-vip2)(PORT = 1521))
    )
    (CONNECT_DATA =
    (SERVER=DEDICATED)
      (SERVICE_NAME = JiekeXu)
    (FAILOVER_MODE=
      (TYPE=session)
      (METHOD=basic)
      (RETRIES=180)
      (DeLAY=5)
     )
    )
  )




--JDBC 连接串
jdbc:Oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.221.84)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.221.85)(PORT = 1521)))(CONNECT_DATA =(SERVER=DEDICATED)(SERVICE_NAME = JiekeXu)(FAILOVER_MODE=(TYPE=session)(METHOD=basic)(RETRIES=180)(DeLAY=5))))

service 是访问数据库的一种方式。可以通过 service 将不同的连接区分开来。service 可以当做是一组客户端或者应用的逻辑组合;每个单独的 service 可以设定其自己的属性,以满足不同的需要。

例如,为不同的应用、业务、PDB、instance 创建不同的 service,service 的配置要在参数 service_names 中设定,同时如果 service 要在监听中完成注册,那么一个新建是service 才能够正常使用从而可以将连接映射到不同的服务器上(集群环境)以进行区分。service 具有高可用性和负载均衡性。

传统的 TAF 实现方式存在如下问题:

  • 连接串通过 VIP 的顺序配置优先连接 RAC 的节点。

  • 连接串通常不会配置备库的 TNS,主备切换后需要调整 TNS 连接配置。

  • 需要人工维护配置文件 tnsnames.ora,客户端多的话,不利于维护。

简单理解就是原始的 TAF(Transparent Application Failover) 是在客户端的 tnsnames.ora 文件中配置,而数据库的 service 是在服务端已经配置好了,客户端无需维护 tnsnames.ora 文件。

service 创建语法

--创建语法:


srvctl add service -database db_unique_name -service service_name_list
[-pdb pluggable_database] [-eval]
[-preferred preferred_list] [-available available_list] [-failback {YES | NO}]
[-netnum network_number] [-tafpolicy {BASIC | NONE}]
[-edition edition_name]
[-role "[PRIMARY][,PHYSICAL_STANDBY][,LOGICAL_STANDBY][,SNAPSHOT_STANDBY]"
[-policy {AUTOMATIC | MANUAL}] [-notification {TRUE | FALSE}]
[-clbgoal {SHORT | LONG}] [-failovertype {NONE|SESSION|SELECT|TRANSACTION|AUTO}]
[-rlbgoal {NONE | SERVICE_TIME | THROUGHPUT}] [-dtp {TRUE | FALSE}]
[-failovermethod {NONE | BASIC}] [-failoverretry failover_retries]
[-drain_timeout timeout] [-stopoption {NONE|IMMEDIATE|TRANSACTIONAL}]
[-failover_restore {NONE|LEVEL1|AUTO}] [-failoverdelay failover_delay]
[-sql_translation_profile sql_translation_profile]
[-global {TRUE | FALSE}] [-maxlag max_lag_time] [-commit_outcome {TRUE|FALSE}]
[-retention retention_time] [-replay_init_time replay_initiation_time]
[-session_state {STATIC|DYNAMIC|AUTO}] [-force] [-verbose]

创建示例:

srvctl add service -db jiekexudb -service etl_readonly -preferred "jiekexudb1" -available "jiekexudb2" -failback yes -tafpolicy basic


srvctl start service -db jiekexudb -service etl_readonly
srvctl config service -db jiekexudb -service etl_readonly

增加一个优先连接节点1的服务名,服务名为 etl_readonly
srvctl add service -db <db_unique_name> -service <sevice_name_数据库名> -preferred “<首选实例名>” -available “<备选实例名>” -failback yes “<首选实例故障恢复自动切回>” -tafpolicy basic

Oracle 用户添加服务名

su - oracle 
srvctl add service -db JiekeXu -service JiekeXu_single -preferred "JiekeXu1" -available "JiekeXu2" -failback yes -tafpolicy basic


srvctl start service -db JiekeXu -service JiekeXu_single
srvctl config service -db JiekeXu -service JiekeXu_single

a63e3fba5686566dea314e357e444a6b.png

停止节点 1 集群后,服务在节点 2 自动 online

486de4486c85e0d80ebfeb4c9df1c346.png

当节点 1 开启后服务又会在节点 1 online

移除服务名

srvctl stop service -db JiekeXu -service JiekeXu_single
srvctl remove service -db JiekeXu -service JiekeXu_single

Oracle 用户查看服务名

srvctl config service -db <db_unique_name>

查看服务名:

col name for a30
select SERVICE_ID,NAME from dba_services where NAME='JiekeXu_single';

a319b478f2c4886c6e84ce1c6618c6b0.png

 
 
Select name,failover_method,failover_type,failover_retries,goal,clb_goal,aq_ha_notifications 
from dba_services where service_id=3;


Set line 345 pages 345 
col NETWORK_NAME for a30
col name for a18
col NETWORK_NAME for a30
col SESSION_STATE_CONSISTENCY for a30
col FAILOVER_RESTORE for a15
select inst_id,name,NETWORK_NAME,GOAL,GLOBAL,SESSION_STATE_CONSISTENCY,FAILOVER_RESTORE 
from gv$services where name<>'SYS$BACKGROUND' and name<>'SYS$USERS' and name not like '%XDB';

eadc161c81c603aab53d5b8cfa31d62d.png

关闭节点 1 集群 crsctl stop crs,也可以使用此服务名加 scan 地址连接到另一节点

sqlplus sys/Oracle@192.168.221.75:61512/JiekeXu_single as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Sep 20 15:33:44 2022
Version 19.15.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.15.0.0.0
SQL>

JDBC 连接串示例

不使用 service 的方式,JDBC 优先连接一个节点的写法,第一个节点连不通,会自动连第二个节点。
(默认为应用提供如下连接串,减少 gc 等待带来的性能问题。)

jiekedb =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS=(PROTOCOL=TCP)(HOST= xx.xx.xx.xx)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST= xx.xx.xx.xx)(PORT=1521))
(failover=yes))
(CONNECT_DATA=(SERVICE_NAME= jiekedb)
)
)




JiekeXu =
    (DESCRIPTION =
        (ADDRESS_LIST = (ADDRESS=(PROTOCOL=TCP)(HOST= 192.168.75.130)(PORT=1521))
                        (ADDRESS=(PROTOCOL=TCP)(HOST= 192.168.75.131)(PORT=1521))
                        (failover=yes)
        )
        (CONNECT_DATA=(SERVICE_NAME= JiekeXu))
    ) 




jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST= xx.xx.xx.xx)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST= xx.xx.xx.xx)(PORT=1521))(failover=yes))(CONNECT_DATA=(SERVICE_NAME= orcl)))


jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST= 192.168.75.130)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST= 192.168.75.131)(PORT=1521))(failover=yes))(CONNECT_DATA=(SERVICE_NAME= JiekeXu)))

当应用程序客户端较多时,配置客户端 TAF 就会比较麻烦,因为客户端 TAF 是通过tnsnames.ora 文件来配置的。服务端 TAF 是在数据库服务器上进行配置的,把所有的 TAF 的 FAIL_MODE 配置保存在数据字典中,就省去了客户端的配置工作。服务端 TAF 比客户端 TAF 多了一个 Instance Role(实例角色)的概念。当有多个实例时,可以配置优先使用哪一个实例提供服务,有以下两种类型。

PREFERRED:首选实例,会优先选择拥有这个角色的实例提供服务。
AVAILABLE:后备实例。应用程序优先连接到 PREFFERRED 配置的实例上,当 PREFERRED 配置的实例不可用时,才会被转到 AVAILBALE 配置的备用实例上。

通过 single 服务名连接, 19C 创建一个新的服务名 SID_SINGLE.

jiekedb_single =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = jiekedb_single)
)
)

Java 测试用例

import java.sql.*;




public class dbUtils {
    /**
     * oracle19c
     */
    public static String username = "SYSTEM";
    public static String password = "passwordOracle";
public static String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST= 192.168.75.130)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST= 192.168.75.131)(PORT=15
21))(failover=yes))(CONNECT_DATA=(SERVICE_NAME= JiekeXu)))";  


    public static Connection createConnection() {
        try {
            return DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    public static void main(String[] args) {
        try {
            Class.forName("oracle.jdbc.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


        // --裸 sql 场景
        System.out.println("--------------------------------------------------");
        executeQuery();
    }


    public static void executeQuery() {
        long s = System.currentTimeMillis();
        Connection[] connection=new Connection[100];
        try {
                int a=0;
                while (a<100){
                        connection[a] = createConnection();
                        a++;
                }
                Thread.sleep(300000);
                while (a<100){
                        connection[a].close();
                        a++;
                }
        } catch (Exception e) {
                e.printStackTrace();
        }
    }


}

下载驱动 ojdbc6.jar 放在 $JAVA_HOME/lib/ 目录下。

配置环境变量

export JAVA_HOME=/u01/app/19.0.0/grid/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/*

Linux 下运行程序

javac dbUtils.java
java dbUtils

查看连接会话

38842d85c40ca2d65a7c14345ba307a7.png

TAF、AC、TAC 的区别

49f6e7a91220b0b94a077ab7164474d3.png

透明应用程序故障转移 (Transparent Application Failover:TAF)

TAF 是 Oracle8i 中的一项功能。实例发生故障后,TAF 会创建一个新会话,并在使用 SELECT 模式时根据需要将查询重放至故障发生之前的位置。从 Oracle Database 12.2 开始,TAF 提供 FAILOVER_RESTORE,与应用程序连续性相匹配,以在重放查询之前恢复初始会话状态。使用最初重新建立的状态重放游标。使用 TAF 的应用程序不得在会话的后期更改会话状态(例如 PLSQL、临时表、临时 lob、系统上下文),因为此会话状态不会被恢复。

应用程序连续性(Application Continuity:AC)

从 Oracle 数据库 12.1 开始,应用程序连续性可隐藏基于 Java 的瘦应用程序的中断,从 Oracle 数据库 12.2.0.1 开始,应用程序连续性可隐藏基于 OCI 和 ODP.NET 的应用程序的中断。应用程序连续性通过从已知点恢复会话来重建会话,其中包括会话状态和事务状态。应用程序连续性可重建所有正在进行的工作。应用程序继续运行,当发生故障转移时,执行时间会略有延迟。应用程序连续性的标准模式适用于 OLTP 样式的池化应用程序。

透明应用连续性 (Transparent Application Continuity:TAC)

从 Oracle Database 18c 开始,透明应用程序连续性 (TAC) 可以透明地跟踪和记录会话和事务状态,以便在可恢复中断后恢复数据库会话。实现这一点无需依赖应用知识或应用程序代码更改,从而为您的应用程序启用透明应用程序连续性。应用透明和故障转移是通过消耗状态跟踪信息来实现的。应用程序发出用户调用时捕获会话状态使用情况并对其进行分类。

TAC 推荐的连接串

 
 
Use this Connection String for ALL Oracle driver version 12.2 or higher:


RAC 环境
Alias (or URL) =
(DESCRIPTION =
(CONNECT_TIMEOUT= 90)(RETRY_COUNT=50)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)
(ADDRESS_LIST = (LOAD_BALANCE=on)(ADDRESS = (PROTOCOL = TCP)(HOST=primary-scan)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME = YOUR SERVICE)))


RAC+ADG 环境
Alias (or URL) =
(DESCRIPTION =
(CONNECT_TIMEOUT= 90)(RETRY_COUNT=50)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)
(ADDRESS_LIST = (LOAD_BALANCE=on)(ADDRESS = (PROTOCOL = TCP)(HOST=primary-scan)(PORT=1521)))
(ADDRESS_LIST = (LOAD_BALANCE=on)(ADDRESS = (PROTOCOL = TCP)(HOST=standby-scan)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME = YOUR SERVICE)))

19886c4ab6361e3ecd04f9e8a9e76b3e.png

f0c84226dc32ce3abb1c122f65abf64c.png

相关参考链接

https://www.oracle.com/database/technologies/high-availability/app-continuity.html
https://www.oracle.com/database/technologies/appcontinuity/
https://www.oracle.com/docs/tech/database/applicationcontinuityformaa.pdf
https://www.oracle.com/technetwork/database/clustering/checklist-ac-6676160.pdf

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!

265cde34460b36e2eb162703969d6f28.gif

分享几个数据库备份脚本

一文搞懂 Oracle 统计信息
 
 

我的 Oracle ACE 心路历程

MOP 系列|MOP 三种主流数据库索引简介

Oracle 主流版本不同架构下的静默安装指南
 
 

关机重启导致 ASM 磁盘丢失数据库无法启动

Oracle SQL 性能分析(SPA)原理与实战演练
 
 

Oracle 11g 升级到 19c 需要关注的几个问题

Windows 10 环境下 MySQL 8.0.33 安装指南

SQL 大全(四)|数据库迁移升级时常用 SQL 语句

OGG|使用 OGG19c 迁移 Oracle11g 到 19C(第二版)

Oracle 大数据量导出工具——sqluldr2 的安装与使用

从国产数据库调研报告中你都能了解哪些信息及我的总结建议

使用数据泵利用 rowid 分片导出导入 lob 大表及最佳实践

在归档模式下直接 rm dbf 数据文件并重启数据库还有救吗?

欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————fa002990babc4798dddb700a185b6d37.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值