开发者学堂课程【数据库中间件ShardingSphere详解:ShardingSphere-Sharding-JDBC水平分表(分片策略)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/666/detail/11246
ShardingSphere-Sharding-JDBC水平分表(分片策略)
上节课程中完成实体类包括mp的创建,下面进行 sharding-jdbc 分片策略,对数据库那些表进行操作,按照什么规则进行操作。
一、配置 sharding-jdbc 分片策略
对哪个数据库操作,对哪个表进行操作,对表怎么操作,这叫分片策略。
在项目application.properties配置文件中进行配置。
配置代码不需要记忆,在Shard ingSphere 官网中有配置文件。进入官网中点击了解更多,在用户手册中有配置手册有详细配置。现在使用 Shard ing-JDBC 时基于 SPring Boot 进行整合。在配置手册中 是 Spring Boot 中存在分片策略。找到 Shard ing-JDBC 里面配置手册中 Spring Boot 配置,通过这种方法即可找到相关配置。
1.配置数据源,给数据源起名称
打开 Spring Boot 配置,第一部分是配置示例的数据分片,可以结合实际把有用的部分直接复制到代码中。当一行 spring.shardin
gsphere.datasource.names=ds0,ds1 是必须的,等号左边是固定内容,等号右边实例可以更改。datasource.names意义为给数据源命名,名字可以自定义。配置示例的数据分片中有两个数据源,一个名为 ds0,一个名为d s1;针对 ds0 有相关配置针对ds1有相关配置,包括连接池,驱动名称,用户地址,用户密码。这是配置所需要的,现在没有进行分库只进行分表,所以只需要一个数据原即可。把 spring.shardingsphere.datasource.names=ds0,ds1 直接复制到配置文件中,根据它进行更改。如果自己编写,也可以在官网中根据示例进行修改。示例中代码非常明确,各种应用场景都有。把它复制到配置文件 application.properties 中,这是第一部分,是进行配置 Shard ing-JDBC 中分片策略,在配置分片策略第一步是配置数据源即对数据源命名,例如命名为m1或者其他。下面配置连接池,驱动名称,用户地址,用户密码;可以在官网中配置文件中直接复制语句,进行修改,语句结构国定,根据实际修改为理想效果。
2.配置数据源具体内容,包含连接池,驱动,地址,用户名和密码,直接对代码进行修改
spring.shardingsphere.datasource.ds0.type=org.apache.commons.dbcp.BasicDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.ur1=jdbc:mysql://localhost:3306/ds0
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=
在配置中数据源名为ds0,现在自定义名为m1;首先把ds0替换为m1,第一行type使用名为dbc的连接池,现在需要替换为 Druid 连接池,因为Druid 连接池在之前引入过。Druid连接池路径:com.alibaba.druid.pool.DruidDataSource。示例中驱动地址不适配现在使用 spring Boot 2.2.0版本, 2.2.0需要使用MySQL默认8版本,而MySQL 8 版本使用当前配置会出现问题,需要修改为com.mysql.cj.jd
bc.Driver。第三行是数据库地址,数据库地址在应用 sqlyog 中数据库course-db,在写地址添加参数即当前时区,要不然会进行报错。添加参数通过单词 serverTimezone ,GMT%2B8 表示东八区,%2B是转型符合,8代表8区,GMT 表示时区。最后更改密码,更改为自定义密码。
3.指定course表分布情况,配置表在哪个数据库里面,表名称都是什么ml.course1,mL.course2
继续向下配置,指定当前表所在位置,指定表中相关节点以及相关策略。下面代码主要作用:表在什么地方分布,表有那些;现在表都在 course-db中一个course_1一个 course_2,表的策略:如果是偶数存放在 course_1中如果是奇数存放在course_2中,包括可以设置主键按照规则生成,用增长或加规则生成主键值。
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$>
{0..1}.t_order$->{0..1}
为只留下当前表分布情况,或者是表在那些数据空中是什么表,需要对其设置。把代码复制到配置文件中修改,指定course 表分布情况,配置表在那个数据库中,表名称是什么。代码中 t_order 这个位置为添加表的规则,表名称都是以 course 开头,一个名为 course_1一个名为 course_2,把规则t_order 改名为 course等号右边使用行表达式可以标志相关内容。把ds$>{0..1} 替换为 m1 表示为在数据库 m1 中的表,t_order$->改为 course_$->,后面添加具体数值, course_$->{1..2}即可设置表分布情况,包括表所在数据库与表名称。首先修改规则,所创建表均已course 开头,使用course替换原代码中规则;第二步表所在数据库,只创建一个数据库 course_db,所以可以直接更改为 m1;两个表一个course_1一个course_2在代码中course_$->{1..2}表示表的名称。course_$->{1..2}即为m1.course_1,m1.course_2.。${..}为行表达式标识符。
指定course 表分布情况,配置表在那个数据库中,表名称是什么m1.course_1,m1.course_2
Spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_1_$->{1..2}
4.指定course表里面主键cid生成策略SNOWFLAKE
继续向下面配置,配置顺序可以更改但是内容不能缺失。
#指定course表里面主键生成策略 SNOWFLAKspring.shardingsphere.sharding.tables.t_order.key=generator.column=order_id
spring.shardingsphere.sharding.tables.t_order.key=generator.type=SNOWFLAKE
表示可以指定 course 表里面主键生成策略,表中 cid 为主键,主键值按照什么规则生成,自动增长或者其他;在配置代码中需要修改位置为,把表规则 t_order 更改为 course_;第一行等号右边主键名改为 cid;第二行等号右边添加策略,SNOWFLAK(雪花算法)表示随机生成数字,把主键策略设置为 SNOWFLAK(雪花算法)表示随机生成唯一的数字把主键值生成。
5.指定分片策路约定cid值偶数添加到course1表,如果cid是奇数添加到course2表
最后一部分配置,指定分片策略;策略:例如表中约定cid值是偶数向course_1中,添加数据cid值是奇数向course_2中添加数据。策略在配置手册中也有示例,直接复制到配置文件中,使用其修改为理想效果。
#指定分片策略 约定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)
首先把表规则修改为 course ,根据什么值继续判断,现在使用主键cid,把第一行等号右边更改为 cid;把第二行规则更改为 course_$->{cid%2},修改后会出现问题:在配置文件示例中表为0,1;第一种方法可以把 course_1,course_2改为0,1;cid值为偶数向0中添加,当cid值为奇数向1中添加;course_$->{cid%2}改为course_$->{cid%2+1},course_$->{cid%2+1}其中cid%2+1表示当cid值为偶数是可以整除值为0,然后0加1等于1,所以cid值为偶数时添加到course_1中;cid为奇数向course_2中添加数据;例如现在 cid 值为4,四对二取模,即四可以整除二,值为0,0加1等于1,会向course-1中添加数据。这是设置的分片策略,根据主键完成操作。
6.打开sql输出日志
配置手册中还用一个配置,这个配置与功能无关,主要为了查看sql输出日志。把这个代码复制后,可以查看底层sql语句,
#打开sql输出日志
Spring.shardingsphere.props.sql.show=true
现在已经完成配置,不需要记忆,但需要指定每一部分作用。首先第一部分配置数据源,给数据源命名;第二步配置数据源具体内容,包括连接池,驱动,地址,用户名,密码;现在使用 MySQL 8使用 cj.jdbc 驱动,然后添加时区地址;第三步指定表分布情况,创建的表都在m1 中标为 course_1,course_2使用行表达式区分;第四步设置主键生成策略,使用 SNOWFLAKE会生成随机唯一的数字;第五步设置分片策略,cid值偶数添加到 course 1.表,如果cid是奇数添加到course_.2表,使用 cid%2 实现;最后一步打开sql日志输出;即可完成基础配置。配置文件不需要记忆,但要求可以根据配置文件快速修改理想效果。下面开始编写代码,通过代码对其过程进行测试,例如编写添加或者查询,查看添加过程中可不可以实现想要的效果,查看查询过程中数据能不能按照约定查询,id 为偶数操作 course_1查询偶数也操作 course_1。现在只是完成分片策略的配置。