使用shardingsphere实现mysql数据库分片

在大数据时代,随着业务数据量的不断增长,单一的数据库往往难以承载大规模的数据处理需求。数据库分片(Sharding)是一种有效的数据库扩展技术,通过将数据分布到多个数据库实例上,提高系统的性能和可扩展性。

ShardingSphere 是一款开源的分布式数据库中间件,可以帮助我们轻松实现数据库分片。

本文的目的是介绍如何快速上手使用 ShardingSphere 来实现 MySQL 数据库分片。

一、ShardingSphere 简介

ShardingSphereApache 基金会下的一个开源项目,提供分布式数据库中间件解决方案。ShardingSphere 已经在2020年4月16日从 Apache 孵化器毕业,成为 Apache 顶级项目。其主要功能包括数据分片(Sharding)、读写分离、分布式事务以及数据加密等。ShardingSphere 主要由三个核心组件组成:

  1. Sharding-JDBC:轻量级的 Java 框架,直接集成在应用程序中,提供数据库分片、读写分离等功能。需要在 spring boot 中集成,编写相关的配置。如果分片策略用默认的4种,那可以只改配置就好了。如果分片策略很特殊,可以通过实现抽象类,写自定义的方法进行分片分库。
  2. Sharding-Proxy:独立部署的数据库代理,支持所有兼容 MySQLPostgreSQL 协议的客户端。原来程序连接到这个代理就可以实现分片和分库。程序不需要任何改变。
  3. Sharding-Sidecar(Plan):云原生环境下的数据库代理,与 Kubernetes 等平台集成。

1.1 对比

Sharding-JDBCSharding-ProxySharding-Sidecar
数据库任意MySQL/PostgreSQLMySQL/PostgreSQL
连接消耗数
异构语言仅Java任意任意
性能损耗低损耗略高损耗低
无中心化
静态入口

1.2 核心概念

分库分表中最重要的核心概念有两个,即路由键分片算法,这两个将决定数据分片的位置,先稍微解释一下这两个概念:

  • 路由键:也被称为分片键,也就是作为数据分片的基准字段,可以是一个或多个字段组成。

  • 分片算法:基于路由键做一定逻辑处理,从而计算出一个最终节点位置的算法。

举个例子来感受一下,好比按 user_id 将用户表数据分片,每八百万条数据划分一张表,那在这里,user_id 就是路由键,而按user_id做范围判断则属于分片算法,一张表中的所有数据都会依据这两个基础,后续对所有的读写SQL进行改写,从而定位到具体的库、表位置。

在这里插入图片描述

在Sharding-Sphere这套技术中,无论是JDBC还是Proxy产品,工作的流程都遵循上述这个原则,里面除开上面介绍的路由键和分片算法的概念外,还有逻辑表、真实表、数据节点这三个概念:

  • 逻辑表:提供给应用程序操作的表名,程序可以像操作原本的单表一样,灵活的操作逻辑表。

  • 真实表:在各个数据库节点上真实存在的物理表,但表名一般都会和逻辑表存在偏差。

  • 数据节点:主要是用于定位具体真实表的库表名称,如DB1.tb_user1、DB2.tb_user2…

  • 均匀分布:指一张表的数量在每个数据源中都是一致的。

  • 自定义分布:指一张表在每个数据源中,具体的数量由自己来定义,上图就是一种自定义分布。

以 Java 程序为例,编写业务代码时写的 SQL 语句,会直接基于逻辑表进行操作,逻辑表并不是一种真实存在的表结构,而是提供给 Sharding-Sphere 使用的,当 Sharding-Sphere 接收到一条操作某张逻辑表的 SQL语句时,它会根据已配置好的路由键和分片算法,对相应的 SQL语句进行解析,然后计算出 SQL要落入的数据节点,最后再将语句发给具体的真实表上处理即可。

1.3 Sharding-Sphere中的表概念

除开上述的一些核心概念外,在Sharding-Sphere中为了解决某些问题,同时还有一些表概念,如广播表、绑定表、单表、动态表等,接着简单介绍一下这些概念。

1.3.1 绑定表

一般的项目基本上都会存在主外键,虽然不会在表上添加主外键约束,但也会从逻辑上保障主外键关系,但经过水平分库后,所有的读写操作会基于路由键去分片。

那此时以订单表、订单详情表为例,假设用户选择了三个购物车的商品提交订单,此时会产生

  • 一条订单记录
  • 以及对应的三条订单详情记录。

