介绍在家里做的点心的网站,做软件常用的网站,网站ip备案,网站前端页面设计介绍
我的上一篇文章实现了mysql的主从复制结构#xff0c;今天这篇继续将如何实现读写分离。
读写分离是指#xff1a;针对数据库的写操作#xff08;插入、更新、删除等#xff09;访问主数据库#xff0c;读操作访问从数据库。
因为一般网站的读请求的数量是远远大于…介绍
我的上一篇文章实现了mysql的主从复制结构今天这篇继续将如何实现读写分离。
读写分离是指针对数据库的写操作插入、更新、删除等访问主数据库读操作访问从数据库。
因为一般网站的读请求的数量是远远大于写请求的所以读写分离模式往往可以有效的提升系统的性能的。
读写分离属于应用层面上的实现思路也比较简单就是手动解析数据库请求如果是读请求就将其转发到从数据库如果是写请求就将其转发到主数据库。不过要写好还是比较难的涉及到对JDBC的二次封装、负载均衡等。目前市面上已有比较成熟的方案比如MySQL Router官方Apache shardingsphere 等。
Apache shardingsphere 是目前比较流行的实现方式本篇文章也使用该框架实现读写分离。
Apache shardingsphere 简介
Apache ShardingSphere 是一款分布式的数据库生态系统 可以将任意数据库转换为分布式数据库并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。
功能有读写分离数据分片、分布式事务、数据迁移、数据加密、联邦查询、影子库等功能。
主要有以下两部分构成
ShardingSphere-JDBC ShardingSphere-JDBC 定位为轻量级 Java 框架在 Java 的 JDBC 层提供的额外服务。是在开发时需要引入的框架。
ShardingSphere-Proxy ShardingSphere-Proxy 定位为透明化的数据库代理端通过实现数据库二进制协议对异构语言提供支持。
官网地址Apache ShardingSphere
针对 Springboot 项目的实现
引入依赖
dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdshardingsphere-jdbc-core-spring-boot-starter/artifactIdversion5.1.1/version
/dependency注 这个依赖不止有一种至少有三种都可以实现读写分离可能需要配置的东西不太一样本文方的是Apache 官方的比较新的版本老的版本坐标中间没有core。
在application.yaml文件中配置
spring:shardingsphere:props:sql-show: true 显示打印sql语句datasource: # 配置主从数据库names: master, slave # 主从数据库的名字自定义master: # 数据库的详细配置名字跟上面的名字对应username: rootpassword: url: jdbc:mysql://localhost:3306/db_name?serverTimezoneUTCuseSSLfalsetype: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverslave:username: rootpassword: url: jdbc:mysql://localhost:3307/db_name?serverTimezoneUTCuseSSLfalsetype: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverrules: # 在这里配置读写分离、数据分片等功能的规则readwrite-splitting: # 读写分离配置data-sources: # 配置数据源read-write-datasource:type: Static # 静态配置配置的选项来自同一个YAML文件的datasource参数props:write-data-source-name: master # 配置写库的名字read-data-source-names: slave # 读库的配置多个从库之间使用逗号进行隔开load-balancer-name: round-robin # 多个读库之间采用的负载均衡策略这里是轮询策略load-balancers:round-robin:type: ROUND_ROBINmode:type: Memoryrepository:type: JDBC这样就配置完了其他业务逻辑代码不需要更改就跟使用单数据库时一样正常写mapper、service、controller 等代码。
负载均衡
验证
本人首先写了一个查询管理员账号的读操作的Controller验证读请求是否被转发到从库上去。 在浏览器上输入请求地址查看控制台日志 可以看到日志输出的是 slave读请求顺利转发到从数据库上。 继续写一个插入管理员表的api验证写请求 日志显示请求的是主库验证成功。