ShardingSphere-JDBC

1. 什么是分库分表?

分库分表是一种数据库扩展技术,通过将数据拆分到多个数据库(分库)或多个表(分表)中来解决单一数据库或表带来的性能瓶颈。分库分表可以有效提升系统的可扩展性、性能和高并发处理能力,避免单一数据库或表的负载过重。

1.1 什么是分库?

分库 指的是将数据分散到多个数据库实例中,以减轻单一数据库的负载。分库可以有两种方式:垂直分库水平分库

  • 垂直分库:

    • 垂直分库是指根据业务模块的不同,将不同模块的数据存储到不同的数据库中。例如,将用户数据存储在 user_db 中,将订单数据存储在 order_db 中,将商品数据存储在 product_db 中。每个数据库只负责一部分业务数据。
    • 适用场景: 适用于系统中各个模块的数据量差异很大,或者需要对不同模块进行独立管理的场景。
  • 水平分库:

    • 水平分库是指将同一业务的不同数据根据某些规则(如时间、地域等)拆分到多个数据库中。例如,按照地区划分,将美国的用户数据存储在 db_us 中,将欧洲的用户数据存储在 db_eu 中,或者按照时间将数据按年、月划分到不同的数据库中。
    • 适用场景: 适用于数据量巨大,且需要根据某些标准进行数据拆分的场景。
1.2 什么是分表?

分表 是指将同一张表中的数据拆分到多个表中,以避免单个表过大而导致性能问题。分表也有两种方式:垂直分表水平分表

  • 垂直分表:

    • 垂直分表是指将一张表中的不同列分拆到多个表中。通常是将表中的列根据功能或访问频率进行划分。例如,将一个包含用户详细信息的表,按照访问频率将常用字段(如用户名、密码等)拆分成 user_basic 表,而将不常用的字段(如用户画像、日志等)拆分成 user_extra 表。
    • 适用场景: 适用于表中包含大量列,但并非所有列都会频繁访问的场景。
  • 水平分表:

    • 水平分表是指将表中的数据按照某些规则(如ID范围、时间等)拆分到多个表中。例如,用户表的数据根据用户ID范围分拆成多个表,如 user_1, user_2, user_3 等,或者按时间拆分成 user_2023, user_2024 等。
    • 适用场景: 适用于数据量过大,导致单表查询性能低下的情况。

2. 分库分表场景

2.1 什么场景分表?

分表适用于以下场景:

  • 单表数据量过大: 当某个表的记录数达到千万级,查询时可能会非常缓慢,尤其是涉及全表扫描的操作,分表可以有效提高查询效率。
  • 高并发读写: 单表无法承载高并发的查询和写入请求时,可以通过水平分表将压力分散到多个表上。
  • 单表的数据结构复杂,且访问频繁的列较少: 在这种情况下,垂直分表可以将高频访问的列提取到单独的表中,提高性能。
2.2 什么场景分库?

分库适用于以下场景:

  • 数据库连接数不足: 单个数据库的连接数上限(如 MySQL 默认为 4000 个连接)无法满足高并发的请求时,可以通过分库将连接请求分散到多个数据库实例上。
  • 数据库资源瓶颈: 当单个数据库的 CPU、内存、磁盘等资源无法满足需求时,分库可以将数据分布到多个数据库实例上,从而避免单点故障和资源瓶颈。
  • 高并发读写: 当需要处理大量并发请求时,单个数据库无法支撑,需要通过分库将请求分散到多个数据库节点上。
2.3 什么场景分库分表?

分库分表适用于以下场景:

  • 数据量巨大且访问量大: 当数据量达到数千万甚至更大,且访问量高时,单库单表无法满足存储、查询和写入需求。此时,分库分表能有效地提高查询性能和扩展系统能力。
  • 高并发写入和查询: 在高并发的业务场景中,单库单表的性能瓶颈可能导致系统无法处理所有请求。分库分表能够将数据分布在不同的物理节点上,提高系统的并发处理能力。
  • 资源瓶颈和高可用性需求: 当数据库实例的资源有限,且为了保证高可用性,必须将数据分散到多个数据库和表中,避免单点故障和资源耗尽。

