开发者社区> lxyangj> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

sharding-jdbc实现mysql读写分离

简介: 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。

参考资料

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何使用Navicat连接宝塔面板上安装的mysql数据库?
如何使用Navicat连接宝塔面板上安装的mysql数据库?
256 0
Navicat的安装与mysql数据库的连接保姆级教程
概述 上节写了mysql的安装与使用的详细方法,接下来为大家介绍Navicat的安装与mysql的连接。
41 0
MySQL数据库安装
通过RPM包安装MySQL数据库
2815 0
Linux环境下安装MySQL数据库示例教程
Linux环境对大多数SQL初学者还是比较陌生,今天给大家演示一下如何在Linux环境下安装MySQL数据库。
77 0
solr 入门 (安装 mysql数据库安装 )
solr  入门 (安装)     非数据库安装 ------------------------------------------------------------------------------------------------------------------------------ 1.
917 0
Windows安装两个mysql数据库步骤
由于新旧项目数据库版本差距太大,编码格式不同,引擎也不同,所以只好装两个数据库。 本次安装两个mysql数据库,版本分别是4.0.18,5.5.36。都是可执行文件直接安装。 本机上之前已经安装完5.5.36版本,单个数据库问题不大,一步一步下去便安装完毕。 另一个版本也直接点击下一步一直安装,要注意的地方是,另外找一个目录。比如: 5.5.36: d:\mysq
1210 0
CentOS 6.5系统上安装MySQL数据库
1、查看系统是否安装了MySQL      使用命令:      #rpm -qa | grep mysql 2、卸载已安装的MySQL       卸载mysql命令如下:        #rpm -e --nodeps  mysql-libs-5.
765 0
mysql数据库的安装以及常见优化设置
原文:mysql数据库的安装以及常见优化设置   本文根据优才网课程整理,面向web开发者,内容以实用为主,专业DBA可以绕行。 如果你在大公司,可能有专门的DBA来做这些事情,如果你在一个小公司当架构师或者技术总监,或者你自己创业,那DBA的活你也得干了。
974 0
windows 安装Go 环境 搭建Mysql数据库连接
在linux 上做go 环境搭建 已经可以了。并且 连接上了 mysql 数据库。   但是 开发 还是 在windows 上面的比较多。所以要研究下 windows 下如何弄 。   需要使用一个 mingw 的环境 。 要使用make 命令     官网: http://www.mingw.org/   下载   http://sourceforge.net/proj
1381 0
+关注
12
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载