1 概述
本文讲述了如何使用MyBatisPlus
+ShardingSphereJDBC
进行读写分离,以及利用MySQL
进行一主一从的主从复制。
具体步骤包括:
-
MySQL
主从复制环境准备(Docker
) -
搭建
ShardingShpereJDBC
+MyBatisPlus
+Druid
环境 -
测试
2 环境
-
OpenJDK 17.0.3
-
Spring Boot 2.7.0
-
MyBatis Plus 3.5.1
-
MyBatis Plus Generator 3.5.2
-
Druid 1.2.10
-
ShardingSphereJDBC 5.1.1
-
MySQL 8.0.29
(Docker
)
3 一些基础理论
3.1 读写分离
读写分离,顾名思义就是读和写分开,更具体来说,就是:
-
写操作在主数据库进行
-
读操作在从数据库进行
使用读写分离的根本目的就是为了提高并发性能,如果读写都在同一台MySQL
上实现,相信会不如一台MySQL
写,另外两台MySQL
读这样的配置性能高。另一方面,在很多时候都是读操作的请求要远远高于写操作,这样就显得读写分离非常有必要了。
3.2 主从复制
主从复制,顾名思义就是把主库的数据复制到从库中,因为读写分离之后,写操作都在主库进行,但是读操作是在从库进行的,也就是说,主库上的数据如果不能复制到从库中,那么从库就不会读到主库中的数据。严格意义上说,读写分离并不要求主从复制,只需要在主库写从库读即可,但是如果没有了主从复制,读写分离将失去了它的意义。因此读写分离通常与主从复制配合使用。
因为本示例使用的是MySQL
,这里就说一下MySQL
主从复制的原理,如下图所示:
工作流程如下:
-
主库修改数据后,将修改日志写入
binlog
-
从库的
I/O
线程读取主库的binlog
,并拷贝到从库本地的binlog
中 -
从库本地的
binlog
被SQL
线程读取,执行其中的内容并同步到从库中
3.3 数据库中间件简介
数据库中间件可以简化对读写分离以及分库分表的操作,并隐藏底层实现细节,可以像操作单库单表那样操作多库多表,主流的设计方案主要有两种:
-
服务端代理:需要独立部署一个代理服务,该代理服务后面管理多个数据库实例,在应用中通过一个数据源与该代理服务器建立连接,由该代理去操作底层数据库,并返回相应结果。优点是支持多语言,对业务透明,缺点是实现复杂,实现难度大,同时代理需要确保自身高可用
-
客户端代理:在连接池或数据库驱动上进行一层封装,内部与不同的数据库建立连接,并对
SQL
进行必要的操作,比如读写分离选择走主库还是从库,分库分表select
后如何聚合结果。优点是实现简单,天然去中心化,缺点是支持语言较少,版本升级困难
一些常见的数据库中间件如下:
-
Cobar
:阿里开源的关系型数据库分布式服务中间件,已停更 -
DRDS
:脱胎于Cobar
,全称分布式关系型数据库服务
-
MyCat
:开源数据库中间件,目前更新了MyCat2
版本 -
Atlas
:Qihoo 360
公司Web
平台部基础架构团队开发维护的一个基于MySQL
协议的数据中间层项目,同时还有一个NoSQL
的版本,叫Pika
-
tddl
:阿里巴巴自主研发的分布式数据库服务 -
Sharding-JDBC
:ShardingShpere
的一个子产品,一个轻量级Java
框架
4MySQL
主从复制环境准备
看完了一些基础理论就可以进行动手了,本小节先准备好MySQL
主从复制的环境,基于Docker
+MySQL
官方文档搭建。
4.1 主库操作
4.1.1 拉取镜像并创建容器运行
docker pull mysql
docker run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name master mysql
docker exec -it master /bin/bash
在主库中进行更新镜像源,安装vim
以及net-tools
的操作:
cd /etc/apt
echo deb http://mirrors.aliyun.com/debian/ buster main non-free contrib deb-src http://mirror