行百里er 行百里er
首页
  • 分类
  • 标签
  • 归档
设计模式
  • JVM
  • Java基础
MySQL
Elastic Stack
Redis
  • Kafka
  • RocketMQ
分布式
Spring Cloud Alibaba
云原生
数据结构与算法
关于
GitHub (opens new window)

行百里er

Java程序员一枚
首页
  • 分类
  • 标签
  • 归档
设计模式
  • JVM
  • Java基础
MySQL
Elastic Stack
Redis
  • Kafka
  • RocketMQ
分布式
Spring Cloud Alibaba
云原生
数据结构与算法
关于
GitHub (opens new window)
  • 如何在 CentOS 7 下快速安装 MySQL 5.7
  • 【调优向】捅破窗户纸-入门MySQL调优之性能监控
  • MySQL 数据类型也可以优化!
  • 【调优向】MySQL调优必备-执行计划explain与索引数据结构推演
  • 【MySQL调优向】用好你的MySQL索引,让效率飞起!
  • 【调优向】关于 MySQL 查询的优化
  • 【MySQL系列】MySQL主从复制
  • 【MySQL系列】真香!基于ShardingSphere-JDBC的MySQL读写分离
    • MySQL读写分离
    • 如何实现读写分离
    • ShardingSphere-JDBC
      • Sharding-JDBC实现读写分离的核心概念
      • 主库
      • 从库
      • 主从同步
      • 负载均衡策略
    • 基于Sharding-JDBC的MySQL读写分离代码实现
      • 1. 主从复制主机配置:
      • 2. 创建SpringBoot项目,引入Jar包
      • 3. 配置文件
      • 4. 创建实体类和Mapper类
      • 测试
    • 最后
  • 关于MySQL主从复制的数据同步延迟问题
  • 【MySQL8入门之安装篇】CentOS7系统下安装MySQL8
  • 【MySQL 8】MySQL 5.7都即将停只维护了,是时候学习一波MySQL 8了!
  • 重要数据不能丢!MySQL数据库定期备份保驾护航!
  • MySQL
行百里er
2020-11-20
目录

【MySQL系列】真香!基于ShardingSphere-JDBC的MySQL读写分离

作者:行百里er

博客:https://chendapeng.cn (opens new window)

提示

这里是 行百里er 的博客:行百里者半九十,凡事善始善终,吾将上下而求索!

前文已经谈了关于MySQL的主从复制原理及如何搭建主从复制环境:

MySQL高可用之主从复制 (opens new window)

为了减轻每台MySQL主机的访问压力,还可以对MySQL进行读写分离,实际上,主从复制和读写分离一般就是联合使用的。

这篇水文来聊一下MySQL的读写分离。借助于一些数据库中间件,实现起来贼容易,一看就会!

# MySQL读写分离

MySQL读写分离基本原理是让master数据库处理写操作,slave数据库处理读操作。master将写操作的变更同步到各个slave节点。

MySQL读写分离能提高系统性能:

  • 物理服务器增加,机器处理能力提升。拿硬件换性能。
  • slave可以配置myiasm引擎,提升查询性能以及节约系统开销。
  • master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步的。
  • slave可以单独设置一些参数来提升其读的性能。
  • 增加冗余,提高可用性。

# 如何实现读写分离

MySQL官方提供了MySQL Proxy,但是已经不建议使用了:

与此同时它建议我们使用MySQL Router,再但是,MySQL Router不仅功能少,而且需要在应用程序代码中指定读/写的不同端口,在实际生产环境中应该没人会这样用。

其实,当前已经有不少比较不错的MySQL中间件,像shardingsphere-jdbc,mycat,amoeba等,这些都是比较不错的选择。

这里,我们使用Apache开源项目ShardingSphere的JDBC来实现MySQL的读写分离。

# ShardingSphere-JDBC

ShardingSphere的JDBC组件,称之为Sharding-JDBC,它是一个轻量级的Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

这就意味着,在项目中我们不需要额外安装什么软件,直接引入Jar包依赖,就可以实现数据库的分库分表、读写分离等。

说的直白一点,Sharding-JDBC就是包含了分库分表读写分离功能的JDBC,因此我们可以直接把Sharding-JDBC当做普通的JDBC来使用。

# Sharding-JDBC实现读写分离的核心概念

# 主库

添加、更新以及删除数据操作所使用的数据库,目前仅支持单主库。

# 从库

查询数据操作所使用的数据库,可支持多从库。

我们使用一主两从的MySQL数据库架构来实现主从复制和读写分离。

# 主从同步

将主库的数据异步的同步到从库的操作。由于主从同步的异步性,从库与主库的数据会短时间内不一致。

# 负载均衡策略

如果有多个从库,可以通过负载均衡策略将查询请求疏导至不同的从库。

# 基于Sharding-JDBC的MySQL读写分离代码实现

# 1. 主从复制主机配置:

