业务背景
项目随着业务量的不断增加,订单数据量愈来愈大。
原有解决方案是定时清理历史数据。但目前客户要求长时间订单数据保留。
导致的问题是,业务高峰时,大量订单查询业务与写业务并发,严重影响写性能。
分析SQL发现主要是一些大查询非常消耗数据库性能。
因此引入读写分离技术,将耗时的大查询放到备库上,降低主库压力,保证主库写业务的稳定。
技术选型
ADG 介绍
ADG 是Oracle11g企业版的新特性,需要单独的License.可以打开Physical standby至read only模式,standby可以用来做报表系统、查询、排序或Web站点。实时读写分离,以此来分担primary DB的压力。
ADG特性
- 实时查询:可以打开Physical standby值read only模式并实时应用redo data.
- 启用RMAN block-change tracking:用户利用RMAN在primary的增量备份恢复到standby,性能最高可提升20倍。
- Database只读模式
-
- 允许操作
● SELECT操作,包括需要大量临时段的查询
● ALTER SESSION,ALTER SYSTEM
● SET ROLE
● 调用Procedure
● 使用DBLINK写数据到远程数据库
● 通过DBLINK调用远程数据库的Procedure
● 在事务级别读一致性使用SET TRANSACTION READ ONLY
● 执行复杂的查询,如:GROUPING SET,WITH查询语句等
- 允许操作
-
- 不支持的操作
● 任何DML或DDL操作
● 访问本地序列的查询
● 对本地临时表的DML操作
- 不支持的操作
ADG启用
- 查询是否启用ADG
select database_role ,open_mode from v$database - 启用ADG
alter database open read only;
recover managed standby database disconnect using current logfile;
ADG 延迟原因
● CPU处理能力不足
● 网络延迟
● 带宽限制
技术实践
1.增加备库数据源
2.增加线程参数
增加一个线程参数来标志是否查备库
3.修改查询逻辑
备库查询前设置线程参数,查询结束后去除线程参数
4.修改获取数据库链接逻辑
根据线程参数是否为备库查询来获取不同的数据库链接
综上 就可以利用ADG来实现简单的读写分离。
都看到这里了 不妨点个赞吧!!!
如果有其他看法,欢迎在评论区交流!!!