Sharding

Sharding操作

  • 什么是Sharding
  • Sharding-JDBC
    • 一、引入maven依赖 (sharding-jdbc-spring-boot-starter)
    • 二、水平分表操作(一个库多个相同结构表)
    • 其他的maven依赖版本 (shardingsphere-jdbc-core-spring-boot-starter)
  • 数据迁移
  • 直接使用客户端操作(非代码)

什么是Sharding

Sharding是一种数据库架构技术,它将一个大的数据库或表水平拆分成多个较小的、更易于管理的片段,这些片段被称为shards。每个shard可以存储数据库的一部分数据,并且通常被部署在独立的数据库服务器上。Sharding的主要目的是通过横向扩展来提高数据库的性能、可靠性和可扩展性。

Sharding-JDBC

Sharding-JDBC早期是由当当网开源的分布式数据库中间件,后期该项目被放入到ShardingSphere项目下,Sharding-JDBC是一个轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务, 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架

在使用Sharding-JDBC首先要清楚以下几点
1.它是一个轻量级的Java框架,可以理解是增强的JDBC驱动
2.Sharding-JDBC是不做分库分表的,库与表是由数据库工程师分好的,通过引入Sharding-JDBC.jar配置好配置,解决多数据源切换与多数据源的操作

一、引入maven依赖 (sharding-jdbc-spring-boot-starter)

参考文章:
Sharding-JDBC实战(水平分表、水平分库、垂直分表、公共表、读写分离)
sharding-jdbc教程 看这一篇就够了

所需环境:SpringBoot+MybatisPlus+Sharding-JDBC+Druid

sharding-jdbc-spring-boot-starter:
早期ShardingSphere项目(最初名为Sharding-JDBC)中的一个组件,用于简化在Spring Boot项目中使用Sharding-JDBC的过程。
Sharding-JDBC最初是一个轻量级的Java框架,在Java的JDBC层提供额外的服务,主要用于分库分表、读写分离和分布式主键等功能。
它的主要特点是基于JDBC的扩展,以jar包的形式提供轻量级服务。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.20</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version>
</dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

二、水平分表操作(一个库多个相同结构表)

数据库准备

水平分表的方式在同一个库中创建多个相同结构的个表
创建数据库course_db
在数据库创建2个相同的表course_1和course_2
数据操作规则:如果操作的数据id是偶数着操作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(50) NOT NULL
);
CREATE TABLE course_2(cid BIGINT(20) PRIMARY KEY,cname VARCHAR(50) NOT NULL,user_id BIGINT(20) NOT NULL,cstatus VARCHAR(50) NOT NULL
);

properties配置

修改application.properties增加shardingsphere配置在ShardingSphere官网用户手册=>ShardingSphere-JDBC=>配置手册中都有详细的说明

官方配置文档地址

以下是两个表的操作配置

# 配置shardingjdbc分片策略
# 配置数据源,给数据源起别名
spring.shardingsphere.datasource.names=myds1# 由于表数据库有2个相同的表,我们只有一个实体类,需开启允许bean覆盖
spring.main.allow-bean-definition-overriding=true# 配置数据源具体内容:连接池、驱动、地址、用户名、密码
# spring.shardingsphere.datasource.{你的数据源别名}.type
spring.shardingsphere.datasource.myds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.myds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.myds1.url=jdbc:mysql://localhost:3306/course_db?serverTimezone=GMT+8
spring.shardingsphere.datasource.myds1.username=root
spring.shardingsphere.datasoaurce.myds1.password=123456#连接池初始化时创建的连接数
spring.shardingsphere.datasource.myds1.initial-size=1
#连接池中最少空闲连接数
spring.shardingsphere.datasource.myds1.min-idle=1
#连接池中最大活动连接数
spring.shardingsphere.datasource.myds1.max-active=50
#获取连接时最大等待时间,单位通常是毫秒
spring.shardingsphere.datasource.myds1.max-wait=60000
#查询超时时间,单位通常是毫秒
spring.shardingsphere.datasource.myds1.query-timeout=6000
#事务查询超时时间,单位通常是毫秒
spring.shardingsphere.datasource.myds1.transaction-query-timeout=6000
#移除废弃连接的超时时间,单位通常是毫秒
spring.shardingsphere.datasource.myds1.remove-abandoned-timeout=1800
# Druid连接池支持的过滤器,用来监控、日志记录等 设置stat,表示为只统计信息
spring.shardingsphere.datasource.myds1.filters=stat
#从连接池中取出连接时是否进行测试,以判断连接是否有效,值为false,表示不进行测试。
spring.shardingsphere.datasource.myds1.testOnBorrow=false# 指定course_db表的分布情况,配置表在那个数据库中,表名称分别是什么
# spring.shardingsphere.rules.sharding.tables.{表规则}.actual-data-nodes={表达式规则}
# myds1.course_$->{1..2} => myds1数据中的course_开头的,course_1和course_2表
spring.shardingsphere.sharding.tables.course.actual-data-nodes=myds1.course_$->{1..2}# 指定course主键生成策略 id生成策略SNOWFLAKE雪花算法
#如果不配置key-generator.type,则主键需要由自己生成(例如自增操作)
# spring.shardingsphere.rules.sharding.tables.{表规则}.database-strategy.standard.sharding-column
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE# 指定分片策略,约定cid值偶数操作course_1,cid值奇数操作course_2(以下这种操作对于只有两张表的情况下)
#当 cid 的值为偶数时,cid % 2 的结果是0,0 + 1 的结果是1,所以表名会是 course_1。
#当 cid 的值为奇数时,cid % 2 的结果是1,1 + 1 的结果也是2,所以表名会是 course_2。
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 2 + 1}# 打印sql输出日志
spring.shardingsphere.props.sql.show=true

