数据库管理221期 2024-07-17
数据库管理-第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:
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的服务。主库也建议进行相同配置:
srvctl modify service -db dbaas -service tac_srv -modifyconfig -role primary
2 连接配置
2.1 TNS
可以使用tnsname来实现支持TAC的连接访问。
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
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依赖即可,如:
<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的数据库端与应用端的配置。
老规矩,知道写了些啥。