3. 什么是 ShardingSphere?

ShardingSphere 是一个开源的分布式数据库中间件,提供数据库分片、分库分表、数据路由、分布式事务、数据脱敏等功能。它可以在不修改应用代码的情况下,为应用提供透明的分库分表支持,简化了分布式数据库的管理和维护。

ShardingSphere 的主要特点包括:

  • 数据分片: 支持灵活的分库分表策略,可以根据用户需求定制分片规则。
  • 分布式事务: 提供跨库跨表的分布式事务管理,确保数据一致性。
  • 读写分离: 提供读写分离功能,将读请求路由到从库,提高系统性能。
  • 弹性扩展: 支持动态添加新的数据源,帮助系统应对数据增长带来的压力。

4. 数据分片核心概念

4.1
  • 逻辑表: 应用层面上的虚拟表,实际数据存储在多个物理表中。
  • 真实表: 存储在数据库中的实际表,数据按分片规则分布在不同的物理表中。
  • 绑定表: 多个表之间具有外键关系或逻辑关联,需要绑定在一起进行分片操作。
  • 广播表: 一些小型表(如配置表、字典表等)将数据广播到所有数据库节点中,不进行分片。
  • 单表: 不需要分片的表,数据存储在单个表中。
4.2 数据节点
  • 均匀分布: 数据均匀地分布到多个数据节点中。
  • 自定义分布: 开发者可以定义特定的分布规则,决定数据如何在不同的数据节点上分布。
4.3 分片
  • 分片键: 决定数据如何分配到不同分片的字段,通常选择具有唯一性、分布均匀的数据字段作为分片键。
  • 分片算法: 根据分片键和预定义的算法将数据分配到不同的分片上,常见的算法有哈希分片、范围分片等。
  • 自动化分片算法: 系统自动根据配置的分片规则选择合适的分片算法。
  • 自定义分片算法: 开发者可以定义自己的分片算法,以满足特定的业务需求。
  • 分片策略: 定义了数据如何进行分片,包括按ID、时间、范围等不同策略进行数据划分。
  • 强制分片路由: 强制要求某些操作使用特定的分片策略进行路由,通常用于特定业务需求。
4.4 行表达式

行表达式是指描述分片规则的表达式,帮助系统决定某一行数据应该放入哪个分片。

4.5 分布式主键

分布式主键确保在多个数据库和表中生成全局唯一的主键,避免出现主键冲突,通常通过全局唯一ID生成策略来实现。

相关推荐
engchina25 分钟前
Python装饰器设计模式:为函数增添风味
开发语言·python·设计模式·装饰器
熬夜加班写代码25 分钟前
SpringBoot【九】mybatis-plus之自定义sql零基础教学!
java·spring boot·后端·sql·程序员·mybatis
TANGLONG22229 分钟前
【初阶数据结构与算法】初阶数据结构总结之顺序表、单链表、双链表、栈、队列、二叉树顺序结构堆、二叉树链式结构(附源码)
java·c语言·数据结构·c++·python·算法·面试
黑客呀29 分钟前
密码学——密码学基础、散列函数与数字签名
网络·数据库·人工智能
MoonBit月兔30 分钟前
GitHub 正式收录 MoonBit 作为一门通用编程语言!核心用户突破三万!
开发语言·github·编程语言·moonbit
码猩30 分钟前
C# 在dataview可以直接增删改查mysql数据库
数据库·mysql·c#
謬熙1 小时前
Vue.js:代码架构组成与布局设置
java·vue.js·前端框架
闲人怪喵1 小时前
/usr/local/go/bin/go: cannot execute binary file: Exec format error
开发语言·后端·golang
鸽鸽程序猿2 小时前
【算法】【优选算法】分治(下)
java·算法·分治
散修-小胖子2 小时前
MySQL并发控制(二):锁
数据库·mysql