sharding-jdbc实现mysql读写分离

289 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

前言

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

读写分离

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

  • 环境说明:Spring boot:2.1.11.RELEASE,sharing-jdeb:4.1.1

创建项目。

image.png

引入依赖

<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>

修改配置文件。

# 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。