之前在运满满用的是美团的zebra,zebra其实一款过于小众的分库分表工具。刚好看到微信上的一篇文章讲shardingsphere的,正好练练手。整个过程花了一个上午,主要是有两个坑。
一 环境准备
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.1</version> </dependency>
二 配置文件
配置文件可以说是shardingshpere的核心,他不同于zebra需要和自家的lion配合(lion并没有开源)。而是在springboot的yaml配置文件中完成了分库分表的逻辑。
spring: redis: mode: cluster password: Kn0Wl3dge#BasE cluster: nodes: 172.24.128.52:32556,172.24.128.77:32523,172.24.128.133:32546,172.24.128.136:32546,172.24.128.134:32545,172.24.128.135:32519 data: mongodb: uri: mongodb://baseUser:123456@172.24.128.186:32068,172.24.128.187:32593,172.24.128.185:30351/base?replicaSet=rs1&readPreference=secondaryPreferred&connectTimeoutMS=300000 shardingsphere: datasource: # 数据源,这里配置两个,分别是ds1,ds2 names: ds1 # ds1的配置信息,product_db1 ds1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/knowledge?serverTimezone=GMT%2B8&characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&rewriteBatchedStatements=true username: root password: mxzxyz # 分片的配置 sharding: # 表的分片策略 tables: ## team_shard是逻辑表的名称 team_shard: # 数据节点配置,采用Groovy表达式,切分之后的真实表所在的节点 actual-data-nodes: ds$->{1}.team_shard_$->{0..3} table‐strategy: inline: # 分片键为店铺ID sharding‐column: team_id # 分片策略取模 algorithm‐expression: team_shard_$->{team_id%4} props: sql: # 日志显示具体的SQL show: true
三 代码部分
根据配置文件中的
tables:
## team_shard是逻辑表的名称
team_shard:
我们在写mapper.xml的时候,只需要写team_shard作为表名,其他的跟单表真的没有区别
同时注意分片字段要通过手动设置,比如雪花算法
TeamShardEntity teamShardEntity = TeamShardEntity.builder().teamName(req.getTeamName())
.teamAvatar(req.getTeamAvatarUrl())
.description(req.getTeamDesc()).build();
teamShardEntity.setTeamId(System.currentTimeMillis());
teamService.addTeamShard(teamShardEntity);
四 踩坑
1 druid数据源
如果使用了shardingsphere,就不能使用
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency>
而是需要直接引用druid,原因还不清楚
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.22</version> </dependency>
2 原配置文件中有mongo的配置文件
配在了shardingsphere的下面,结果启动就是报错,然后我把这部分放在了shardingsphere前,就好了真是神奇
spring: redis: mode: cluster password: Kn0Wl3dge#BasE cluster: nodes: 172.24.128.52:32556,172.24.128.77:32523,172.24.128.133:32546,172.24.128.136:32546,172.24.128.134:32545,172.24.128.135:32519 data: mongodb: uri: mongodb://baseUser:123456@172.24.128.186:32068,172.24.128.187:32593,172.24.128.185:30351/base?replicaSet=rs1&readPreference=secondaryPreferred&connectTimeoutMS=300000 shardingsphere: datasource: # 数据源,这里配置两个,分别是ds1,ds2 names: ds1 # ds1的配置信息,product_db1 ds1: