数据库-分库分表

news2024/11/24 9:31:52

什么是分库分表

分库分表是一种数据库优化策略

目的:为了解决由于单一的库表数据量过大而导致数据库性能降低的问题

分库:将原来独立的数据库拆分成若干数据库组成

分表:将原来的大表(存储近千万数据的表)拆分成若干个小表

什么时候考虑分库分表

​ 注意:当我们使用读写分离、索引、缓存后,数据库的压力还是很大的时候,这就需要将数据库进行拆分(迫不得已,最后最后的办法)。

  1. 单表出现的瓶颈:单表数据量过大,导致读写性能较慢。 关于 MySQL 单库和单表的数据量限制,和不同的服务器配置,以及不同结构的数据存储有关,并没有一个确切的数字。这里参考阿里巴巴的《Java 开发手册》中数据库部分的建表规约:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。

  2. 单库出现的瓶颈:CPU压力过大,内存不足,磁盘空间不足,网络带宽不足,导致读写性能较慢

分库分表的实现方式

​ 分库分表包括分库和分表两个部分,在生产中通常包括:垂直分库、水平分库、垂直分表、水平分表四种方式。

1.垂直分表

概念:按照字段访问频次,将一张表的字段拆分到多张表当中。

拆分后表的记录行数不变拆分的表之间一般是一对一的关系每张表仅存储其中一部分字段

2.垂直分库

概念:按照业务将表进行分类,分布到不同的数据库上面。

核心理念:专库专用

注意:它需要解决跨库带来的所有复杂问题(例如:事务一致性问题)。

<img src="C:\Users\txt\AppData\Roaming\Typora\typora-user-images\image-20241006100449332.png" alt="image-20241006100449332" style="zoom: 46%;" />

3.水平分表

概念:整张表在数据结构不变的情况下,将大表按一定规则拆分成多个小表

算法说明:如果商品ID为偶数,将此操作映射至商品信息1表;如果商品ID为奇数,将操作映射至商品信息2表。此操作要访问表名称的表达式为商品信息[商品ID%2 + 1];

4.水平分库

概念:将表水平切分后 按某个字段的某种规则分到不同的数据库,使得每个库具有相同的表,表中的数据不相同,水平分库一般是伴随水平分表。

场景:假如当前有8w店铺,每个店铺平均150个不同规格的商品,那商品数量得往1200w+上预估,并且商品库属于访问非常频繁的资源,单台服务器已经无法支撑。此时该如何优化?​ 目前情况是那怕再次垂直分库也无法解决数据瓶颈问题。我们可以尝试水平分库,将商品ID为奇数的和商品ID为偶数的商品信息分别放在两个不同库中;说明:总之,水平分库后,各个库保存的表结构是一致的,但是表中内容不一样;

最佳实践:

一般来说,在系统设计阶段就应该根据业务耦合松紧来确定垂直分库,垂直分表方案。当然在数据量及访问压力不是特别大的情况,首先考虑缓存、读写分离、索引技术等方案。若数据量极大,且持续增长,再考虑水平分库水平分表方案。

总之,基于开发和维护成本比考虑,非必须,不要对数据库做分库分表处理!

分库分表带来的问题(了解)

单个数据库的时候MySQL操作很简单,但是当进行分库分表之后数据库被拆分的非常细,这个时候如何操作这些表就是要面临的问题,就需要引入sharding-jdbc,来解决分库分表操作的问题,sharding-jdbc不是进行分库分表的,分库分表是已经提前分好的,sharding-jdbc是解决了如何方便的去操作这些数据库表。

分库分表(Sharding)是一种常见的数据库扩展方案,用于提高系统的性能和可扩展性。然而,分库分表也会带来一些复杂性和挑战。ShardingSphere(原名 Sharding-JDBC,现在是 Apache 顶级项目)是一个强大的开源框架,旨在帮助开发者解决这些挑战。下面我将详细讨论分库分表带来的问题以及 ShardingSphere 能否解决这些问题。

  1. 分布式事务

  2. 问题:在分库分表的环境中,一个业务操作可能涉及多个数据库或表,这会导致分布式事务的问题。

  3. 解决方案ShardingSphere 支持多种分布式事务解决方案,如 XA、Seata 等,可以有效地处理跨库事务。

  4. 全局唯一 ID 生成

  5. 问题:在分库分表的情况下,需要生成全局唯一的主键 ID。

  6. 解决方案ShardingSphere 提供了多种 ID 生成策略,如 Snowflake、UUID 等,可以确保生成的 ID 在全局范围内唯一。

  7. 数据迁移和扩容

  8. 问题:随着业务的发展,可能需要对现有的分片规则进行调整或增加新的分片。

  9. 解决方案ShardingSphere 提供了灵活的数据迁移和扩容工具,支持在线数据迁移和重新分片。

  10. 查询路由

  11. 问题:查询请求需要被正确地路由到相应的分片上。

  12. 解决方案ShardingSphere 内置了强大的 SQL 解析和路由引擎,能够自动解析 SQL 并将其路由到正确的分片。

  13. 聚合查询

  14. 问题:跨分片的聚合查询(如 GROUP BY, ORDER BY)会变得复杂。

  15. 解决方案ShardingSphere 支持跨分片的聚合查询,并通过内存计算或中间结果集合并来实现高效的聚合。

  16. 读写分离

  17. 问题:为了进一步提高性能,可能需要实现读写分离。

  18. 解决方案ShardingSphere 支持读写分离,可以将读操作路由到从库,写操作路由到主库。

  19. 配置管理

  20. 问题:分库分表的配置较为复杂,需要管理和维护。

  21. 解决方案ShardingSphere 提供了灵活的配置方式,支持 YAML、Spring Boot 配置文件等,方便管理和维护。

  22. 数据一致性

  23. 问题:在分库分表的情况下,数据的一致性难以保证。

  24. 解决方案ShardingSphere 提供了多种一致性保证机制,如最终一致性、强一致性等,可以根据业务需求选择合适的方案。

  25. 监控和运维

  26. 问题:分库分表后的系统监控和运维变得更加复杂。

  27. 解决方案ShardingSphere 提供了丰富的监控和日志功能,支持与 Prometheus、Grafana 等监控系统集成,便于运维。

ShardingSphere 是一个非常强大的框架,能够解决分库分表带来的大部分问题。它提供了全面的解决方案,包括分布式事务、全局唯一 ID 生成、数据迁移和扩容、查询路由、聚合查询、读写分离、配置管理、监控和运维等。虽然 ShardingSphere 可以解决很多问题,但在实际应用中,还需要根据具体的业务需求和场景进行适当的配置和调优。此外,对于一些非常复杂的业务逻辑和特定需求,可能仍需要额外的定制化开发。

Sharding-JDBC入门

1、ShardingSphere生态简介

​ Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,既能够独立部署,又支持混合部署配合使用的产品组成。

功能特性:它们均提供标准化的数据水平扩展分布式事务分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

文档地址:https://shardingsphere.apache.org/document/legacy/4.x/document/cn/overview

本教程主要介绍:Sharding-JDBC

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

<dependency>            <groupId>org.apache.shardingsphere</groupId>            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>            <version>4.0.0-RC1</version></dependency>

Java

  • 适用于任何基于Java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。

  • 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL。

Sharding-JDBC的核心功能为数据分片读写分离,通过Sharding-JDBC,应用可以透明的使用jdbc访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分布。

数据分片:把表和数据库进行拆分读写分离:把数据库分成主从两个数据库,主数据库负责写,从数据库负责读

2、sharding-jdbc相关名词解释

参考官网-核心概念

  • 逻辑表(LogicTable):(面向开发,实际上是不存在的表)进行水平拆分的时候同一类型(逻辑、数据结构相同)的表的总称。

  • 真实表(ActualTable):(真实存在的表,真实操作的表)在分片的数据库中真实存在的物理表。

  • 数据节点(DataNode):(描述的是哪个数据源下的哪张表,相当与地理位置的定位)数据分片的最小单元。由数据源名称和数据表组成,例:order_db.t_order_1, order_db.t_order_2,order_db.t_order_3 说白了,具体到指定库下的指定表就是一个数据节点;

  • 动态表(DynamicTable):(属于真实表,随某种规则动态产生)逻辑表和物理表不一定需要在配置规则中静态配置。如,按照日期分片的场景,物理表的名称随着时间的推移会产生变化(股票流水)。

  • 广播表(公共表):(数据量较小,变动少,而且属于高频联合查询的依赖表)指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表:对数据库结构的详细描述、参数表。

  • 绑定表(BindingTable):多表之间存在关系,尽量关联的数据放到一个库中,避免跨库查询(让相同字段都参与到分库的规则,就会落到同一个库中)指分片规则一致的主表和子表。例如:t_order表和t_order_item表,均按照order_id分片,则此两张表互为绑定表关系。

  • 分片键(ShardingColumn):分片字段用于将数据库(表)水平拆分的字段,支持单字段及多字段分片。例如上例中的order_id。一般在业务中经常查询使用的字段会作为分片键