假设商品库有两个水平节点,两个商品库都具备订单表、订单详情表,而订单表的路由键是 order_id,订单详情表的路由键是 order_info_id ,数据分片的路由算法为取模,那此时数据的落库情况为:

  • 订单详情2数据落入 DB0 商品库中。
  • 订单详情1、详情3数据落入 DB1 商品库中。

但此时订单表订单详情表的数据是存在外键关系的,如果按照上述的路由方式去对数据做分片,最终就会导致通过 order_id=1 的订单 ID 查询订单详情时,只能在 DB1 中查询到两条订单详情数据,这个问题显然是业务上无法接受的。通常我们会将这两张表配置为绑定表,以确保它们在同一个分片中,从而优化订单相关的联表查询操作。

1.3.2 广播表

广播表是指在所有分片数据源中都存在的一张表,且数据内容完全相同。这种表通常用于存储一些公共的、全局性的数据,比如系统配置、国家代码等。由于广播表的数据是全局一致的,当有更新操作时,需要将变更同步到所有的分片数据源中。

  1. 在不同的库需要数据的表中冗余字段,把常用的字段放到需要要数据的表中,避免跨库连表。
  2. 选择同步数据,通过广播表/网络表/全局表将对应的表数据直接完全同步一份到相应库中。
  3. 在设计库表拆分时创建 ER 绑定表,具备主外键的表放在一个库,保证数据落到同一数据库
  4. Java 系统中组装数据,通过调用对方服务接口的形式获取数据,然后在程序中组装后返回

这四种方案都能够解决需要跨库 Join 的问题,但第二种方案提到了广播表/网络表/全局表似乎之前没听说过对嘛,这其实是分库分表中的名词。场景:假设有一个 t_country 表,存储国家和地区的信息,这些信息在整个系统中是统一的,因此可以将 t_country 作为广播表,在所有数据库实例中都保存一份副本。

但往往垂直分库的场景中,第四种方案是最常用的,因为分库分表的项目中,Java 业务系统那边也绝对采用了分布式架构,因此通过调用对端 API 接口来获取数据,是分布式系统最为常见的一种现象。

1.3.3 单表

单表的含义比较简单,并非所有的表都需要做分库分表操作,所以当一张表的数据无需分片到多个数据源中时,就可将其配置为单表,这样所有的读写操作最终都会落入这一张单表中处理。

二、ShardingSphere-JDBC

Sharding-JDBCShardingSphere 的第一个产品,也是 ShardingSphere 的前身。 它定位为轻量级 Java 框架,在 JavaJDBC层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。

Apache ShardingSphere-JDBC 可以通过Java 和 YAML 这 2 种方式进行配置,开发者可根据场景选择适合的配置方式。

2.2 原理

Sharding-JDBC 中的路由结果是通过分片字段和分片方法来确定的,如果查询条件中有 id 字段的情况还好,查询将会落到某个具体的分片

如果查询没有分片的字段,会向所有的db或者是表都会查询一遍,让后封装结果集给客户端。

在这里插入图片描述

接下来会搭建一个简单的SpringBoot+MyBatis项目,结合Sharding-Sphere-JDBC实现水平分库~

spring boot整合

<!-- 分表分库依赖 -->
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.2.1</version>
</dependency>

数据库

接着先在数据库中创建db_sharding_01、db_sharding_02两个库,我这里用伪集群的方式搭建水平库,毕竟线上只需要把数据库地址改为不同的机器IP即可

接着分别再在两个水平库中,创建用户表、订单表、订单详情表、商品表(两张),这四张表是接下来用于测试的表,SQL如下:

drop table if exists `user_info`;
create table `user_info`  (`user_id` bigint not null comment '用戶id',`user_name` varchar(255) comment '用戶姓名',`user_sex` varchar(255) comment '用戶性別',`user_age` int(8) not null comment '用戶年齡',primary key (`user_id`) using btree
)
engine = InnoDB
character set = utf8
collate = utf8_general_ci 
row_format = compact;drop table if exists `shoping_00`;
create table `shoping_00`  (`shoping_id` bigint not null comment '商品id',`shoping_name` varchar(255) comment '商品名称',`shoping_price` int(8) not null comment '商品价格',primary key (`shoping_id`) using btree
)
engine = InnoDB
character set = utf8
collate = utf8_general_ci 
row_format = compact;drop table if exists `shoping_01`;
create table `shoping_01`  (`shoping_id` bigint not null comment '商品id',`shoping_name` varchar(255) comment '商品名称',`shoping_price` int(8) not null comment '商品价格',primary key (`shoping_id`) using btree
)
engine = InnoDB
character set = utf8
collate = utf8_general_ci 
row_format = compact;drop table if exists `order`;
create table `order`  (`order_id` bigint not null comment  '订单号',`order_price` int(8) not null comment '订单总金额',`user_id` bigint not null comment '用戶id',primary key (`order_id`) using btree
) 
engine = InnoDB
character set = utf8
collate = utf8_general_ci 
row_format = compact;drop table if exists `order_info`;
create table `order_info`  (`order_info_id` bigint not null comment  '订单详情号',`order_id`  bigint not null comment '订单号',`shoping_name` varchar(255)  comment '商品名称',`shoping_price` int(8) not null comment '商品价格',primary key (`order_info_id`) using btree,index `key_order_id`(`order_id`) using btree
)
engine = InnoDB
character set = utf8
collate = utf8_general_ci 
row_format = compact;

