如何基于Sharding-JDBC实现GaussDB在客户端应用的读写分离
1.数仓实践丨主动预防-DWS关键工具安装确认2.一条SQL如何被MySQL架构中的各个组件操作执行的?3.GaussDB(DWS)网络流控与管控效果4.GaussDB(DWS)字符串处理函数返回错误结果集排查5.从缓存的本质说起,说服技术大佬用Redis6.这年头怕数据泄露?全密态数据库:无所谓,我会出手7.华为云新一代分布式数据库GaussDB,给世界一个更优选择8.GaussDB技术解读丨高级压缩9.掌数科技携手华为云GaussDB,助力金融科技创新,联合打造行业标杆10.一文带你全面了解openGemini11.GaussDB(for Redis)多租户:读写权限控制和数据库隔离的完美融合12.5分钟迁移关系型数据库到图数据库13.数仓现网案例丨超大结果集接收异常14.DWS轻量化更新黑科技:宽表加工优化15.数据库行业需要什么样的人才?高校老师这样说16.数仓性能优化:倾斜优化-表达式计算倾斜的hint优化17.GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具18.带你认识数仓的监控系统TopSQL19.带你走进数仓大集群内幕丨详解关于作业hang及残留问题定位20.实时入库不用愁,HStore帮分忧21.openGauss数据库在CentOS上的安装实践22.揭秘华为云GaussDB(for Redis)丨大key治理23.GaussDB(DWS)函数不同写法引发的结果差异24.数仓中典型的几种不下推语句整改案例25.GaussDB技术解读系列之应用无损透明(ALT)26.华为云GaussDB(for Influx)单机版上线,企业降本增效利器来了27.数仓备份经验分享丨详解roach备份原理及问题处理套路28.中国云数据仓库,双第一!29.华为云GaussDB打造最可信的数据库,给世界一个更优选择30.GaussDB技术解读系列:高级压缩之OLTP表压缩31.十年磨一剑的华为云GES,高明在哪32.使用DWS集群,用户被锁定如何解锁33.GaussDB技术解读系列:高安全之密态等值34.GaussDB技术解读:应用无损透明(ALT)35.数仓资源管控理论已掌握,是时候实战了36.row_number函数的不稳定性37.GaussDB技术解读丨数据库迁移创新实践38.聊聊GaussDB AP是如何执行SQL的39.Navicat 携手华为云GaussDB,联合打造便捷高效的数据库开发和建模工具方案40.GaussDB技术解读系列丨运维自动驾驶探索41.一次性全讲透GaussDB(DWS)锁的问题42.GaussDB(DWS)性能调优:Sort+Groupagg聚集引起的性能瓶颈案例43.多主架构:VLDB技术论文《Taurus MM: bringing multi-master to the cloud》解读44.GaussDB(for Redis)游戏实践:玩家下线行为上报45.一文详解数据仓库的物理细粒度备份恢复46.华为云HBase冷热分离最佳实践47.四问复合索引,让你的数据查询速度飞起48.GaussDB(DWS)案例丨MERGE场景下语句不下推引起的性能瓶颈问题49.如何强制SQL走性能更优的hash join50.如何使用GaussDB(DWS)的本地临时表进行数据处理51.华为云GaussDB亮相金融业数据库技术大会52.2个数仓中不等值关联优化案例53.数仓实时场景下表行数估算不准确引起的的性能瓶颈问题案例54.详解GuassDB数据库权限命令:GRANT和REVOKE55.DWS临时内存不可用报错: memory temporarily unavailable56.华为云GaussDB城市沙龙活动走进安徽,助力金融行业数字化转型57.理论+应用,带你了解数据库资源池58.人人用数不用愁,动态数据脱敏为您解忧59.实例讲解数据库的数据去重60.数仓实践丨表扫描时过滤行数过多引起的性能瓶颈问题61.实例详解构建数仓中的行列转换62.Proxy下的Prepare透传,让GaussDB(for MySQL)更稳固,性能更卓越63.浅析KV存储之长尾时延解决办法64.实例讲解数据库的定义重载函数65.详解数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE66.华为云GaussDB助力工商银行、华夏银行斩获“十佳卓越实践奖”67.Navicat 基于 GaussDB 主备版的快速入门68.数仓实时算子难以观测,快来试试算子级监控吧69.列举数据库缓存使用场景实例和命令速查表70.带你认识多模数据库GeminiDB架构与应用实践71.3招解决时序数据高基数难题,性能多维度提升!72.数仓性能调优:row_number() over(p)-rn=1性能瓶颈发现和改写套路73.数仓实践丨常量标量子查询做全连接导致整体慢74.细说GaussDB(DWS)的2种查询优化技术75.细说SQL与ETL之间的小秘密76.从概念到实践,带你掌握层次递归查询77.GeminiDB Cassandra接口新特性PITR发布:支持任意时间点恢复78.你的JoinHint为什么不生效79.六步走向无忧,华为云数据库高可用的秘密武器80.数仓调优实践丨SQL改写消除相关子查询81.GaussDB(for MySQL)新特性TDE发布:支持透明数据加密82.详解GaussDB(DWS)通信安全的小妙招:连接认证机制83.GaussDB(for MySQL) RegionlessDB发布:全球数据库技术84.5分钟带您了解DRS录制回放85.ICDM'23 BICE论文解读:基于双向LSTM和集成学习的模型框架86.数仓如何递归查询视图依赖87.支撑核心系统分布式改造,GaussDB为江南农商银行筑稳根基88.近6成金融机构的选择!华为云GaussDB加快金融核心系统转型89.GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!90.2023年度十佳课题公布:华为云GaussDB获权威认可91.详解如何在数仓中搭建细粒度容灾应用92.对话苏光牛:国内数据库市场已进入关键转折点,2024年或是分水岭93.GaussDB通信运维:详解stream连接池设计原理94.GaussDB(for MySQL) Serverless全面商用:无感弹性,极致性价比95.华为云GaussDB支撑农行超级网银业务,性能和稳定性备受认可96.实例详解数据库的游标管理97.数仓实践丨从CU入手优化HStore表98.数仓的等待视图中,为什么会有Hashjoin-nestloop
99.如何基于Sharding-JDBC实现GaussDB在客户端应用的读写分离
100.如何迅速并识别处理MDL锁阻塞问题摘要:使用sharing-jdbc中间件实现GaussDB读写分离操作,在服务器资源吃紧与高并发场景下可以考虑采用读写分离架构减轻负载。
本文分享自华为云社区《GaussDB读写分离最佳实践》,作者: HuaweiCloudDeveloper。
1 问题现象
在通常的TP业务中,大多数数据使用都是select查询操作,而修改数据的操作(update, insert, delete)仅占很少的一部分。如果读,写数据操作都放在主库上执行,在服务器资源紧张与业务流量上升的情况下,有可能引发主节点性能瓶颈。所以需要对大量的读数据(select查询)操作进行分流,数据库读写分离技术应运而生。
GaussDB读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
2 技术背景
在电商项目中,在使用数据库时有些采用主从复制、读写分离的架构。对数据库的读和写都在同一个数据库服务器中,特定业务场景中不能满足实际需求。无论在安全性、高可用性还是高并发等各个方面都是不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发能力。
3 处理过程
3.1 GaussDB JDBC读写分离参考配置方案
为实现读写分离,您需要结合第三方读写分离框架配置2个jdbc-url数据源,1个连接集群所有DN节点并设置targetServerType=master,一个连接只读备节点。这样可以实现写操作时,自动连接到主节点,需要只读操作时,自动连接到只读备节点。
读写主机的JDBC参考连接串:
jdbc:postgresql://{DN1_IP:PORT,DN2_IP:PORT,DN3_IP:PORT}/{db_name}?targetServerType=master& {param=value}
只读备机的JDBC参考连接串:
jdbc:postgresql://{DN1_IP:PORT,DN2_IP:PORT,DN3_IP:PORT}/{db_name}?targetServerType= slave& {param=value}
3.2 GaussDB集中式Sharding-JDBC读写分离实践
在数据库的高并发读写场景中,我们会采用读写分离技术。读写分离指的是利用数据库主从技术(把数据复制到多个节点中),分散读多个库以支持高并发的读,而写只在master库上。GaussDB的主从技术只负责对数据进行复制和同步,而读写分离技术需要业务应用自身去实现。
有些中间件可以帮助我们快速的实现该功能,本案例使用Sharding-JDBC来帮助我们快速的实现读写分离。 Sharding-JDBC会根据SQL语句中的操作类型(读或写)来决定将请求路由到哪个数据库服务器上。具体而言,如果请求是读请求,Sharding-JDBC会将其路由到只读数据库节点上;如果请求是写请求,Sharding-JDBC会将其路由到写数据库节点上。
在具体客户业务实现中,不同的读写分离中间件原理大同小异,案例都可参考。
备注:shardingshpere低版本JDBC连接串不支持多IP格式,已知不支持的有3.1,4.1,已知支持的有5.1;
4 处理结果
以下案例为springboot2.6.5+sharding-jdbc5.2.0+mybatis-plus3.5.9+GaussDB集中式505.2实现;
案例操作的表定义:
CREATE TABLE emp ( empno int , empname varchar(128) ); INSERT INTO emp VALUES (1, 'q1'); INSERT INTO emp VALUES (2, 'q2'); INSERT INTO emp VALUES (3, 'q3'); INSERT INTO emp VALUES (4, 'q4'); INSERT INTO emp VALUES (5, 'q5'); INSERT INTO emp VALUES (6, 'q6'); INSERT INTO emp VALUES (7, 'q7'); INSERT INTO emp VALUES (8, 'q8'); INSERT INTO emp VALUES (9, 'q9');
4.1 JDBC数据源配置
以下配置文件中sharding-jdbc不同版本读写分离配置可能有差异,重点关注主备数据源配置即可;
当前集中式集群中xxx.11为主节点,xxx.182,xxx.152为备节点
读写配置
jdbc-url: "jdbc:postgresql://xxx.11:30100,xxx.182:30100,xxx.152:30100/hr?targetServerType=master&{param=value}"
只读配置:
jdbc-url: "jdbc:postgresql://xxx.182:30100/hr?{param=value}" spring: shardingsphere: datasource: names: master,slave1,slave2 ## 数据源别名 master: type: com.zaxxer.hikari.HikariDataSource driver-class-name: org.postgresql.Driver jdbc-url:jdbc:postgresql://xxx.11:30100,xxx.182:30100,xxx.152:30100/hr?targetServerType=master&logger=Slf4JLogger" username: hr password: "xxx" slave1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: org.postgresql.Driver jdbc-url: "jdbc:postgresql://xxx.182:30100/hr?logger=Slf4JLogger" username:hr password: "xxx" slave2: type: com.zaxxer.hikari.HikariDataSource driver-class-name: org.postgresql.Driver jdbc-url: "jdbc:postgresql://xxx.152:30100/hr?logger=Slf4JLogger" username: hr password: "xxx" rules: readwrite-splitting: data-sources: master-slave: props: auto-aware-data-source-name: master load-balancer-name: round_robin read-data-source-names: slave1,slave2 write-data-source-name: master props: sql-show: true shardingshpere <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> <version>5.2.0</version> </dependency>
4.2 测试写入业务
执行一个只有写入的业务,在日志中可以看到该语句在xxx.11(主节点)这个读写节点上执行并成功插入,实现了写分离。

