springboott整合mybatis-plus和sharding-jdbc实现分库分表和读写分离(含完整项目代码)
一、整合sharding-jdbc
关于springboot整合sharding-jdbc官网有4种方式,而网上千篇一律都是用.properties文件。我在这里主要是用yml+bean两种方式结合,bean主要是为了实现分片键分片规则更灵活。
1.1引入maven依赖
这里有个小坑,我一开始引入是最新的sharding-jdbc和mybatis-plus的依赖,结果启动项目直接报错。所以个人不建议引用最新的包。
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version></dependency>
1.2配置分库分表和读写分离(核心)
spring:shardingsphere:datasource:names: "search-center-00,search-center-00-slave,search-center-01,search-center-01-slave"search-center-00:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/search_center_00?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCusername: rootpassword: 123456search-center-00-slave:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3307/search_center_00?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCusername: rootpassword: 123456search-center-01:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/search_center_01?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCusername: rootpassword: 123456search-center-01-slave:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3307/search_center_01?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCusername: rootpassword: 123456sharding:master-slave-rules:search-center-00:master-data-source-name: search-center-00slave-data-source-names: search-center-00-slavesearch-center-01:master-data-source-name: search-center-01slave-data-source-names: search-center-01-slavetables:user:actual-data-nodes: search-center-$->{(0..1).collect{t ->t.toString().padLeft(2,'0')}}.user_$->{(0..1).collect{t ->t.toString().padLeft(2,'0')}}database-strategy:standard:shardingColumn: idprecise-algorithm-class-name: com.gory.searchcenter.config.DatabaseAlgorithmtable-strategy:standard:sharding-column: idprecise-algorithm-class-name: com.gory.searchcenter.config.TableAlgorithmprops:sql:show: true
names:自定义数据库名称,然后对这些名称进行具体的配置,如:url,password,username等
tables:对每个表进行分库分表。例如,这里对user表进行分库分表,
actual-data-nodes:则是user表分库分表的节点分配。
database-strategy:是分库的策略,我这里是根据id,然后通过bean方式更加灵活配置分库规则,
table-strategy:则是分表的策略,配置和分库大概一致。
master-slave-rules:设置主从实现读写分离,
DatabaseAlgorithm
public class DatabaseAlgorithm implements PreciseShardingAlgorithm<Long> {@Overridepublic String doSharding(Collection<String> databaseNames, PreciseShardingValue<Long> shardingValue) {Long shardResult = Math.abs((long) shardingValue.getValue().hashCode()) % 2;for (String databaseName : databaseNames) {String shardValue = String.format("%02d", shardResult);if (databaseName.endsWith(shardValue)){System.out.println("shardingValue:"+shardingValue+", databaseName:" + databaseName);return databaseName;}}throw new UnsupportedOperationException();}}
TableAlgorithm
public class TableAlgorithm implements PreciseShardingAlgorithm<Long> {/*** @param tableNames 有效的数据源 或者 表 的名字 tableNames 就为配置文件中的 配置的数据源信息 -> ds0 , ds1* @param shardingValue SQL 分片列 对应的实际值* @return 返回相应的表名*/@Overridepublic String doSharding(Collection<String> tableNames, PreciseShardingValue<Long> shardingValue) {Long shardResult = Math.abs((long) shardingValue.getValue().hashCode()) / 2 % 2;for (String tableName : tableNames) {String shardValue = String.format("%02d", shardResult);if (tableName.endsWith(shardValue)){System.out.println("shardingValue:"+shardingValue+", tableName:" + tableName);return tableName;}}throw new UnsupportedOperationException();}}
随便说一下,这里的分片主键id是用雪花算法设值的。你的分片键的赋值最好和你的分片规则对应上。
二、整合mybatis-plus
上一节已经说过了,引入最新的maven依赖会报错,所以我还是不建议用最新的。
2.1 引入maven依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version></dependency>
2.2 mybatis-plus的配置
mybatis-plus:mapper-locations: classpath:/mapper/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
再启动类加上包扫表注解
@MapperScan({"com.gory.searchcenter.mapper"})
三、数据库主从配置
在上两节已经能完成分库分表了,但是因为数据库没设置主从,从表没有数据库,导致查询没有数据。因为此文章主要是为了学习,所以mysql的配置是在window环境的。
3.1my.ini配置
主库
#主库id不能重复
server_id=1
#开启bin-log
log_bin=E:\lib\mysql-5.7.30-winx64\master-bin.log
#mysql清除过期日志的时间与从库设置一致
expire_logs_days = 1
#设置需要同步的数据库
binlog-do-db=search_center_00
binlog-do-db=search_center_01
------------------------------------------------------------ |
从库
server_id=2
#开启bin-log
log_bin=E:\lib\mysql-5.7.30-winx64-slave\slave-bin.log
expire_logs_days = 1
#设置需要同步的数据库
binlog-do-db=search_center_00
binlog-do-db=search_center_01
------------------------------------------------------------ |
值得一提,设置多个同步表,不能用逗号隔开。
3.1 sql配置
主库
开通从服务器( Slave )访问主服务器( Master )的权限
grant replication slave on.to ‘root’@‘127.0.0.1’ identified by ‘123456’;
查看授权信息
show master status ;
从库
停止同步
stop slave;
设置主库的信息,将从库和主库联系起来
change master to
master_host=’127.0.0.1’,
master_user=’root’,
master_password=’123456’,
master_log_file=’log-bin.000008’,
master_log_pos=107;
master_log_file和master_log_pos这两个 配置是和主 服务器 show master status对应的
启动同步
start salve;
查看slave启动状态
show slave status;
如果出现,则表明,启动成功。
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
四、完整的项目代码
完整的代码:/gorylee/SearchCenter