分库分表的核心配置

Sharding-Sphere的所有产品对业务代码都是零侵入的,无论是Sharding-JDBC也好,Sharding-Proxy也罢,都不需要更改业务代码,这也就意味着大家在分库分表环境下做业务开发时,可以像传统的单库开发一样轻松,Sharding-Sphere中最主要的是对配置文件的更改,Sharding-JDBC主要修改application.properties/yml文件,Sharding-Proxy主要修改自身的配置文件。

多数据源配置

spring:shardingsphere:mode:type: Standalonerepository:type: JDBCdatasource:names: ds0,ds1ds0:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: 「数据库节点1的地址」username: 「数据库节点1的账号」password: 「数据库节点1的密码」ds1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: 「数据库节点2的地址」username: 「数据库节点1的账号」password: 「数据库节点1的密码」

上述这组配置中,需要通过names配置多个数据源的别名,接着需要为每个别名配置对应的数据源信息,按照上述方式编写好配置文件后,则表示完成了多数据源的配置。

多数据源可用性测试

为了确保多数据源的可用性,接着先简单配置一张表:

spring:shardingsphere:props:sql-show: truerules:sharding:tables:shoping:actual-data-nodes: ds0.shoping_00

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

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

相关文章

详细解读,F5服务器负载均衡的技术优势

在现代大规模、高流量的网络使用场景中&#xff0c;为应对高并发和海量数据的挑战&#xff0c;服务器负载均衡技术应运而生。但凡知道服务器负载均衡这一名词的&#xff0c;基本都对F5有所耳闻&#xff0c;因为负载均衡正是F5的代表作&#xff0c;换句通俗易懂的话来说&#xf…

曲面构件的布尔运算

1.前言 布尔运算算法有多种&#xff0c;可以根据几何数据表达方式分为Brep布尔运算、CSG布尔运算、网格布尔运算等&#xff0c;而网格布尔运算又又多种&#xff0c;如BSP方式、八叉树方式&#xff0c;博主实现过Brep布尔运算、BSP和八叉树两种网格布尔运算。详细可参考博主文章…

threejs加载高度图渲染点云,不支持tiff

问题点 使用的point来渲染高度图点云&#xff0c;大数据图片无效渲染点多&#xff08;可以通过八叉树过滤掉无效点增加效率&#xff0c;这个太复杂&#xff09;&#xff0c;但是胜在简单能用 效果图 code 代码可运行&#xff0c;无需npm <!DOCTYPE html> <html la…

Springboot + netty + rabbitmq + myBatis+mysql流量消峰

目录 0.为什么用消息队列1.代码文件创建结构2.pom.xml文件3.三个配置文件开发和生产环境4.Rabbitmq 基础配置类 TtlQueueConfig5.建立netty服务器 + rabbitmq消息生产者6.建立常规队列的消费者 Consumer7.建立死信队列的消费者 DeadLetterConsumer8.建立mapper.xml文件9.建立ma…

使用 Higress AI 插件对接通义千问大语言模型

前言 什么是 AI Gateway AI Gateway 的定义是 AI Native 的 API Gateway&#xff0c;是基于 API Gateway 的能⼒来满⾜ AI Native 的需求。例如&#xff1a; 将传统的 QPS 限流扩展到 token 限流。将传统的负载均衡/重试/fallback 能力延伸&#xff0c;支持对接多个大模型厂…

Xcode16 iOS18 编译问题适配

问题1&#xff1a;ADClient编译报错问题 报错信息 Undefined symbols for architecture arm64:"_OBJC_CLASS_$_ADClient", referenced from:in ViewController.o ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit co…

