数据库管理-第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的数据库端与应用端的配置。

老规矩,知道写了些啥。

相关推荐
追风赶月、16 分钟前
【MySQL】事务(隔离性、MVCC)
数据库·mysql
ʃknight17 分钟前
redis
数据库·redis·缓存
编程修仙1 小时前
c3p0连接池
数据库·oracle
补三补四1 小时前
Django与视图
数据库·python·django·sqlite
程序员总部2 小时前
如何应对Maven中的依赖导入挑战?
数据库·sql·maven
赵渝强老师3 小时前
【赵渝强老师】管理MongoDB的运行
数据库·mongodb
A仔不会笑3 小时前
MySQL面试篇——性能优化
java·数据库·mysql·面试·性能优化
梦幻编织者3 小时前
python使用django搭建图书管理系统
数据库·python·django
考虑考虑4 小时前
MySQL中的DATE_FORMAT时间函数
数据库·后端·mysql
SelectDB技术团队4 小时前
云原生时代的架构革新,Apache Doris 存算分离如何实现弹性与性能双重提升
大数据·数据库·云原生·doris·存算分离