ShardingSphere分库分表实战之水平分库和水平分表

news2024/10/7 2:21:52

在这里插入图片描述

🚀 ShardingSphere 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 ShardingSphere 🚀

在这里插入图片描述
在这里插入图片描述

🍔 目录

    • 🍀 一.ShardingSphere项目实战集群环境准备
    • 🍀 二.水平分库 & 水平分表之数据库配置
      • 🥦 2.1 需求分析说明
      • 🥦 2.2 数据库创建
    • 🍀 三.SpringBoot项目中水平分表的配置
      • 🥦 3.1 配置文件 - 基本配置
      • 🥦 3.2 配置文件 - 数据源
      • 🥦 3.3 配置文件 - 配置数据节点
      • 🥦 3.4 配置文件 - 配置分片策略(包括分片键和分片算法)
        • 🍈 3.4.1 分片键配置
        • 🍈 3.4.2 分片算法配置
      • 🥦 3.5 配置文件 - 分布式序列配置
        • 🍈 3.5.1 UUID
        • 🍈 3.5.2 SNOWFLAKE
    • 🍀 四.SpringBoot项目相关代码准备
      • 🥦 4.1 实体类编写
    • 🍀 五.水平分库 & 水平分表测试
      • 🥦 5.1 水平分库 & 水平分表测试
      • 🥦 5.2 结果查询
    • 🍀 六.总结
    • 💬 七.共勉

🍀 一.ShardingSphere项目实战集群环境准备

关于项目启动需要提前准备并进行配置的环境我在上一篇文章中做了详细的讲解,如果还有问题的同学可以参考上一篇文章进行学习。

ShardingSphere项目实战集群环境准备
ShardingSphere分库分表实战之水平分表

🍀 二.水平分库 & 水平分表之数据库配置

这篇文章是在实现了水平分库后,又加入了水平分表,更加综合,如果有问题的同学可以参考我上一篇文章进行学习!
ShardingSphere分库分表实战之水平分表

🥦 2.1 需求分析说明

  1. 在node1-shardingsphere 192.168.10.132服务器上, 创建数据库 ljw_course_db1;然后创建表 t_course_1 、 t_course_2;
  2. 在node2-shardingsphere 192.168.10.133服务器上, 创建数据库 ljw_course_db2;然后创建表 t_course_1 、 t_course_2;
  3. 约定规则:
  • 水平分库规则 :以user_id为分片键,分片策略为user_id % 2 +1,user_id为偶数操作db1数据源,否则操作db2数据源;
  • 水平分表规则 :以cid为分片键,分片策略为Math.abs(cid.hashCode()) % 2 + 1 为偶数的时候,数据插入对应服务器的t_course_1表,反之,数据插入对应服务器的t_course_2

🥦 2.2 数据库创建

