数据库分库分表详解(图文全面总结)

文摘   2024-08-22 12:59   四川  

关注mikechen的架构笔记十余年BAT架构经验倾囊相授


大家好,我是mikechen。

数据库分库分表是大数据拆分和高并发的重要手段,也是大厂重点考察,下面我就全面来详解数据库分库分表@mikechen


分库分表

分库分表是一种针对大规模数据、和高并发场景下,的数据库优化策略。

它的目的是通过将数据分散到多个数据库、和表中,如下图所示:


分库分表原理

分库分表整体架构,可以分为:分库、和分表。

如下图所示:

分库

分库,是指将数据拆分到不同的数据库实例中,用于减少单个数据库实例的压力。

分库后的每个数据库,可以在不同的物理服务器上,以分散存储压力、和计算压力。

你可以将数据库中的表按某种规则(如:用户ID、订单ID...等的哈希值、或范围),划分到多个数据库实例中。

举一个例子,比如;将用户表按用户ID/对4取模的结果,分配到4个不同的数据库实例中。

ID为0的用户数据存储在DB1中,ID为1的存储在DB2中,依此类推。

总之,分库适用于数据量巨大、需要将不同类型的数据分开管理的场景。

分表

分表是指将同一个表中的数据,按一定规则拆分为多个表,从而减少单个表的数据量。

分表可以分为水平分表(根据数据行拆分)、和垂直分表(根据字段拆分)。

例如:可以根据用户ID的范围,将数据拆分到不同的表中,这样可以减少单表的数据量。

如下图所示:

假设用户ID是 user_id,你可以将用户表按照用户ID的范围,进行拆分。

例如:

  • users_0:存储 user_id 从 0 到 999999 的用户数据;

  • users_1:存储 user_id 从 1000000 到 1999999 的用户数据。

  • 依此类推;

总之,通过分表,可以减少单表的数据量,从而,优化查询、和写入操作。


分库分表实战

下面,我以ShardingSphere来实例,ShardingSphere 是一个开源的分布式数据库中间件。

ShardingSphere支持数据分片、读写分离、数据治理...等功能。

整体架构,如下图所示:

ShardingSphere 的架构,主要分为三个层次:核心层(Core Layer)、中间件层(Middleware Layer) 、和 存储层(Storage Layer)。

ShardingSphere 的核心功能,如:分片、路由、事务管理。。。等。

ShardingSphere ,根据配置的分片规则,将数据分布到不同的数据库和表中。

如下所示:

schemaName: sharding_db
dataSources: ds0: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://localhost:3306/ds0 username: root password: root ds1: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.cj.jdbc.Driver jdbcUrl: jdbc:mysql://localhost:3306/ds1 username: root password: root
sharding: tables: orders: actualDataNodes: ds${0..1}.orders_${0..1} tableStrategy: inline: shardingColumn: order_id algorithmExpression: orders_${order_id % 2} databaseStrategy: inline: shardingColumn: order_id algorithmExpression: ds${order_id % 2} defaultDatabaseStrategy: none:
  • actualDataNodes:指定了实际的数据节点,ds0 和 ds1 是数据库实例,orders_0 和 orders_1 是表名,表示数据被拆分到这些表中;

  • tableStrategy:定义了表分片策略,order_id 字段的模值决定了数据应存储到哪个表中。

  • databaseStrategy:定义了数据库分片策略,order_id 字段的模值决定了数据应存储到哪个数据库中。

将数据插入到 orders 表中,根据分片策略,数据会被自动路由到合适的实际表(例如:orders_0 或 orders_1)。

总之,分库分表是应对大规模数据、和高并发挑战的重要技术手段。

然而,分库分表也引入了不少新的复杂性,如:分布式事务、跨库查询...等,因此在实施时需要重点关注。

以上


最后送大家一个福利:

送我原创超30万字阿里架构师进阶专题合集


以及给大家整理最全Java面试题及答案详解,包含:Java、多线程、JVM、Spring、MySQL、Redis、中间件…等大厂必考题及答案详解。


需要以上架构专题&面试答案的同学,加我微信即可领取!


添加时备注:资料





mikechen的架构笔记
十余年BAT架构经验倾囊相授!
 最新文章