ShardingSphere-JDBC垂直分片
什么是数据分片?
简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。
数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式:
垂直(纵向)切分:是按照不同的表(或者 Schema)来切分到不同的数据库(主机)之上
水平(横向)切分:是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面。
注意:分库分表必须是干净的库和表(不能有数据)
分片原则:
能不切分尽量不要切分。数据量不是很大的库或者表,尽量不要分片。
尽量按照功能模块分库,避免跨库join。
项目中可以使用ShardingSphere-JDBC加载不同库中的表进行操作
一、准备服务器
服务器规划:使用docker方式创建如下容器
- 主服务器:容器名server-user,端口3301
- 从服务器:容器名server-order,端口3302
1. 创建server-user容器
(1)创建容器
docker run -d \
-p 3301:3306 \
-v /liush/server/user/conf:/etc/mysql/conf.d \
-v /liush/server/user/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--name server-user \
mysql:8.0.29
(2)登录MySQL服务器
① 进入容器
docker exec -it server-user env LANG=C.UTF-8 /bin/bash
② 进入容器内的mysql命令行
mysql -uroot -proot
③ 修改默认密码插件
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
(3)创建数据库
CREATE DATABASE db_user;
USE db_user;
CREATE TABLE t_user (id BIGINT AUTO_INCREMENT,uname VARCHAR(30),PRIMARY KEY (id)
);
2. 创建server-order容器
(1)创建容器
docker run -d \
-p 3302:3306 \
-v /liush/server/order/conf:/etc/mysql/conf.d \
-v /liush/server/order/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--name server-order \
mysql:8.0.29
(2)登录MySQL服务器
① 进入容器:
docker exec -it server-order env LANG=C.UTF-8 /bin/bash
② 进入容器内的mysql命令行
mysql -uroot -proot
③ 修改默认密码插件
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
(3)创建数据库
CREATE DATABASE db_order;
USE db_order;
CREATE TABLE t_order (id BIGINT AUTO_INCREMENT,order_no VARCHAR(30),user_id BIGINT,amount DECIMAL(10,2),PRIMARY KEY(id)
);
二、程序实现
1. 创建实体类
@TableName("t_order")
@Data
public class Order {@TableId(type = IdType.AUTO)private Long id;private String orderNo;private Long userId;private BigDecimal amount;
}
2. 创建Mapper
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}
3. 配置垂直分片
垂直拆分: 从不同的库中加载多张不同的表在一个项目中使用
# 应用名称
spring.application.name=sharding-jdbc-demo
# 环境设置
spring.profiles.active=dev# 配置真实数据源
spring.shardingsphere.datasource.names=server-user,server-order# 配置第 1 个数据源
spring.shardingsphere.datasource.server-user.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-user.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-user.url=jdbc:mysql://192.168.100.201:3301/db_user
spring.shardingsphere.datasource.server-user.username=root
spring.shardingsphere.datasource.server-user.password=root# 配置第 2 个数据源
spring.shardingsphere.datasource.server-order.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-order.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-order.url=jdbc:mysql://192.168.100.201:3302/db_order
spring.shardingsphere.datasource.server-order.username=root
spring.shardingsphere.datasource.server-order.password=root# 标准分片表配置(数据节点)
# <table-name>逻辑表名:匹配 数据源名.真实表
#spring.shardingsphere.rules.sharding.tables.<table-name>.actual-data-nodes= # 由数据源名 + 表名组成,以小数点分隔。
spring.shardingsphere.rules.sharding.tables.t_user.actual-data-nodes=server-user.t_user
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=server-order.t_order
# 打印SQL
spring.shardingsphere.props.sql-show=true
user库,order主库+从库两个:如下配置
# 配置真实数据源
spring.shardingsphere.datasource.names=server-user,server-order# 配置第 1 个数据源:user库的数据源
spring.shardingsphere.datasource.server-user.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-user.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-user.url=jdbc:mysql://192.168.1.171:3326/db_user
spring.shardingsphere.datasource.server-user.username=root
spring.shardingsphere.datasource.server-user.password=123456# 配置第 2 个数据源:order库的数据源(order库可以配置读写分离)
spring.shardingsphere.datasource.server-order.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-order.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-order.url=jdbc:mysql://192.168.1.171:3316/mydb3
spring.shardingsphere.datasource.server-order.username=root
spring.shardingsphere.datasource.server-order.password=123456# 标准分片表配置(数据节点)
# <table-name>逻辑表名:匹配 数据源名.真实表
#spring.shardingsphere.rules.sharding.tables.<table-name>.actual-data-nodes= # 由数据源名 + 表名组成,以小数点分隔。
spring.shardingsphere.rules.sharding.tables.t_user.actual-data-nodes=server-user.t_user
spring.shardingsphere.rules.sharding.tables.t_account.actual-data-nodes=server-user.t_account
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=server-order.t_order
# 打印SQL
spring.shardingsphere.props.sql-show=true# =============为订单库 mydb3配置读写分离
# 配置第 2 个数据源的salve1数据源
spring.shardingsphere.datasource.order-slave1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.order-slave1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.order-slave1.url=jdbc:mysql://192.168.1.171:3307/mydb3
spring.shardingsphere.datasource.order-slave1.username=root
spring.shardingsphere.datasource.order-slave1.password=123456
# 配置第 2 个数据源的salve2数据源
spring.shardingsphere.datasource.order-slave2.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.order-slave2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.order-slave2.url=jdbc:mysql://192.168.1.171:3308/mydb3
spring.shardingsphere.datasource.order-slave2.username=root
spring.shardingsphere.datasource.order-slave2.password=123456
## 读写分离配置
# 读写分离类型,如: Static,Dynamic
# Static:数据源在配置文件中是直接配置的
# Dynamic:数据源是由程序动态读取的
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.type=Static
# 写数据源名称
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.write-data-source-name=server-order
# 读数据源名称,多个从数据源用逗号分隔
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.read-data-source-names=server-order,order-slave1,order-slave2
# 负载均衡算法名称
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.load-balancer-name=alg_round
# 负载均衡算法配置
# 负载均衡算法类型:ROUND_ROBIN、RANDOM、WEIGHT
spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_round.type=ROUND_ROBIN
# 负载均衡算法属性配置:type=WEIGHT 的时候配置
#spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.props.slave1=1
#spring.shardingsphere.rules.readwrite-splitting.load-balancers.alg_weight.props.slave2=1
三、测试垂直分片
@SpringBootTest
public class ShardingTest {@Autowiredprivate UserMapper userMapper;@Autowiredprivate OrderMapper orderMapper;/*** 垂直分片:* user数据自动写入server-user服务器的的t_user表* order数据自动写入server-order服务器的的t_order表*/@Testpublic void testInsert1(){User user = new User();user.setUname("helen");userMapper.insert(user);Order order = new Order();order.setOrderNo("ATGUIGU");order.setAmount(new BigDecimal(100));order.setUserId(user.getId());orderMapper.insert(order);}
}相关文章:
ShardingSphere-JDBC垂直分片
什么是数据分片? 简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。 数据的切分(Sharding)根据…...
Node 04-http模块
HTTP 协议 概念 HTTP(hypertext transport protocol)协议;中文叫 超文本传输协议 是一种基于TCP/IP的应用层通信协议 这个协议详细规定了 浏览器 和 万维网 服务器 之间互相通信的规则 协议中主要规定了两个方面的内容: 客户端࿱…...
记录项目过程中的编译错误及解决方法(持续更新中)
文章目录 前言 前言 记录做项目的时候编译问题,好记性不如烂笔头,下次碰到相同的问题也可以方便查阅 2023.3.22 问题1:每次跑回归测试的时候,总是会出现错误,总共只有5个test,单独跑这个case的时候是没有…...
Android Hilt依赖注入框架
Hilt 是一个基于 Dagger2 的依赖注入框架,它提供了一些简便的注入方式来简化开发者在 Android 应用中使用 Dagger2 的复杂性。Hilt 旨在简化 Android 应用程序中的依赖注入实现,使开发人员能够更轻松地管理依赖项和应用程序的组件。 Hilt 的主要目标是提…...
LeetCode:59. 螺旋矩阵 II
🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 一、🌱59. 螺旋矩阵 II 题目描述:给你一个正整数 n ,…...
信息安全复习六:公开密钥密码学
一、章节梗概 1.公开密钥密码模型的基本原理 2.两个算法:RSA&D-H算法 主要内容 1.对称密钥密码的密钥交换问题 2.公钥密码模型的提出 3.设计公钥密码的基本要求 4.数字签名 5.RSA算法 6.公钥密码的特征总结 二、对称密钥密码 对称加密算法中,数据…...
YOLOv8 更换主干网络之 ShuffleNetv2
《ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design》 目前,神经网络架构设计多以计算复杂度的间接度量——FLOPs为指导。然而,直接的度量,如速度,也取决于其他因素,如内存访问成本和平台特性。因此,这项工作建议评估目标平台上的直接度量,而…...
async/await最详细的讲解
一、async 和 await 在干什么 async 是“异步”的简写,而 await 的意思是等待。async 用于申明一个 function 是异步的,而 await 等待某个操作完成。 async/await 是一种编写异步代码的新方法。之前异步代码的方案是回调和 promise。 async/await 像 p…...
学习数据结构第6天(栈的基本概念)
栈的基本概念 栈的定义栈的基本操作栈的存储结构 栈的定义 栈(Stack)是一种基于先进后出(FILO)或者后进先出(LIFO)的数据结构,是一种只允许在一端进行插入和删除操作的特殊线性表。 栈按照先进后出的原则存储数据,先进入的数据被压入栈底,最…...
自动化添加时间戳版本号
自动化添加时间戳版本号 前言一、静态资源二、版本号的来源三. 版本信息的位置四. 添加时间戳版本号1. 手动添加2. 自动化生成 前言 软件开发和发布过程中,版本是个极其重要的因素。大至操作系统,小到功能组件,都会涉及到版本相关的问题。 …...
【C语言】指针进阶[上] (字符、数组指针、指针数组、数组传参和指针传参)
简单不先于复杂,而是在复杂之后。 目录 1. 字符指针 面试题 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名 VS 数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二…...
软件测试外包干了4年,感觉废了..
先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...
ai改写句子软件-ai改写
AI免费伪原创:助力网站内容升级 您是否曾经为网站优化而烦恼,无论是内容更新还是SEO优化,都需要大量的时间和精力。但是,您是否知道,现在有一款能够使用AI技术来帮助您完成这些任务,而且还是免费的呢&…...
zabbix监控linux主机
1.本实验使用centos7主机,IP地址为10.1.60.115,firewalld和selinux服务已关闭 2.下载zabbix yum源(与zabbix server用一样的版本) rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm 3.安装zabbix客户…...
编程中泛型的使用规则和限制是什么?
泛型是一种程序设计风格,它允许程序员在编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。泛型主要用于实现通用的数据结构,例如集合、映射、列表等,使得这些数据结构可以存储多种类型的元素。 在泛型使用之…...
【工具】使用VS Code调试Docker Container中的代码
目录 使用VS Code调试Docker Container中的Autoware.ai代码第一种方法 -- 在VS Code中进行DebugStep1Step2Step3Step4c_cpp_properties.jsonlaunch.jsonsettings.jsontask.json Step5Step6Step7参考链接 第二种方法 -- cmake重新编译cmake使用方法(简介)…...
ZVL3网络分析仪
ZVL3 Rohde&Schwarz ZVL3 3G矢量网络分析仪|罗德与施瓦茨 9KHz至3GHz 罗德与施瓦茨Rohde&Schwarz 性能特点: 频率范围 9kHz至3GHz/6 GHz(典型值为5kHz) 测量时间(201个测量点,以校准的双端口) <75ms 数据传输(201个测量点) 在100Mbit/sLAN…...
TCP协议
传输层(协议) TCP协议 三次握手协议保证连接建立 四次挥手,利用这个协议断开连接,而且保证连接通道里面数据已经处理完毕 客户端(Socket): 1、创建客户端的Socket对象(Socket)与指…...
69. x 的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1࿱…...
Webshell应急响应指南
Webshell应急响应指南 1.Webshell 排查2.入侵时间确定3.Web日志分析4.漏洞分析5.漏洞复现6.清除Webshell并修复漏洞7.Webshell 防御方法1.Webshell 排查 可利用 Webshell 扫描工具(如 D 盾,河马)对应用部署目录进行扫描,如网站D:\WWW\目录 或者将当前网站目录文件与此前备…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