序号 主机名称 IP地址 MySQL 虚拟机OS
1 mysql-master 192.168.2.158 5.7 CnetOS 7.8
2 mysql-slave-node01 192.168.2.159 5.7 CnetOS 7.8
3 mysql-slave-node02 192.168.2.157 5.7 CnetOS 7.8

主从同步的数据库为shardingsphere_demo:

log-bin=master-bin
binlog-format=ROW
server-id=1
binlog-do-db=shardingsphere_demo
1
2
3
4

shardingsphere_demo库有一个表叫laogong:

create table laogong(
	id int,
	name varchar(20),
	age int
);
1
2
3
4
5

# 2. 创建SpringBoot项目,引入Jar包

引入ShardingSphere的Jar包依赖:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>
1
2
3
4
5

还用到了druid连接池,mybatis,mysql驱动,这里不展示了。

# 3. 配置文件

配置是整个Sharding-JDBC的核心,是Sharding-JDBC中唯一与应用开发者打交道的模块。

配置模块也是Sharding-JDBC的门户,通过它可以快速清晰的理解Sharding-JDBC所提供的功能。

配置读写分离

根据前文主从复制主机的信息,配置如下:

spring:
  shardingsphere:
    # 数据源相关配置
    datasource:
      # 数据源名称
      names: master,s1,s2
      # MySQL master数据源
      master:
        # 数据库连接池
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.2.158:3306/shardingsphere_demo?serverTimezone=UTC
        username: root
        password: 123456
      # 两个slave数据源
      s1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.2.159:3306/shardingsphere_demo?serverTimezone=UTC
        username: root
        password: 123456
      s2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.2.157:3306/shardingsphere_demo?serverTimezone=UTC
        username: root
        password: 123456
    masterslave:
      load-balance-algorithm-type: round_robin
      name: ms
      master-data-source-name: master
      slave-data-source-names: s1,s2

    # 其他属性
    props:
      # 开启SQL显示
      sql.show: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 4. 创建实体类和Mapper类

实体类的代码这里不贴了,侮辱智商

Mapper类:

@Repository
@Mapper
public interface LaogongMapper {

    @Insert("insert into laogong(id, name, age) values(#{id}, #{name}, #{age})")
    public void addLaogong(Laogong laogong);

    @Select("select * from laogong where id=#{id}")
    public Laogong queryLaogong(Integer id);
}
1
2
3
4
5
6
7
8
9
10

# 测试

测试写入数据

向laogong表插入5条数据:

@Test
public void testMSInsert(){
    for (int i = 1; i <= 5; i++) {
        Laogong laogong = new Laogong();
        laogong.setId(i);
        laogong.setName("xblzer" + i);
        laogong.setAge(new Random().nextInt(30));
        laogongMapper.addLaogong(laogong);
    }
}
1
2
3
4
5
6
7
8
9
10

运行结果:

可以看到,插入的SQL语句,全部往master主库写入数据。

测试读取数据

读取id=1的数据,循环读取10次,看都从哪个库读取:

@Test
public void testMSQuery(){
    for (int i = 0; i < 10; i++) {
        Laogong laogong = laogongMapper.queryLaogong(1);
        System.out.println(laogong);
    }
}
1
2
3
4
5
6
7

结果验证:

只从S1、S2这两个从库中读取数据。

通过以上两个读取和写入数据的测试,可以可到,通过Sharding-JDBC真的很方便就帮我们实现了读写分离!这个时候我们可以说真香了!

# 最后

基于Sharding-JDBC的MySQL读写分离用起来真是很方便,而且ShardingSphere 已于2020年4月16日成为 Apache 软件基金会的顶级项目了,相信ShardingSphere会很快的火起来的。

我们项目上已经用这个做MySQL分库分表读写分离了。这次这篇文章只提到了读写分离,其实Sharding-JDBC还可以实现很多功能:

  • 数据分片(分库&分表)
  • 读写分离
  • 分布式事务
  • 分布式治理
  • 数据加密
  • ...

ShardingSphere已经形成了一个生态圈,其功能仍在不断完善。

本次导航结束,以上。

PS.本文所涉及的项目完整代码地址:

https://github.com/chendapengjava/JavaJourney/tree/master/code/shardingsphere


首发公众号 行百里er ,欢迎老铁们关注阅读指正。

#MySQL
上次更新: 2022/10/04, 18:14:30
【MySQL系列】MySQL主从复制
关于MySQL主从复制的数据同步延迟问题

← 【MySQL系列】MySQL主从复制 关于MySQL主从复制的数据同步延迟问题→

最近更新
01
重要数据不能丢!MySQL数据库定期备份保驾护航!
05-22
02
分布式事务解决方案之 Seata(二):Seata AT 模式
09-09
03
Seata 番外篇:使用 docker-compose 部署 Seata Server(TC)及 K8S 部署 Seata 高可用
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2023 行百里er | MIT License | 豫ICP备2022020385号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式