【Redis】初识 Redis

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. Redis是什么2. 浅谈分布式3. Redis的特性3.1 在内存中存储3.2 可编程性3.3 扩展性3.4 持久化3.5 集群3.6 …

C++ 刷题 使用到的一些有用的容器和函数

优先队列 c优先队列priority_queue&#xff08;自定义比较函数&#xff09;_c优先队列自定义比较-CSDN博客 373. 查找和最小的 K 对数字 - 力扣&#xff08;LeetCode&#xff09; 官方题解&#xff1a; class Solution { public:vector<vector<int>> kSmallestP…

如何检测并阻止机器人活动

恶意机器人流量逐年增加&#xff0c;占 2023 年所有互联网流量的近三分之一。恶意机器人会访问敏感数据、实施欺诈、窃取专有信息并降低网站性能。新技术使欺诈者能够更快地发动攻击并造成更大的破坏。机器人的无差别和大规模攻击对所有行业各种规模的企业都构成风险。 但您的…

【含文档】基于Springboot+微信小程序 的高校二手商品交易平台(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

OJ在线评测系统 后端 判题机模块预开发 架构分析 使用工厂模式搭建

判题机模块预开发(架构师)(工厂模式) 判题机模块 是为了把代码交个代码沙箱去处理 得到结果返回 代码沙箱 梳理判题模块和代码沙箱的关系 判题模块&#xff1a;调用代码沙箱 把代码和输入交给代码沙箱去执行 代码沙箱&#xff1a;只负责接受代码和输入 返回编译的结果 不负…

用户态缓存:环形缓冲区(Ring Buffer)

目录 环形缓冲区&#xff08;Ring Buffer&#xff09;简介 为什么选择环形缓冲区&#xff1f; 代码解析 1. 头文件与类型定义 1.1 头文件保护符 1.2 包含必要的标准库 1.3 类型定义 2. 环形缓冲区结构体 2.1 结构体成员解释 3. 辅助宏与内联函数 3.1 min 宏 3.2 is…

Python办公自动化案例:将Excel数据批量保存到Word表格中

案例:将excel数据批量保存到Word表格中 要将Excel数据批量保存到Word表格中,可以使用Python的openpyxl库来读取Excel文件,以及python-docx库来创建和编辑Word文档。以下是一段示例代码,以及代码解释和一些注意事项。 准备好的Excel数据: 1.安装所需库 首先,确保你已经…

破局汽车智能化浪潮:Tire 1供应商的网络优化与升级策略

在汽车行业经历电动化、智能化的深刻变革中&#xff0c;Tier 1供应商正面临着前所未有的挑战与机遇。Tier 1 供应商&#xff0c;即一级供应商&#xff0c;是汽车产业链中占据关键地位的合作伙伴。这类供应商不仅直接向整车制造商提供核心总成和模块&#xff0c;还深度参与整车的…

通信工程学习:什么是PNF物理网络功能

PNF:物理网络功能 PNF(Physical Network Function)即物理网络功能,是指支持网络功能的物理设备。以下是关于PNF的详细解释: 一、定义与特点 定义: PNF是网络设备厂商(如Cisco、华为、H3C等)通过专用硬件实体提供软件功能的设备。这些设备直接在物理服务器上运…

C++_实现日期类

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 小伞的主页&#xff1a;xiaosan_blog 1.日期类的实现接口(date.h) 对于多次调用的函数&#xff0c;我们会实现在头文件…

免杀笔记 ---> 一种有想法的Indirect-Syscall

今天来分享一下&#xff0c;看到的一种Indirect-Syscall&#xff0c;也是两年前的项目了&#xff0c;但是也是能学到思路&#xff0c;从中也是能感受到杀软对抗之间的乐趣&#xff01;&#xff01;说到乐趣&#xff0c;让我想起看到过一位大佬的文章对"游褒禅山记"的…

Spring Boot电商开发:购物商城系统

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…

算法-Init

&#xff08;1&#xff09;有限性&#xff08;Finiteness&#xff09;&#xff1a;算法必 需在有限步骤内结束&#xff1b; &#xff08;2&#xff09;确定性&#xff08;Definiteness&#xff09;&#xff1a;算法的每一个步骤必须清晰无歧义地定义&#xff1b; &#xff08;3…

基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue

基于GIKT深度知识追踪模型的习题推荐系统 目录结构 Flask-BackEnd flask后端 app 后端主体文件 alg 深度学习模块 data 数据集data_process.py 数据预处理gikt.py GIKT模型pebg.py PEBG模型params.py 一些参数train.py 仅模型训练train_test.py 模型训练和测试-五折交叉验证t…