关注△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、中间件…等大厂必考题及答案详解。
需要以上架构专题&面试答案的同学,加我微信即可领取!
添加时备注:资料