CREATE TABLE `t_course_1` (
  `cid` bigint(20) NOT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `corder_no` bigint(20) DEFAULT NULL,
  `cname` varchar(50) DEFAULT NULL,
  `brief` varchar(50) DEFAULT NULL,
  `price` double DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `t_course_2` (
  `cid` bigint(20) NOT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `corder_no` bigint(20) DEFAULT NULL,
  `cname` varchar(50) DEFAULT NULL,
  `brief` varchar(50) DEFAULT NULL,
  `price` double DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在这里插入图片描述

🍀 三.SpringBoot项目中水平分表的配置

sharding-jdbc进行分库分表的配置,主要包括:数据源、分片键、主键生成策略、分片策略等。

注意:项目实战过程中有不熟的概念可以参考对应的官方网站,因为内容较多,本篇文章不做过多详细的说明,包括使用到的很多知识内容,官网开发手册都有更加详细的指导说明。

ShardingSphere开发者手册

🥦 3.1 配置文件 - 基本配置

# 应用名称
spring.application.name=sharding-jdbc-demo
# 打印SQL语句
spring.shardingsphere.props.sql-show=true
# SQL输出日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

🥦 3.2 配置文件 - 数据源

# 定义多个数据源
spring.shardingsphere.datasource.names = db1,db2

# 数据源1连接信息配置
spring.shardingsphere.datasource.db1.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db1.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.db1.url = jdbc:mysql://192.168.10.132:3306/ljw_course_db1?characterEncoding=UTF-8&useSSL=false
spring.shardingsphere.datasource.db1.username = root
spring.shardingsphere.datasource.db1.password = root

# 数据源2连接信息配置
spring.shardingsphere.datasource.db2.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.db2.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.db2.url = jdbc:mysql://192.168.10.132:3306/ljw_course_db2?characterEncoding=UTF-8&useSSL=false
spring.shardingsphere.datasource.db2.username = root
spring.shardingsphere.datasource.db2.password = root

🥦 3.3 配置文件 - 配置数据节点

表达式 db1.t_course_$->{1..2}

​ $ 会被大括号中的 {1..2} 所替换, ${begin..end} 表示范围区间

​ 会有两种选择: db1.t_course_1db1.t_course_2

在这里插入图片描述

# 标准分片表配置  -  配置数据节点
# 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。
spring.shardingsphere.rules.sharding.tables.t_course.actual-data-nodes=db$->{1..2}.t_course_$->{1..2}

注意:此处使用了行表达式,想深入了解的同学可以参考官网进行学习!

行表达式官方网站学习手册

🥦 3.4 配置文件 - 配置分片策略(包括分片键和分片算法)

分片相关内容官方网站学习手册

🍈 3.4.1 分片键配置

# 水平分库配置
# 分片键名称
spring.shardingsphere.rules.sharding.tables.t_course.database-strategy.standard.sharding-column=user_id

# 水平分表配置
# 分片键名称
spring.shardingsphere.rules.sharding.tables.t_course.table-strategy.standard.sharding-column=cid

🍈 3.4.2 分片算法配置

在配置分片算法之前,我们做如下的约定:

  • 水平分库规则 :以user_id为分片键,分片策略为user_id % 2 +1,user_id为偶数操作db1数据源,否则操作db2数据源;
  • 水平分表规则 :以cid为分片键,分片策略为Math.abs(cid.hashCode()) % 2 + 1 为偶数的时候,数据插入对应服务器的t_course_1表,反之,数据插入对应服务器的t_course_2
# 水平分库配置
# 分片算法
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_course.database-strategy.standard.sharding-algorithm-name=table-inline
# 分片算法类型  --> 行表达式分片算法
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.type=INLINE
# 分片算法的属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.table-inline.props.algorithm-expression=db$->{user_id % 2 + 1}

# 水平分表配置
# 分片算法
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_course.table-strategy.standard.sharding-algorithm-name=inline-hash-mod
# 分片算法类型  --> hash取模算法
spring.shardingsphere.rules.sharding.sharding-algorithms.inline-hash-mod.type=INLINE
# 分片算法的属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.inline-hash-mod.props.algorithm-expression=t_course_$->{Math.abs(cid.hashCode()) % 2 + 1}

🥦 3.5 配置文件 - 分布式序列配置

分布式主键相关内容官方网站学习手册

🍈 3.5.1 UUID

采用 UUID.randomUUID() 的方式产生分布式主键。

实体类中对应数据库表中的主键ID代码配置

	// 省略部分代码

	// 核心配置代码
    //通过MyBatisPlus生成主键
    @TableId(value="cid",type = IdType.ASSIGN_ID)
    private Long id;
    
    // 省略部分代码

🍈 3.5.2 SNOWFLAKE

在分片规则配置模块可配置每个表的主键生成策略,默认使用雪花算法(snowflake)生成 64bit 的长整型数据。

雪花算法是由 Twitter 公布的分布式主键生成算法,它能够保证不同进程主键的不重复性,以及相同进程主键的有序性。

配置文件:

# 分布式序列配置
# 分布式序列的列名
spring.shardingsphere.rules.sharding.tables.t_course.key-generate-strategy.column=cid
# 分布式序列-算法名称
spring.shardingsphere.rules.sharding.tables.t_course.key-generate-strategy.key-generator-name=alg-snowflake
# 分布式序列-算法类型
spring.shardingsphere.rules.sharding.key-generators.alg-snowflake.type=SNOWFLAKE

实体类中对应数据库表中的主键ID代码配置

	// 省略部分代码

	// 核心配置代码
    @TableId(type = IdType.AUTO)
    private Long id;
    
    // 省略部分代码

🍀 四.SpringBoot项目相关代码准备

🥦 4.1 实体类编写

编写与数据库表对应的实体类

@TableName("t_course")
@Data
@ToString
public class Course {

    @TableId(type = IdType.AUTO)
    private Long cid;

    private Long userId;

    private Long corderNo;

    private String cname;

    private String brief;

    private Double price;

    private Integer status;

}

🍀 五.水平分库 & 水平分表测试

🥦 5.1 水平分库 & 水平分表测试

	@Autowired(required = false)
    private CourseMapper courseMapper;

    @Test
    public void testInsertCourse(){
        for (int i = 0; i < 30; i++) {
            Course course = new Course();
            // 注意: cid使用雪花算法配置了(还可以使用MybatisPlus UUID),此处不用配置
            course.setUserId(1000L+i);
            course.setCname("ShardingSphere");
            course.setBrief("ShardingSphere保姆级学习教程!!!");
            course.setPrice(99L);
            course.setStatus(1);
            courseMapper.insert(course);
        }
    }

🥦 5.2 结果查询

项目运行成功 !

在这里插入图片描述

db1数据库中course1表插入数据成功!

在这里插入图片描述

db1数据库中course2表插入数据成功!

在这里插入图片描述

db2数据库中course1表插入数据成功!
在这里插入图片描述

db2数据库中course2表插入数据成功!

在这里插入图片描述

🍀 六.总结

本篇文章主要讲解了ShardingSphere分库分表实战之水平分库和水平分表,下节预告,ShardingSphere分库分表实战之绑定表,敬请期待。

💬 七.共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

边框动画 单边追随

时间短就直接看第三个使用 clip-path animation 完成。 <!DOCTYPE html> <html><head><style>/* 第一个 */.btn {width: 100px;height: 40px;background: yellow;position: relative;display: flex;align-items: center;justify-content: center;bor…

Unity游戏源码分享-单车骑行游戏

Unity游戏源码分享-单车骑行游戏 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88057717

【问题总结】Docker环境下备份和恢复postgresql数据库

目录 文章目录 以从备份恢复forest_resources库为例一、备份数据库二、需要还原的数据库准备1 删除掉远程的库。2 重新创建一个空的库。可以使用sql3 找到数据库存放的路径&#xff0c;并将备份文件上传到对应的路径下 三、 进入docker容器内部&#xff0c;执行数据库恢复附录…

C++拷贝构造函数原理解析

喵~ 一、构造函数1.1 默认构造函数1.2 自定义的默认构造函数1.3 自定义带参数的构造函数 二、拷贝构造函数的基本使用2.1 浅拷贝和深拷贝&#xff08;原理及区别&#xff09; 一、构造函数 在C面向对象的学习中&#xff0c;对于构造函数应该并不陌生&#xff0c;有默认的构造函…

第47节:cesium 热力图效果(含源码+视频)

结果示例: 完整源码: index.html中增加<script src="./static/lib/heatmap.js"></script> heatmap.js /** heatmap.js v2.0.5 | JavaScript Heatmap Library** Copyright 2008-2016 Patrick Wied <heatmapjs@patrick-wied.at> - All rights re…

了解 3DS MAX 3D摄像机跟踪设置:第 7 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 在SynthEyes中跟踪素材 步骤 1 打开SynthEyes软件。 打开合成之眼 步骤 2 在跟踪素材之前&#xff0c;您需要设置首选项。因为&#xff0c;你 稍后将在 3ds Max 中工作&#xff0c;必须根据 3ds Max…

双电源并用问题与解决方案

双电源并用问题 曾经有客户在电源模块应用过程中出现过这样的应用场景&#xff0c;如下图1所示。客户使用两路电源给后端电路进行供电&#xff0c;要求在不断电的情况下切换输入电源&#xff0c;此过程中发现后端电路会出现损坏。对各个节点波形进行分析后发现&#xff0c;在给…

在VMware上安装Linux虚拟机

一&#xff0c;下载CentOS操作系统 下载地址&#xff1a;https://vault.centos.org/7.6.1810/isos/x86_64/ 打开下载网址&#xff0c;找到centos-7-x86_64-DVD-1810.iso&#xff0c;下载即可。 下载的漫长等待。。。。。 二、创建虚拟机 打开下载好的VMware。 点击创建新的虚拟…

SPI 的初识

SPI 介绍 Q: SPI 是什么&#xff1f; A: SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff08;比IIC快&#xff09;&#xff0c;全双工&#xff08;IIC是半双工&#xff09;&#xff0c;同步的通信总线&#xf…

【AUTOSAR】:车载以太网

车载以太网 References参考文献车载以太网的物理连接MACPHYPHY的主从关系100BASE-T1回音消除车载以太网的应用层协议References参考文献 汽车软件通信中间件SOME/IP简述100BASE-T1以太网:汽车网络的发展车载以太网的物理连接 MAC MAC(Media Access Control介质访问)一般集成…

数字贸易时代如何高效管理水果出口外贸业务

目前中国水果出口的国家有很多&#xff0c;其中包括但不限于以下几个国家&#xff1a;美国、日本、韩国、俄罗斯、德国、法国、英国、荷兰、澳大利亚、新加坡、马来西亚、泰国、印度尼西亚、巴西、阿联酋等。2023年前5个月&#xff0c;出口目的国家/地区排名前十的分别为&#…

【网络技术】计算机网络介绍

写在前面 计算机网络是指将多台计算机连接起来&#xff0c;使它们能够相互通信和共享资源的系统。 它是现代计算机科学中的重要分支之一&#xff0c;为全球范围内的信息交流和数据传输提供了基础。 本文将介绍计算机网络的基础概念、体系结构、协议、常见问题等的知识。 一、基…

uni-app:scroll-view滚动盒子,实现横(纵)向滚动条

参照&#xff1a;scroll-view | uni-app官网 (dcloud.net.cn) 样式&#xff1a; 代码&#xff1a; <template><view class"box"><scroll-view scroll-x"true" class"scroll"><view class"box1"> <view c…

ElasticSearch搜索相关性及打分的相关原理

文章目录 一、相关性和打分简介二、TF-IDF得分计算公式三、BM25&#xff08;Best Matching 25&#xff09;四、使用explain查看TF-IDF五、通过Boosting控制相关度 一、相关性和打分简介 举个例子来说明&#xff1a; 假设有一个电商网站&#xff0c;用户在搜索框中输入了关键词&…

前端 mock 数据的几种方式

目录 接口demo Better-mock just mock koa webpack Charles 总结 具体需求开发前&#xff0c;后端往往只提供接口文档&#xff0c;对于前端&#xff0c;最简单的方式就是把想要的数据写死在代码里进行开发&#xff0c;但这样的坏处就是和后端联调前还需要再把写死的数据…

计算机视觉和滤帧技术

01 什么是计算机视觉 进入主题之前&#xff0c;先聊聊计算机视觉。 计算机视觉是指利用摄像头和电脑识别、跟踪和测量目标&#xff0c;并进行图像处理&#xff0c;使其适合人眼观察或仪器检测。作为一个科学学科&#xff0c;计算机视觉模拟生物视觉&#xff0c;旨在实现图像和视…

DAY48:动态规划(十一)爬楼梯(进阶版)+零钱兑换(理解DP数组“装满“含义)

文章目录 70.爬楼梯&#xff08;改版题目&#xff09;思路遍历顺序 完整版总结面试情况 322.零钱兑换&#xff08;DP数组含义的进一步理解&#xff09;思路DP数组含义递推公式遍历顺序初始化最开始的写法debug逻辑错误&#xff1a;背包不一定装满 修改完整版递归逻辑分析背包是…

极值理论 EVT、POT超阈值、GARCH 模型分析股票指数VaR、条件CVaR:多元化投资组合预测风险测度分析...

全文链接&#xff1a;http://tecdat.cn/?p24182 本文用 R 编程语言极值理论 (EVT) 以确定 10 只股票指数的风险价值&#xff08;和条件 VaR&#xff09;&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 使用 Anderson-Darling 检验对 10 只股票的组合数据进行…

EFCore—context在其他程序集时如何进行数据迁移

场景 解决方案&#xff1a; 代码示例&#xff1a; 场景 一般来说&#xff0c;如果efcore进行数据迁移的步骤如下 安装nuget包创建实体类创建config创建dbcontext 然后执行如下命令就可以成功迁移了 Add-Migration Init Update-Database 一执行&#xff0c;报错 Unable t…

(四)「消息队列」之 RabbitMQ 路由(使用 .NET 客户端)

0、引言 先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口&#xff08;5672&#xff09;上运行。如果您使用了不同的主机、端口或凭证&#xff0c;则要求调整连接设置。 获取帮助 如果您在阅读本教程时遇到问题&#xff0c;可以通过邮件列表或者 RabbitMQ 社区…