3、Sharding-JDBC执行原理

参考官网-内部剖析

4、sharding-jdbc分片方式介绍

参考:https://shardingsphere.apache.org/document/legacy/4.x/document/cn/manual/sharding-jdbc/configuration/config-spring-boot/

sharding-jdbc实现数据分片有4种策略:

  • inline模式

  • 通过groovy表达式来表示分库分表的策略;db0 ├── t_order_1 └── t_order_2db1 ├── t_order_1 └── t_order_2 表达式:db${0..1}.t_order_${1..2} 通过一个表达式代表4个数据节点 t_order_${orderId % 2 + 1 } 表的分片规则

  • 使用最简单,开发成本比较低;

  • 只能使用单个字段作为分片键;

  • 基于行表达式定义分片规则;

  • standard标准分片模式

  • 用户可通过代码自定义复杂的分片策略;

  • 同样只能使用单个字段作为分片键;

  • complex复合分片模式

  • 用于多分片键的复合分片策略(多片键)

  • Hint强制分片模式

  • 不指定片键,通过代码动态指定路由规则

  • 强制分片策略(强制路由)

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

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

相关文章

Web 性能优化|了解 HTTP 协议后才能理解的预加载

作者&#xff1a;谦行 一、前言 在性能优化过程中&#xff0c;开发者通常会集中精力在以下几个方面&#xff1a;服务器响应时间&#xff08;RT&#xff09;优化、服务端渲染&#xff08;SSR&#xff09;与客户端渲染优化、以及静态资源体积的减少。然而&#xff0c;对于许多用…

C(十五)函数综合(一)--- 开公司吗?

在这篇文章中&#xff0c;杰哥将带大家 “开公司”。 主干内容部分&#xff08;你将收获&#xff09;&#xff1a;&#x1f449; 为什么要有函数&#xff1f;函数有哪些&#xff1f;怎么自定义函数以及获得函数的使用权&#xff1f;怎么对函数进行传参&#xff1f;函数中变量的…

[嵌入式Linux]—STM32MP1启动流程

STM32MP1启动流程 1.启动模式 STM32MP1等SOC支持从多种设备中启动&#xff0c;如EMMC、SD、NAND、NOR、USB、UART等。其中USB、UART是作为烧录进行启动的。 STM32MP1内部ROM中存储有一段出厂代码来进行判断从哪种设备中启动&#xff0c;上电后这段代码会被执行&#xff0c;这…

使用java函数逆序一个单链表

代码功能 定义了一个ListNode类&#xff0c;用于表示单链表的节点&#xff0c;每个节点包含一个整数值和一个指向下一个节点的引用。 在ReverseLinkedList类的main方法中&#xff0c;创建了一个包含从1到10的整数的单链表。 定义了一个printList方法&#xff0c;用于打印链表的…

基于JavaWeb开发的java springmvc+mybatis酒水商城管理系统设计和实现

基于JavaWeb开发的java springmvcmybatis酒水商城管理系统设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承…

【JAVA基础】集合类之HashSet的原理及应用

近期几期内容都是围绕该体系进行知识讲解&#xff0c;以便于同学们学习Java集合篇知识能够系统化而不零散。 本文将介绍HashSet的基本概念&#xff0c;功能特点&#xff0c;使用方法&#xff0c;以及优缺点分析和应用场景案例。 一、概念 HashSet是 Java 集合框架中的一个重…

Spring Boot实现License生成与校验详解

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在软件开发领域&#xff0c;License&#xff08;许可证&#xff09;机制是保护软件版权、控制软件使用范围的重要手段。通过为软件生成唯一的License&#xff0c;开发者可以确保只有合法用户才能使用软件&…

右键菜单添加 Open Tabby here

如果安装了Tabby&#xff0c;为了提高效率在鼠标右键菜单中添加Open Tabby here&#xff0c;可以通过按 win R&#xff0c;并输入regedit 回车打开注册表编辑器 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell 然后在Shell下面新建项&#xff0c;名称为Tabby&#xf…

企业架构理论TOGAF从理论到实践:引领企业数字化转型的实践指南

