ShardingSphere-Sharding-JDBC水平分表(分片策略) | 学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 快速学习ShardingSphere-Sharding-JDBC水平分表(分片策略)。

开发者学堂课程【数据库中间件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 配置,通过这种方法即可找到相关配置。

4.1.png

 

1.配置数据源,给数据源起名称

4.2.png

打开 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中,包括可以设置主键按照规则生成,用增长或加规则生成主键值。

4.3.png

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_idspring.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},修改后会出现问题:在配置文件示例中表为01;第一种方法可以把 course_1,course_2改为01cid值为偶数向0中添加,当cid值为奇数向1中添加;course_$->{cid%2}改为course_$->{cid%2+1}course_$->{cid%2+1}其中cid%2+1表示当cid值为偶数是可以整除值为0,然后01等于1,所以cid值为偶数时添加到course_1中;cid为奇数向course_2中添加数据;例如现在 cid 值为4,四对二取模,即四可以整除二,值为001等于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。现在只是完成分片策略的配置。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9月前
|
SQL 算法 Java
Myqsql使用Sharding-JDBC分表分库和读写分离 2
Myqsql使用Sharding-JDBC分表分库和读写分离
98 0
|
9月前
|
SQL 算法 Java
Myqsql使用Sharding-JDBC分表分库和读写分离 1
Myqsql使用Sharding-JDBC分表分库和读写分离
67 0
|
1月前
|
SQL 存储 Java
Sharding-JDBC 如何实现分片
以上是V 哥在教学过程中实现分片的示例步骤,Sharding-JDBC能够实现SQL的分片操作,将请求路由到正确的数据库和表中,从而实现数据的水平扩展,这是在使用例如 MySQL作为数据库的场景中经常会使用到的,但如果你的企业正在考虑分布式数据库迁移,V 哥建议可以考虑 TiDB 或 OceanBase 这样的分布式数据库,因为它们天然就支持分布式,而不需要考虑这些。
|
10月前
|
SQL druid Java
JAVA进阶 JDBC技术学习笔记(四)
JAVA进阶 JDBC技术学习笔记(四)
|
10月前
|
XML Java 数据库连接
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作1
java202304java学习笔记第六十五天-ssm-声明式控制-基于xml的声明式配置-原始jdbc操作1
48 0
|
10月前
|
SQL druid Java
[Java]JDBC学习笔记(尚硅谷康师傅JDBC)(四)
[Java]JDBC学习笔记(尚硅谷康师傅JDBC)(四)
|
10月前
|
SQL 存储 Java
[Java]JDBC学习笔记(尚硅谷康师傅JDBC) (二)
[Java]JDBC学习笔记(尚硅谷康师傅JDBC)(二)
|
1月前
|
Java 关系型数据库 MySQL
JDBC学习笔记
JDBC学习笔记
|
8月前
|
Java 数据库连接 数据库
JDBC学习笔记2
JDBC学习笔记2
38 0
|
8月前
|
SQL Java 关系型数据库
JDBC学习笔记
JDBC学习笔记
113 0