前言
在进行阅读本文当中的内容之前首先你得要有主从复制的 MySQL 环境,可参考4.这篇MySQL主从复制与分库分表读取分离稳了!进行搭建
读写分离
官方文档:https://shardingsphere.apache.org/document/5.0.0-beta/cn/user-manual/shardingsphere-jdbc/configuration/spring-boot-starter/readwrite-splitting
然后我们在将 application.properties 替换成官方文档当中给出的读写分离相关配置即可,配置项说明在官方文档当中都说明了,博主就是将说明的内容替换成了真实的具体的内容,供参考即可:
创建表
t_order:
代码语言:sql复制CREATE TABLE `t_order` (
`tid` bigint(20) NOT NULL,
`tname` varchar(255) DEFAULT NULL,
`goods_id` bigint(20) DEFAULT NULL,
`tstatus` varchar(255) DEFAULT NULL,
PRIMARY KEY (`tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
代码语言:text复制# 配置真实数据源
spring.shardingsphere.datasource.names=master,slave01
# 配置第 1 个数据源
spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.master.url=jdbc:mysql://127.0.0.1:3307/test?serverTimezone=GMT+8
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=root
# 配置第 2 个数据源
spring.shardingsphere.datasource.slave01.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave01.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.slave01.url=jdbc:mysql://127.0.0.1:3308/test?serverTimezone=GMT+8
spring.shardingsphere.datasource.slave01.username=root
spring.shardingsphere.datasource.slave01.password=root
# 主键生成策略
spring.shardingsphere.rules.readwrite-splitting.data-sources.pr_ds.write-data-source-name=master
spring.shardingsphere.rules.readwrite-splitting.data-sources.pr_ds.read-data-source-names=slave01
spring.shardingsphere.rules.readwrite-splitting.data-sources.pr_ds.load-balancer-name=round-robin
spring.shardingsphere.rules.readwrite-splitting.load-balancers.round-robin.type=ROUND_ROBIN
# 打印执行sql
spring.shardingsphere.props.sql-show=true
如上配置文件当中的负载均衡算法博主采用的是官方当中内置提供的,可配置属性官方当中给出的可以是无,所以博主这里去掉了,readwrite-splitting-data-source-name
可以先使用内置的也就是 pr_ds
如果后面要做读写分离与分片的话可能就需要自行修改了,其它的就没啥东西就在解释的了:
配置完毕之后,然后我们运行插入数据的测试代码,运行结果如下:
发现,都是往主库当中进行写的,那么就说明我们配置的读写分离已经生效了,然后我们在任意运行一个查询语句看看它是否是去从库当中进行查询即可:
发现,发送的 SQL 语句是去从,slave01 当中进行查询了说明已经成功了。
分片
读写分离的情况下进行分片,就是分表存储操作,那么该如何实现呢,当然了,要实现读写分离加分片前提条件就是你需要上一面当中所搭建好的读写分离结构,然后就是把博主之前讲解的分片操作相关配置拿进来即可,基于上一面当中的 application.properties 的内容在添加分片相关的配置,分片配置如下:
代码语言:text复制# 负载均衡算法配置
spring.shardingsphere.rules.readwrite-splitting.load-balancers.round_robin.type=ROUND_ROBIN
# 配置t_order真实表规则
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=ds0.t_order_$->{0..1}
# 配置分表策略 主键 分片算法
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-column=tid
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-algorithm-name=table-inline
# 配置 分片算法
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.type=INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.props.algorithm-expression=t_order_$->{tid % 2}
# 主键盘生成策略
spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.column=tid
spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.key-generator-name=snowflake
spring.shardingsphere.rules.sharding.key-generators.snowflake.type=SNOWFLAKE
spring.shardingsphere.rules.sharding.key-generators.snowflake.props.worker-id=1
然后需要修改一下读写分离的数据源名称即可:
如上的配置含义就是说在主从的模式下,它是一个整体,因为你改变了主当中的信息从库当中会自动进行同步,所以就是一个整体,以后如果你还有其它的主从数据库,你在配置一个即可,例如,我现在配置的是 test, 如果以后你有一个 ds0 你就在配置一下数据源关于 ds0 的即可。
测试
插入数据:
查询数据:
ok,到了这里基本上差不多就这些内容了,插入是往主库当中进行插入的,查询是从从库当中进行查询的,已经成功了。
最后
本期结束咱们下次再见