在现代企业面临的数字化转型浪潮中&#xff0c;如何从战略层面实现技术与业务的全面融合&#xff0c;成为了众多企业的核心挑战。TOGAF&#xff08;The Open Group Architecture Framework&#xff09;不仅为企业提供了强大的理论框架&#xff0c;还通过实践验证了其在推动企业…

力扣 中等 39.组合总和

文章目录 题目介绍解法 题目介绍 解法 是216组合总和III链接的扩展 class Solution {List<List<Integer>> res new ArrayList<>();List<Integer> path new ArrayList<>();public List<List<Integer>> combinationSum(int[] can…

Windows 下安装mamba_ssm 记录,包括causal-conv1d和mamba-ssm

Windows 下安装mamba_ssm 记录 1 重要参考文献2 具体安装步骤3 一些提醒事项4 安装causal-conv1d5 安装mamba-ssm6 结果展示 1 重要参考文献 Window 下Mamba 环境安装踩坑问题汇总及解决方法 2 具体安装步骤 重点看的是这篇 Window 下Mamba 环境安装踩坑问题汇总及解决方法 …

【Redis】持久化(下)-- AOF

文章目录 AOF概念如何使用AOFAOF工作流程命令写入演示文件同步策略 AOF的重写机制概念触发重写机制AOF重写流程 启动时数据恢复混合持久化总结 AOF 概念 AOF持久化:以独立日志的方式记录每次的写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的.AOF的主要作用是解决…

工行企业网银U盾展期后有两个证书问题的解决方法

工行企业网银U盾证书快到期后&#xff0c;可以自助展期&#xff0c;流程可以根据企业网银提示页面操作。操作后&#xff0c;可能存在两个新旧两个证书并存的情况&#xff0c;致使网银转账等操作失败&#xff0c;如图&#xff1a; 其原因是新证书生成后&#xff0c;旧证书没有删…

wsl配置图形显示环境 no $display environment variable

wsl运行fsl&#xff0c;安装好之后&#xff0c;可以使用bet&#xff0c;等命令行进行操作&#xff0c;但是不能使用fsl呼出窗口。 因为 wsl并不像原生linux具有destop桌面&#xff0c;它只有命令行。所以当运行fsl的时候会报错&#xff0c; application-specific initializat…

裁掉数千人、把工作外包给 AI!一年多后,这家巨头的 CEO恳求无人搭理

“对&#xff0c;裁掉几千名员工。” “好的&#xff0c;头儿。” “很好&#xff0c;那么这个人工智能可以做那些前雇员能做的一切事情&#xff1f;” “不&#xff0c;不全是。” “等等&#xff0c;什么&#xff1f;” “你刚刚裁掉的几百人都是硬件工程师&#xff0c;…

k8s的pod的管理和优化

资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务 所谓的部署服务&#xff0c;其实就是在kubernetes集群中运行一个个的容器…

Kubernetes--深入理解Pod资源管理

文章目录 kubectl --helpapi-resourcesapi-versionskubectl explain ... API资源资源规范PodServiceConfigMapSecret 显示资源删除资源详细描述RESTful API Pod资源管理Pod的核心概念Pod资源配置了解Pod运行状况Kubectl get pods xxxxkubectl describe pods xxxkubectl logs -f…

如何彻底掌握 JavaScript 23种设计模式

设计模式是解决特定问题的常用解决方案&#xff0c;它们可以帮助开发者编写更清晰、可维护、可扩展的代码。在 JavaScript 中&#xff0c;常见的设计模式可以分为三大类&#xff1a;创建型模式、结构型模式 和 行为型模式。本文将全面介绍 JavaScript 中常见的设计模式&#xf…

性能剖析利器-Conan|得物技术

作者 / 得物技术 - 仁慈的狮子 目录 一、背景 1. 局限性 2. 向前一步 二、原理剖析 1. 系统架构 2. 工作模式 3. reporter 三、稳定性验证 四、案例分析 五、写在最后 一、背景 线上问题的定位与优化是程序员进阶的必经之路&#xff0c;常见的问题定位手段有日志排查、分布式链…

脑机接口技术的未来与现状:Neuralink、机械手臂与视觉假体的突破

近年来&#xff0c;脑机接口&#xff08;BCI&#xff09;技术发展迅速&#xff0c;不仅限于科幻小说和电影&#xff0c;已经逐步进入现实应用。特别是马斯克的Neuralink公司推出的“盲视&#xff08;Blindsight&#xff09;”设备&#xff0c;最近获得了FDA的突破性设备认定&am…