当表大于2个,为16个时的时候

# 指定course_db表的分布情况,配置表在那个数据库中,表名称分别是什么
# spring.shardingsphere.rules.sharding.tables.{表规则}.actual-data-nodes={表达式规则}
# myds1.course_$->{0..15} => myds1数据中的course_开头的,course_0到course_15表,共16张表
spring.shardingsphere.sharding.tables.course.actual-data-nodes=myds1.course_$->{0..15}#以下这个配置
#如果cid是0,那么数据将被存储到course_0表中。
#如果cid是1,那么数据将被存储到course_1表中。
#...
#如果cid是15,那么数据将被存储到course_15表中。
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 16}

代码测试

编写测试程序测试插入效果,与查询效果

可以看到Sharding-JDBC会按照配置的规则向不同的表插入数据

其他的maven依赖版本 (shardingsphere-jdbc-core-spring-boot-starter)

shardingsphere-jdbc-core-spring-boot-starter
随着ShardingSphere的发展,项目从单一的Sharding-JDBC组件扩展为一个更完整的套件,包含了多个组件,如Sharding-JDBC、Sharding-Proxy等。
shardingsphere-jdbc-core-spring-boot-starter是ShardingSphere套件中用于JDBC集成的Spring Boot Starter。
与早期的sharding-jdbc-spring-boot-starter相比,它可能包含了更多的功能和优化,因为ShardingSphere本身也在不断发展和完善。

参考文章:SpringBoot整合Sharding-JDBC水平分表

数据迁移

参考文章
【1】使用sharding-scaling和sharding-proxy做分库分表数据迁移
https://blog.csdn.net/qq_37207854/article/details/130567728
【2】ShardingSphere——水平分表与数据迁移
https://blog.csdn.net/qq_20545159/article/details/121760472

直接使用客户端操作(非代码)

参考文章
【1】Sharding-Proxy 实现分库分表
https://blog.csdn.net/qq_38826019/article/details/119861073

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vmware 中的Ubuntu系统虚拟机忘记root密码强制重置操作

忘记密码情况下&#xff0c;vmware虚拟机重置Ubuntu的root密码 在企业使用的vmware ESXI中重置Ubuntu系统root密码 1-本地电脑安装个人版的vmware workstation&#xff0c;目的&#xff1a;vmware ESXI自带的远程控制台无法输入指定的键盘按键&#xff0c;需要借助外部的远程辅…

【ELK】搭建elk日志平台(使用docker-compose),并接入springboot项目

1、环境搭建 前提条件&#xff1a;请自行安装docker以及docker-compose环境 version: 3 services:elasticsearch:image: elasticsearch:7.14.0container_name: elasticsearchports:- "9200:9200"- "9300:9300"environment:# 以单一节点模式启动discovery…

java之static详细总结

static也叫静态&#xff0c;可以修饰成员变量、成员方法。 成员变量 按照有无static分为两种&#xff1a; 类变量&#xff1a;static修饰&#xff0c;属于类&#xff0c;与类一起加载一次&#xff0c;在内存中只有一份&#xff0c;会被类的全部对象共享实例变量&#xff08;…

Elastic AI Assistant for Observability 和 Microsoft Azure OpenAI 入门

作者&#xff1a;来自 Elastic Jonathan Simon 最近&#xff0c;Elastic 宣布 AI 观测助手现已正式向所有 Elastic 用户开放。该 AI 观测助手为 Elastic 观测提供了一种新工具&#xff0c;提供了大型语言模型&#xff08;LLM&#xff09;连接的聊天和上下文洞察&#xff0c;以解…

JavaWeb入门——Web前端概述及HTML,CSS语言基本使用

前言&#xff1a; java基础已经学完&#xff0c;开始学习javaWeb相关的内容&#xff0c;整理下笔记&#xff0c;打好基础&#xff0c;daydayup!!! Web Web&#xff1a;全球广域网&#xff0c;也称万维网&#xff08;www World Wide Web&#xff09;&#xff0c;能够通过浏览器访…

Hadoop MapReduce

MapReduce分为两个阶段&#xff0c;分为Map阶段和Reduce阶段&#xff0c;可以自定义map函数和reduce函数&#xff0c; map函数的输入是行在文件的字节偏移量&#xff0c;value是文件的一行数据。 reduce函数的输入是key和对应key的value组&#xff0c;然后reduce函数可以对这…

