开发者学堂课程【数据库中间件ShardingSphere详解:ShardingSphere-Sharding-JDBC水平分库(1)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/666/detail/11248
ShardingSphere-Sharding-JDBC 水平分库(1)
内容介绍:
一.需求分析
二.创建数据库和表
三.在SpringBoot 配置文件配置数据库分片规则
四.编写测试方法
上节课程讲到 Sharding-JDBC 实现水平分表操作,通过创建工程环境,创建数据库配置分片策略,最终编写测试代码完成Sharding-JD
BC 实现水平分表。继续使用 Sharding-JDBC 实现水平分库操作。
一.需求分析
使用 Sharding-JDBC 已经实现水平分表操作,现在 Sharding-JDBC 实现水平分库操作。水平分库即把单一数据库创建为多个与其结构相同的数据库,在第一个数据库中存放一部分数据,第二个中存放另一部分数据即创建多个结构相同数据库,数据库中的表均相同。按照这种方式进行操作,首先需求分析即想要实现什么样的效果,分析需求后通过代码实现。因为要实现水平分库,需要创建两个数据库(以两个数据库举例,可以创建多个数据库),为了区分数据库对数据库命名,在之前已经创建 course_db ,现在创建第一个数据库命名为 edu_db_1,创建第二个数据库命名为 edu_db_2,这是即将创建的两个数据库;创建数据库后,在数据库中创建表,表结构与上节课程相同;在数据库 edu_db_1 中创建两个表,第一个表名为 course_1,第二个表名为course_2,把两个表按照上节课程课程中表结构创建出;在数据库edu_db_2 中同样创建表结构相同的两张表;这是数据库与表规划的方式。复述一遍:创建两个数据库 edu_db_1和 edu_db_2,在数据库中有相同的两张表 course_1和 course_2.实现工程时约定规则:现在进行水平分库,在数据库中进行了水平分表,把两个操作放在一起混合编写,规则稍微复杂一点。数据库规则:第一个规则,在添加课程时课程表中存在字段 user_id,如果 user_id 为偶数时把数据添加到 edu_db_1 数据库中,,如果 user_id 为奇数时把数据添加到 edu_db_2 数据库中;再添加表的规则,表规则与上节课程相同,现在只判断数据添加在那个数据库,数据最终需要添加到表中,在表中有 cid 值。表规则:cid 是偶数把数据添加到 course_1 中,cid 是奇数把数据添加到 course_2 中。这是对需求的分析。
复述一遍需求分析,把表创建,编写代码。首先创建两个数据库edu_db_1 和 edu_db_2;数据库中均存放两张表 course_1 和 course_2 ,它们结构相同;规则是两种规则一个数据库规则一个表规则,数据库规则是当user_id 为奇数时把数据添加到 edu_db_2 数据库中,当 user_id 为偶数时把数据添加到 edu_db_1 数据库中;表规则是在添加数据时cid 是偶数把数据添加到 course_1 中,cid 是奇数把数据添加到 course_2 中。即可实现水平分库的存在。
使用 Shard ing-JDBC实现水平分库效果,通过描述知道最终需要做成的效果,所以把需求进行分析。
二.创建数据库和表
根据需求分析,创建数据库和数据库表。首先创建两个数据库 edu_db_1
edu_db_2
在两个数据库中创建两个表 course_1 和 course_2 ,使用语句
CREATE TABLE course_1{
Cid BIGINT
(20) PRIMARY KEY;
Cname VARCHAR(50) NOT NULL;
User_id BIGINT(20) NOT NULL;
Cstatus VARCHAR(20) NOT NULL;
}
创建表 course_1 然后在创建 course_2
CREATE TABLE course_2{
Cid BIGINT
(20) PRIMARY KEY;
Cname VARCHAR(50) NOT NULL;
User_id BIGINT(20) NOT NULL;
Cstatus VARCHAR(20) NOT NULL;
}
在数据库 edu_db_1 中两个表就已经创建完成,在数据库 edu_db_2 中同样创建两个表 course_1 和 course_2。目前两个数据库已经创建,在数据库中均有两个表 course_1 和 course_2。
三.在 SpringBoot 配置文件配置数据库分片规则
按照水平分库特点创建数据库和数据库表,创建完成后开始编写代码,把过程实现,在上节课中已经把代码结构编写出了,下面只需要更改配置文件增加数据库的分片规则,编写测试方法进行测试。
在前面课程已经编写配置文件,为了区分把文件复制一份,把文件 application.properties备份,然后在 application.properties 中完成具体操作,在文件中修改为水平分库需要的配置。当前文件中有上次课程中水平分表的策略,现在需要添加水平分库的策略,从官网中寻找示例进行修改;第一步在配置文件中创建数据源,做水平分库需要两个数据源,之前有一个数据源 m1,再添加一个数据源 m2 写法可以参考官网;第二部配置数据源中具体内容,配置第一个数据源具体内容:
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.ur1=jdbc:mysql://localhost:3306/edu_db_1?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=root
数据库地址改为 edu_db_1,
配置第二个数据源具体内容:spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasourcem2.ur1=jdbc:mysql://localhost:3306/edu_db_2?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.m2.username=root
spring.shardingsphere.datasource.m2.password=root
首先把数据源名称修改为 m2,数据库名称修改为 edu_db_2;
现在把数据源部分配置完成,数据源共两个 m1,m2.
编写数据库分布情况包括数据库表分布情况,再上节课中只配置了一个数据源 m1,当时没有水平分库现在既要有库的分布还有有表的分布。指定数据库分布情况,数据库里面表分布情况,设置规则。目前有两个数据源 m1,m2 再数据库中有两张表course_1 和 course_2。当前配置文件中已经把表配置完成,需要把 m1 位置更换为分布规则,参考官网文档,把它复制然后修改为理想的效果。案例中数据源叫ds,应修改为 m;把 0..1 修改为 1..2,这样就配置数据库色分布情况
#定数据库分布情况,数据库里面表分布情况
#m1 m2 course_1 course_2
Spring.shardingphere.sharding.tables.course.actual-data-bodes=m$->{1..2}.course_$->{1..2}
数据库中有两个数据源 m1 和 m2,数据库中表有course_1 和 course_2。
Course 表中 cid 生成策略无需更改。
表的策略:cid 是偶数把数据添加到 course_1 中,cid 是奇数把数据添加到 course_2 中,分片规则在之前已经编写。
#指定 course 表里面主键生成策略 SNOWFLAKspring.shardingsphere.sharding.tables.t_order.key=generator.column=order_id
spring.shardingsphere.sharding.tables.t_order.key=generator.type=SNOWFLAKE
#指定分片策略 约定 cid 值是偶数向 course_1 表,如果 cid 值是奇数添加到 course_2 表
spring.shardingsphere.sharding.tables.t_crder.table-strategy.inline.sharding-column=order_id
spring.shardingsphere.sharding.tables.t_crder.table-strategy.inline.algorithm-expression=t _order$->{order _id % 2+1)
cid 是偶数把数据添加到 course_1 中,cid 是奇数把数据添加到 course_2 中;对 2 取模,如果 cid 可以整除 2 把数据存放到 course_1,如果 cid 不能整除 2 则把数据存放到 course_2。
现在不只有表,还有两个数据库需要多加一个配置,指定数据库分片策略。数据库策略在需求分析时也做了约定:如果user_id 是偶数添加到 m1 数据库中,如果 user_id 是奇数添加 m2数据库中。策略可以在官网中查找案例,第一个写法根据那个字段做策略,字段使用的是 user_id,第二行是策略具体内容;如果user_id 是偶数添加到 m1 数据库中,如果 user_id 是奇数添加 m2数据库中。
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=m$->{user_id %2+1}
这样编写没有问题,但写法中有一个单词 default 即默认的,就是数据库所以表都按照此规则做,如果想要指定特定表做,可以使用下面语句。此配置并无错误,但可以进行简化:ing.shardingspher
e.sharding 不变,后面改为 tables ,tables后添加表的规则 course,再添加数据库策略 database-strategy.再加上inline 后面一致;spring.shardingsphere.sharding.tables.course.databa
se-strategy.inline..sharding-column=user_id
这段代码含义:对数据库中 course 策略的字段 user_id 做分片规则,如果其他表中同样有字段 user_id 但不做编写的规则,只有策略为 course 的表做编写规则。第二行代码与默认写法相同 spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=m->(user_id %2+ 1}
现在已经完成水平分库的策略配置,再策略中第一步配置数据源,现在做水平分库有两个数据源 m1 和 m2;第二步配置数据源具体内容;第三步设置数据库与表的分布情况,现在有两个数据库 m1,m2 和两个表course_1,course_2;第四步设置 course 表中主键 cid 的策略使用雪花算法 SNOWFLAKE;第五步指定表的分片策略,cid 是偶数把数据添加到 course_1 中,cid 是奇数把数据添加到 course_2 中;第六步指定数据库分片策略,根据 user_id 做判断,有两种写法,一个是默认写法 default 一个是指定写法tables,如果 user_id 是偶数添加到 m1 数据库中,如果 user_id 是奇数添加m2 数据库中;最后输出 sql 日志。这样即可完成水平分库的配置,配置代码不需要记忆,再官网上都有对应代码,但要知道每一行配置具体含义,根据过程可以配置出来。
四.编写测试方法
完成数据库分片规则配置,最后一步编写测试代码,测试最终效果。在测试文件中,先写添加代码,其中有两个值需要注意一个是 user_id 一个是课程 id course,根据它们进行判断。再做查询测试,根据 课程 id course ,user_id 分别查看效果,根据规则操作不同的表。例如 cid 值为 2,user_id 等于11,第一个 user_id 是奇数会把数据添加到 edu_db_2 中,cid 是偶数会把数据添加到 edu_db_2 的 course_1 表中。配置最终完成了。