数据库分库分表是大数据拆分和高并发的重要手段,也是大厂重点考察,下面我就全面来详解数据库分库分表@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
)。
总之,分库分表是应对大规模数据、和高并发挑战的重要技术手段。
然而,分库分表也引入了不少新的复杂性,如:分布式事务、跨库查询...等,因此在实施时需要重点关注。