4.3 测试只读业务
执行一个只有查询的业务,在日志中可以看到该语句在xxx.182(备节点)这个只读节点上执行并成功查询,实现了读分离。

4.4 测试读写混合业务(无事务)
执行一个读写混合业务,但是没有事务控制,先插入数据再查询,在日志中可以看到插入数据在xxx.11(主节点)节点上执行,读取数据在xxx.182(slave0)或 xxx.152( slave1)上执行,实现了读写分离。

4.5 测试读写混合业务(有事务)
执行一个读写混合业务,但是整个业务有事务控制,先插入数据再查询,在日志中可以看到插入数据在xxx.11(主节点)节点上执行,读取数据在xxx.182(备节点)上执行,当一个事物中有读有写时,不进行读写分离。

4.6 测试总结
当业务中有只写操作时,自动读取主节点;
当业务中只有读操作时,自动读取只读备节点;
当业务中有读写操作但是没事务时,自动根据读写语句进行读写分离;
当一个事务中有读写操作并且有事务控制时,自动读取主节点;
5 简单总结
经过上面的简短实验,使用sharing-jdbc中间件实现GaussDB读写分离操作,在服务器资源吃紧与高并发场景下可以考虑采用读写分离架构减轻负载。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 我与微信审核的“相爱相杀”看个人小程序副业
2022-01-20 面对 Log4j2 漏洞,安全人都做了什么?
2022-01-20 不会使用Spring的配置文件,赶紧把这个甩给他
2022-01-20 一个BPMN流程示例带你认识项目中流程的生命周期
2022-01-20 Serverless,引领云计算下一个阶段
2021-01-20 NanoDet:这是个小于4M超轻量目标检测模型
2021-01-20 透过现象看本质:Java类动态加载和热替换
2021-01-20 详解MySQL执行事务的语法和流程