跳到主要内容

开启分片支持

如果您计划使您的Javashop系统数据分片,请参考本文档进行相应的配置。

一 、做好分片策略

在开始之前,您应该根据自己的业务情况准备好分片策略,包括:

1、要用几个数据库来分片

2、相应的表要分几张表

在本例,我们假设用2个数据库分片,相应的表分两个表。

二、分片数据源准备

请根据您的业务情况准备供分片的Mysql数据库,如准备好9台mysql供分片使用:

IP端口密码数据库
192.168.1.1003306root/123456distribution
192.168.1.1013306root/123456goods0
192.168.1.1023306root/123456goods1
192.168.1.1033306root/123456member0
192.168.1.1043306root/123456member1
192.168.1.1053306root/123456statistics
192.168.1.1063306root/123456system
192.168.1.1073306root/123456trade0
192.168.1.1083306root/123456trade1

我们将交易、商品、会员每个业务的数据库分成0,1两个数据库。

三、安装表结构

1、在相对应的数据库中安装如下sql脚本

执行脚本:

deploy/src/main/resources/scheme/standard/distribution.sql
deploy/src/main/resources/scheme/standard/goods.sql
deploy/src/main/resources/scheme/standard/member.sql
deploy/src/main/resources/scheme/standard/statistics.sql
deploy/src/main/resources/scheme/standard/system.sql
deploy/src/main/resources/scheme/standard/trade.sql
deploy/src/main/resources/scheme/standard/xxl_job.sql

注:

deploy是指javashop工程中的deploy工程目录 例如我们要将交易库101、102这两台数据库,就需要两台数据库分别执行trade.sql的脚本。 goods.sql等脚本以此类推。

2、在其他数据源中安装要分片的表

我们项目要进行分表的sql脚本如下:

deploy/src/main/resources/scheme/shard/goods.sql
deploy/src/main/resources/scheme/shard/member.sql
deploy/src/main/resources/scheme/shard/trade.sql

将上述sql脚本导入对应的数据库中。 分别在goods0、goods1、member0、member1、trade0、trade1数据库中执行shard.sql脚本进行删除多余的数据库表。


deploy/src/main/resources/scheme/delete/shard.sql

>
这里面的表个数是要根据您的分片策略做出相应的改变,我们拿订单表要**分2个表**举例,应该修改脚本为:

~~~sql
CREATE TABLE `es_order0` (
`order_id` bigint(20) NOT NULL COMMENT '主键ID',
`trade_sn` varchar(20) DEFAULT NULL COMMENT '交易编号',
其他字段略
)
CREATE TABLE `es_order1` (
`order_id` bigint(20) NOT NULL COMMENT '主键ID',
`trade_sn` varchar(20) DEFAULT NULL COMMENT '交易编号',
其他字段略
)

四、配置分片策略

修改配置中心的yml文件,以上述的分片策略为例:

1、定义数据源的分片

修改application.yaml:

spring:
profiles:
#需要包含的分片策略模块
include: goods,order,member
#sharding分库分表配置
shardingsphere:
#配置sql是否显示输出,调试用,生产环境需关闭
props:
sql:
show: true
sharding:
#定义默认数据源为:ds0
default-data-source-name: ds0
#定义分库的数据源,这里定义了两个数据源
datasource:
#这里配置所有数据源的名字
names: ds0,ds1
ds0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.2.208:3306/javashop01?useUnicode=true&characterEncoding=utf8&autoReconnect=true
username: root
password: 123456
ds1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.2.208:3306/javashop02?useUnicode=true&characterEncoding=utf8&autoReconnect=true
username: root
password: 123456

2、定义表分片策略

定义订单相关策略,修改application-order.yml:

spring:
#分库分表配置
shardingsphere:
sharding:
tables:
#订单表(用ordersn分库,用member_id分表)
es_order:
actual-data-nodes: ds$->{0..1}.es_order$->{0..2}
database-strategy:
inline:
sharding-column: sn
algorithm-expression: ds$->{ new Long(sn) % 2}
table-strategy:
inline:
sharding-column: member_id
algorithm-expression: es_order$->{member_id % 3}

其他模块分片策略配置文件对照表:

模块文件
订单application-order.yml
商品application-goods.yml
会员application-member.yml

五、总结

​ 以上是分2个库,订单分2个表为例的相关配置,请根据您的实际情况调整其他模块的分片策略(我们的配置文件默认不进行分库分表)。