加州大学欧文分校英语基础语法专项课程01:Word Forms and Simple Present Tense 学习笔记

Word Forms and Simple Present Tense Course Certificate 本文是学习Coursera上 Word Forms and Simple Present Tense 这门课程的学习笔记。 文章目录 Word Forms and Simple Present TenseWeek 01: Introduction & BE VerbLearning Objectives Word FormsWord Forms (P…

C++ 【桥接模式】

简单介绍 桥接模式属于 结构型模式 | 可将一个大类或一系列紧密相关的类拆分 为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用。 聚合关系&#xff1a;两个类处于不同的层次&#xff0c;强调了一个整体/局部的关系,当汽车对象销毁时&#xff0c;轮胎对象…

基于单片机光伏太阳能跟踪系统设计

**单片机设计介绍&#xff0c;基于单片机光伏太阳能跟踪系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机光伏太阳能跟踪系统的设计&#xff0c;旨在通过单片机技术实现对光伏太阳能设备的自动跟踪&#xff0c;以提高太阳…

寄快递便宜啦!德邦、韵达、京东、圆通等八大品牌快递五折起!

低价服务&#xff0c;为你的快递需求保驾护航。 一、与全网主流快递合作&#xff0c;信赖与质量的共同见证 是一家整合快递、物流、及国际快递资源的综合快递服务平台&#xff0c;通过人工智能比价系统&#xff0c;为个人及企业客户提供市面上优惠的快递价格&#xff0c;目前…

Android视角看鸿蒙第十一课-鸿蒙的布局之层叠布局Stack

Android视角看鸿蒙第十一课-鸿蒙的布局之层叠布局 导读 在Android中我个人认为&#xff0c;最离不开的就是LinearLayout和FrameLayout了&#xff0c;RelativeLayout我都基本不用的。 所以我把层叠布局排在了第二位。 官方描述 如何定义层叠布局 Stack组件为容器组件&#x…

【正点原子探索者STM32F4】TFTLCD实验学习记录

【正点原子探索者STM32】LCD实验学习记录 硬件硬件连接软件设计变量类型定义LCD参数结构体LCD地址结构体 函数定义读写命令和数据简介6个基本函数坐标设置函数画点函数读点函数字符显示函数LCD初始化 小结参考 硬件 STM32F407、4.3寸LCD屏 硬件连接 LCD_BL(背光控制)对应 PB1…

OCP Java17 SE Developers 复习题11

答案 A, C, D, E. A method that declares an exception isnt required to throw one, making option A correct. Unchecked exceptions can be thrown in any method, making options C and E correct. Option D matches the exception type declared, so its also correct…

漂亮易用且功能强大的最酷的开源在线海报图片设计器:Poster-Design

Poster-Design&#xff1a;最酷的开源在线海报图片设计器&#xff0c;让您轻松创作&#xff0c;尽享设计之美与强大功能的完美结合&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Poster-Design 是一款高度评价的在线设计工具&#xff0c;专为用户提供便捷而高效的海…

C++:类与对象(一)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;类与对象&#xff08;一&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 面向对象和面向过程的区别1.类的引入2.…

C++从入门到精通——类对象模型

类对象模型 前言一、如何计算类对象的大小问题 二、类对象的存储方式猜测对象中包含类的各个成员代码只保存一份&#xff0c;在对象中保存存放代码的地址只保存成员变量&#xff0c;成员函数存放在公共的代码段问题总结 三、结构体内存对齐规则四、例题结构体怎么对齐&#xff…

知识图谱基本概念:数据、信息和知识

目录 前言1 数据&#xff1a;信息的基础1.1 数据的定义1.2 数据的重要性1.3 数据的例子1.4 数据的处理1.5 数据分析 2 信息&#xff1a;知识的基础2.1 信息的本质2.2 信息的转化过程2.3 信息的特点2.4 信息的示例 3 知识&#xff1a;智慧的体现3.1 知识的本质3.2 知识的形成过程…

【数据结构】红黑树详解

目录 前言&#xff1a; 红黑树的概念&#xff1a; 红黑树的性质: 红黑树节点的定义&#xff1a; 红黑树的插入&#xff1a; 情况1&#xff1a;cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红 情况2&#xff1a;cur为红&#xff0c;p为红&#xff0c…

C++从入门到精通——类的作用域及类的实例化

类的作用域及类的实例化 前言一、类的作用域二、类的实例化引例类是对对象进行描述的示例 一个类可以实例化出多个对象示例 示例 前言 类的作用域是指类中定义的变量和方法的可见性和可访问性范围。在类的内部&#xff0c;所有成员&#xff08;包括属性和方法&#xff09;都具…

GIT版本管理使用示例

一、创建好远程代码仓库后&#xff0c;复制远程仓库的地址 二、新建一个文件夹&#xff0c;在文件夹里打开Git Bash Here 三、输入git clone 远程仓库地址&#xff0c;仓库就初始化完成了 四、新建一个文本文件&#xff0c;假设这是我们开发的代码 五、打开文本&#xff0c;假设…