数据库管理-第221期 Oracle的高可用-04(20240717)

数据库管理221期 2024-07-17

  • [数据库管理-第221期 Oracle的高可用-04(20240717)](#数据库管理-第221期 Oracle的高可用-04(20240717))
    • [1 ADG](#1 ADG)
    • [2 连接配置](#2 连接配置)
      • [2.1 TNS](#2.1 TNS)
      • [2.2 JDBC](#2.2 JDBC)
      • [2.3 JAVA连接池](#2.3 JAVA连接池)
      • [2.3.1 Oracle UCP](#2.3.1 Oracle UCP)
      • [2.3.2 应用连接池基础配置](#2.3.2 应用连接池基础配置)
    • 总结

数据库管理-第221期 Oracle的高可用-04(20240717)

作者:胖头鱼的鱼缸(尹海文)

Oracle ACE Pro: Database(Oracle与MySQL)

PostgreSQL ACE Partner

10年数据库行业经验,现主要从事数据库服务工作

拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证

墨天轮MVP、年度墨力之星,ITPUB认证专家、专家百人团成员,OCM讲师,PolarDB开源社区技术顾问,HaloDB外聘技术顾问,OceanBase观察团成员,青学会MOP技术社区(青年数据库学习互助会)技术顾问

圈内拥有"总监"、"保安"、"国产数据库最大敌人"等称号,非著名社恐(社交恐怖分子)

公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。

除授权转载并标明出处外,均为"非法"抄袭

上一期讲解了如何在RAC中配置支持TAC的服务,本期讲解如何在服务侧配置支持TAC的连接。

1 ADG

TAC不仅支持RAC内节点异常会话不中断,在ADG环境主备切换时也能确保增删查改不中断,需要在备库添加与主库类似的服务,这里将数据库名称和实例名前缀调整为dbdg:

bash 复制代码
srvctl add service -db dbdg -pdb PDB1 -service tac_srv -preferred dbdg1,dbdg2 -available dbdg3,dbdg4 -failover_restore AUTO -failoverretry 30 -failoverdelay 10 -commit_outcome TRUE -failovertype AUTO -replay_init_time 1800 -retention 86400 -notification TRUE -drain_timeout 300 -stopoption IMMEDIATE -role primary

srvctl start service -db dbdg -service tac_srv

这里建议在备库制定-role参数来确保数据库在切换为primary角色后能正常启动服务,如需支持读写分离可以分别在主备库一个-role指定为physical standby的服务。主库也建议进行相同配置:

bash 复制代码
srvctl modify service -db dbaas -service tac_srv -modifyconfig -role primary

2 连接配置

2.1 TNS

可以使用tnsname来实现支持TAC的连接访问。

bash 复制代码
tac_srv=
(DESCRIPTION=
   (CONNECT_TIMEOUT=120) (RETRY_COUNT=20)(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=TAC_SRV)))

如果仅是支持单RAC内TAC,仅需添加一个ADDRESS_LIST即可。

2.2 JDBC

bash 复制代码
url=jdbc:oracle:thin:@(DESCRIPTION=(CONNECT_TIMEOUT=120)(RETRY_COUNT=20)(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='TAC_SRV')))

如果仅是支持单RAC内TAC,仅需添加一个ADDRESS_LIST即可。

2.3 JAVA连接池

2.3.1 Oracle UCP

Java应用中使用TAC,首选Oracle UCP。UCP 无缝集成 Oracle 数据库集群,应用端使用UCP能获得其它连接池无法实现的一些好处,如支持 TAC,支持连接池快速排干以及连接快速恢复(FCF,Fast Connection Failover),动态连接负载均衡(RCLB,Runtime Connection Load Balancing)等。

应用端引入UCP依赖比较简单,如果用maven的话,pom文件中增加ojdbc8依赖即可,如:

bash 复制代码
<dependency>
  <groupId>com.oracle.database.jdbc</groupId>
  <artifactId>ojdbc8-production</artifactId>
  <version>19.20.0.0</version>
  <type>pom</type>
</dependency>

2.3.2 应用连接池基础配置

以Spring Boot为例,v2.4.0及以上版本的配置属性已经原生支持了Oracle UCP,因此,跟配置其它连接池一样,只需要在Spring Boot配置文件中指定即可,无需任何代码端变动:

spring.datasource.url=jdbc:oracle:thin:@(DESCRIPTION=(FAILOVER=on)(LOAD_BALANCE=off)(TRANSPORT_CONNECT_TIMEOUT=5)(RETRY_COUNT=20)(RETRY_DELAY=3)(ADDRESS_LIST=(LOAD_BALAN CE=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='TAC_SRV')))

spring.datasource.username=db_user

spring.datasource.password=xxxxxx

spring.datasource.type=oracle.ucp.jdbc.PoolDataSource

spring.datasource.oracleucp.connection-pool-name=pool-ncmsobs

spring.datasource.oracleucp.connection-factory-class-name=oracle.jdbc.replay.OracleDataSourceImpl

spring.datasource.oracleucp.fast-connection-failover-enabled=true

spring.datasource.oracleucp.initial-pool-size=30

spring.datasource.oracleucp.min-pool-size=30

spring.datasource.oracleucp.max-pool-size=200

......

如果是用Spring Boot v2.4.0以下的老版本(如2.1.x),配置也很简单,只需新增一个configuration Bean,指向配置文件中的UCP配置段即可,如:

@Configuration

public class UCPDataSource {

@Bean("ncmsobs")

@Primary

@ConfigurationProperties("spring.datasource.oracleucp ") //指向配置文件中的 UCP 配置段

public DataSourceds_ncmsobs() {

return PoolDataSourceFactory.getPoolDataSource();

}

}

使用UCP还可以指定JDBC的语句缓存(Statement Cache):

spring.datasource.oracleucp.max-statements=200

或者

spring.datasource.oracleucp.connection-properties.oracle.jdbc.implicitStatementCacheSize=200

会话保持机制除了JDBC连接中的配置,还有:

spring.datasource.oracleucp.connection-properties.oracle.jdbc.ReadTimeout=30sec

spring.datasource.oracleucp.connection-properties.oracle.net.keepAlive=true
spring.datasource.oracleucp.connection-properties.oracle.net.TCP_KEEPIDLE=60
spring.datasource.oracleucp.connection-properties.oracle.net.TCP_KEEPINTERVAL=5
spring.datasource.oracleucp.connection-properties.oracle.net.TCP_KEEPCOUNT=3

总结

本期讲解了在RAC+ADG环境下使用TAC的数据库端与应用端的配置。

老规矩,知道写了些啥。

相关推荐
建投数据32 分钟前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi2 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀2 小时前
Redis梳理
数据库·redis·缓存
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天2 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺2 小时前
分布式系统架构:服务容错
数据库·架构
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain4 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship4 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站4 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle