sharding-jdbc实现mysql读写分离

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Spring boot2.x整合sharding-jdbc4.1.1实现mysql读写分离

概述

今天开始整理一下分库分表的笔记,以供后续复习。为什么要分库分表就不在赘述。在以前的公司项目的多数据源分库分表都是自研,利用spring的IOC和AOP实现多数据源的自由切换,完成分库分表、读写分离。之所以自研也不是因为重复造轮子,只是想能贴合自己公司项目的业务以及从技术角度满足自己的实际需求,达到熟练可配置的效果。今天和以后的文章要说的并不是我们自研的产品,自研即使说了也不一定适用所有公司,而且也不可能通过看这几篇文章就能够完全实现一个自研的产品,要说的是通过比较成熟和开源的分库分表产品ShardingSphere。

ShardingSphrer是当当网开源的产品,后来免费送给aphach组织进行孵化,是目前比较流行的客户端进行分库分表的产品,【mycat也是一款分库分表的产品,但是是基于服务端的】。现更名为Apache ShardingSphere,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

更多介绍请参看官网http://shardingsphere.apache.org/index_zh.html

通过以上简单的介绍可以知道sharding sphere有很多款产品,我们要介绍的是其中的一款sharding-jdbc在项目中的如何使用,当然具体使用和配置方式官网也有详细的介绍,可进行对比参考https://shardingsphere.apache.org/document/4.1.1/en/overview/

场景

首先分析一下分库分表的数据场景:

  • 读写分离
  • 分库不分表
  • 分库不分表,读写分离
  • 分表不分库
  • 分表不分库,读写分离
  • 分库分表
  • 分库分表,读写分离
  • 广播表
  • 广播表,读写分离
  • 专库专表
  • 专库专表读写分离

因为读写分离其实是在我们实际使用的过程中比较基础的操作,所以我们在每个数据场景都增加一个读写分离的场景配置。

读写分离

  • 前情说明:在练习的过程中我们可以只用安装一个数据库实例,我们应用中配置的主从数据库信息都可以是同一个数据库,关于怎么区分读写的时候是使用的那个数据库配置,在idea控制台打印的输出信息中可以进行区分,后面会进行具体的截图说明。
  • 环境说明:Spring boot:2.1.11.RELEASE,sharing-jdeb:4.1.1
  • 创建项目

image.png

pom.xml

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency></dependencies>

application.properties

  • 一主两从
# mybatis plus配置
mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml
mybatis-plus.type-aliases-package=com.spring.demo.xxx.entity
mybatis-plus.global-config.db-config.id-type=auto
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false
#返回map时,true:当查询数据为空时字段返回为null;false:不加这个查询数据为空时,字段将被隐藏
mybatis-plus.configuration.call-setters-on-nulls=false
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# sharding jdbc 读写分离
spring.shardingsphere.datasource.names=master,slave0,slave1
# 主数据连接信息
spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.url=jdbc:mysql://yourdburl:3306/yourdbname?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull
spring.shardingsphere.datasource.master.username=yourdbusername
spring.shardingsphere.datasource.master.password=yuordbpassword
# 第一个从数据连接信息
spring.shardingsphere.datasource.slave0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave0.url=jdbc:mysql://yourdburl:3306/yourdbname?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull
spring.shardingsphere.datasource.slave0.username=yourdbusername
spring.shardingsphere.datasource.slave0.password=yourdbpassword
# 第二个从数据库连接信息
spring.shardingsphere.datasource.slave1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave1.url=jdbc:mysql://yourdburl:3306/yourdbname?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull
spring.shardingsphere.datasource.slave1.username=yourdbusername
spring.shardingsphere.datasource.slave1.password=yourdbpassword
# 指定主从数据库配置
# 默认数据库,可配置可不配置
spring.shardingsphere.sharding.default-data-source-name=master
# 主从复制中的master数据库节点
spring.shardingsphere.masterslave.master-data-source-name=master
# 主从复制中的slave数据库节点,多个用逗号分隔
spring.shardingsphere.masterslave.slave-data-source-names=slave0,slave1
# 读请求的时候,多个从节点的负载均衡方式,这里是轮询的方式
spring.shardingsphere.masterslave.load-balance-algorithm-type=round_robin
# 指定主从的名称,可配置可不配置
spring.shardingsphere.masterslave.name=ms
# 打印sharding的数据库信息,可以看出每次执行的sql语句是选用的哪个数据库
spring.shardingsphere.props.sql.show=true

启动类

  • 启动类的@SpringBootApplication需要过滤掉默认的数据配置,这样才能使用sharding-jdbc的代理数据源
@SpringBootApplication(exclude= {DruidDataSourceAutoConfigure.class, DataSourceAutoConfiguration.class})
  • 省略掉controller、service、dao、mapper的编写,编写方法和单数据库的编写方式一样

启动项目

  • 配置的三个数据库进行了初始化

image.png

  • 两次查询都通过sharding打印的sql语句可以看出是访问不同的slave数据库

image.png

  • 保存的时候选择的是master数据库

image.png

以上是读写分离的从0到1的配置过程。本实例省略了搭建数据库的部分,若有不清楚的可以通过baidu进行搜索相关文章即可。其中选用的连接池是druid,关于druid的生产配置后续在通过其他文章进行介绍,这片主要专注于sharding-jdbc。

参考资料

后续用新的篇章写其他的场景配置,待续......

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
24天前
|
负载均衡 监控 关系型数据库
MySQL 官宣:支持读写分离了!!
【10月更文挑战第8天】MySQL的读写分离功能显著提升了数据库性能、可用性和可靠性。通过将读写操作分配至不同服务器,有效减轻单个服务器负载,提高响应速度与吞吐量,并增强系统稳定性。此外,它还支持便捷的扩展方式,可通过增加只读服务器提升读操作性能。实现读写分离的方法包括软件层面(如使用数据库中间件)和硬件层面(使用独立服务器)。使用时需注意数据一致性、负载均衡及监控管理等问题。
|
10天前
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
18 1
|
20天前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
58 0
|
20天前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
29 0
|
20天前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
38 0
|
2月前
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
3月前
|
前端开发 关系型数据库 MySQL
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
这篇文章讨论了`com.mysql.jdbc.Driver`和`com.mysql.cj.jdbc.Driver`两个MySQL驱动类的区别,指出`com.mysql.jdbc.Driver`适用于MySQL 5的`mysql-connector-java`版本,而`com.mysql.cj.jdbc.Driver`适用于MySQL 6及以上版本的`mysql-connector-java`。文章还提到了在实际使用中如何根据MySQL版本选择合适的驱动类。
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
|
3月前
|
关系型数据库 MySQL Java
【Azure 应用服务】App Service 无法连接到Azure MySQL服务,报错:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
【Azure 应用服务】App Service 无法连接到Azure MySQL服务,报错:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
163 0
|
3月前
|
SQL 关系型数据库 MySQL
mysql读写分离,主从同步
本文介绍了如何在Laravel项目中配置数据库读写分离,并实现MySQL主从同步。主要步骤包括:在`config/database.php`中设置读写分离配置;为主机授予从机访问权限;配置各MySQL服务器的`/etc/my.cnf`文件以确保唯一的`server-id`;以及通过SQL命令设置主从关系并启动从服务。文章还针对一些常见错误提供了排查方法。最后通过验证确认主从同步是否成功。[原文链接](https://juejin.cn/post/6901581801458958344)。版权所有者为作者佤邦帮主,转载请遵循相关规定。
|
13天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
49 3
Mysql(4)—数据库索引