前言:
1.基础的环境介绍请移步ShardingSphere应用专题–4.1.1版本–sharding jdbc环境搭建(四)
你可以同时打开两个页面,避免因查找原始配置上下翻动。
2.ShardingSphere官方文档更新不及时,很容易踩坑。贴出的4.x版本文档实际是4.0.1版本的,如果你准备使用该版本可以参考官方文档。本文使用的是此时最新的正式版本4.1.1版本,配置与官方文档配置不同。事实上,源码中有非常详细的版本配置文档,本文也是参考4.1.1 tag的源码配置。
3.ShardingSphere各版本差异很大,甚至核心依赖的包名都不一样,使用时,一定要确认使用哪个版本,目前调研的结果:3.x、4.0.1、4.1.1、5.0.0-alpha都存在很大的配置差异
1.pom添加ShardingSphere依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
2.添加读写分离环境配置application-sharding-rw.properties
#打印sql
spring.shardingsphere.props.sql.show=true
#设置单次请求可适用的最大线程数,以决定是线程限制还是内存限制。增大该参数可提高数据库元数据加载速度(默认为1)
spring.shardingsphere.props.max.connections.size.per.query=3
spring.shardingsphere.datasource.names=master,slave
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://localhost:4406/mydb?characterEncoding=utf-8
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=111
spring.shardingsphere.datasource.slave.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.slave.jdbc-url=jdbc:mysql://localhost:5506/mydb?characterEncoding=utf-8
spring.shardingsphere.datasource.slave.username=root
spring.shardingsphere.datasource.slave.password=111
#指定master为主库,slave为它的从库
spring.shardingsphere.sharding.master-slave-rules.master0.master-data-source-name=master
spring.shardingsphere.sharding.master-slave-rules.master0.slave-data-source-names=slave
配置说明:
1.spring.shardingsphere.datasource.names 这里的数据源名称是自定义的
2.在配置数据源的基本属性时,标注的位置必须是1中定义的
3.本文选的连接池是HikariDataSource,如果使用的是druid,这里的配置就不是jdbc-url,而是url。且不同数据库连接池,对应的start的兼容度可能不一样,需要自己调试。springboot官方推荐使用Hikari
4.这里是主从配置的名称,同样是自定义的,你可以配置多个主从复制的配置
5.和1中的数据源名称保持一致,否则报错
3.代码测试
(1)插入
shardingspere的log会打印出逻辑sql和实际执行的sql,可以看到最终走的是主库
(2)查询
查询走的是从库
4详细示例
#省略数据源配置,与数据分片一致
spring.shardingsphere.sharding.master-slave-rules.<master-slave-data-source-name>.master-data-source-name= #主库数据源名称
spring.shardingsphere.sharding.master-slave-rules.<master-slave-data-source-name>.slave-data-source-names[0]= #从库数据源名称列表
spring.shardingsphere.sharding.master-slave-rules.<master-slave-data-source-name>.slave-data-source-names[1]= #从库数据源名称列表
spring.shardingsphere.sharding.master-slave-rules.<master-slave-data-source-name>.slave-data-source-names[x]= #从库数据源名称列表
spring.shardingsphere.sharding.master-slave-rules.<master-slave-data-source-name>.load-balance-algorithm-class-name= #从库负载均衡算法类名称。该类需实现MasterSlaveLoadBalanceAlgorithm接口且提供无参数构造器
spring.shardingsphere.sharding.master-slave-rules.<master-slave-data-source-name>.load-balance-algorithm-type= #从库负载均衡算法类型,可选值:ROUND_ROBIN,RANDOM。若`load-balance-algorithm-class-name`存在则忽略该配置
spring.shardingsphere.props.sql.show= #是否开启SQL显示,默认值: false
spring.shardingsphere.props.executor.size= #工作线程数量,默认值: CPU核数
spring.shardingsphere.props.check.table.metadata.enabled= #是否在启动时检查分表元数据一致性,默认值: false
补充:
1.从库除了按照官方配置使用[x]这种数组方式,还可以多个用英文‘,’隔开:.slave-data-source-names=aaa,bbb,ccc
5.使用说明
1.sharding-jdbc(如非特别声明均指ShardingSphere中的jdbc模块)只解决应用数据主从及分片问题,数据库从如何从主库复制数据(主从复制)是运维层面的问题,sharding-jdbc并不支持。
2.开启读写分离后,同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库读取,用于保证数据一致性。
3.可以使用【强制分片路由】,比如强制走主库或从库等—具体见Hint专题章节(TODO)