ShardingSphere实现分库分表
💡 NovaTube 项目引入 ShardingSphere 实现分库分表实践
随着用户量和视频数据的不断增长,NovaTube 平台面临着单表数据量过大、热点访问集中、数据库写入性能瓶颈等问题。为了支撑平台的持续增长,我们引入了 ShardingSphere-JDBC 组件,对核心表(如用户表、视频表)进行 分库分表改造,提升数据库的可扩展性和高并发处理能力。
一、🤔 为什么要分库分表?
在单库单表的结构下:
- 用户表:用户数超过千万时,单表查询/写入变慢;
- 视频表:视频数海量增长时,分页、推荐、索引命中率降低;
- 数据库连接数、IO 等资源逐渐成为瓶颈;
- 高并发访问易出现数据库锁竞争、主从延迟等问题。
因此,我们决定使用 ShardingSphere 对数据进行水平切分(Sharding),按规则将数据分散到多个表/库中。
二、🔧 技术选型与架构集成
✅ 技术选型
- 组件名称:ShardingSphere-JDBC
- 模式:客户端嵌入式中间件,无需独立部署 Proxy
- 配合使用:Spring Boot + MyBatis + Druid
🏗️ 架构位置
[Controller]↓
[Service] ↓
[MyBatis Mapper]↓
[ShardingSphere JDBC] ← 分片规则配置↓
[多数据源:user_db_0, user_db_1 ...]
ShardingSphere-JDBC 在 JDBC 层接管 SQL 解析与路由,开发者仍使用原始 Mapper 和 SQL,无需改动业务逻辑。
三、📚 分库分表实战
📁 数据库结构
- 用户库:
user_db_0
、user_db_1
- 每库包含分表:
user_0
、user_1
- 规则:按用户ID取模分片,如:
user_id % 2
CREATE DATABASE user_db_0;
CREATE DATABASE user_db_1;CREATE TABLE user_0 (...);
CREATE TABLE user_1 (...);
🧩 配置文件(application.yml)
spring:shardingsphere:datasource:names: ds0, ds1ds0:url: jdbc:mysql://localhost:3306/user_db_0username: rootpassword: rootds1:url: jdbc:mysql://localhost:3306/user_db_1username: rootpassword: rootrules:sharding:tables:user:actual-data-nodes: ds$->{0..1}.user_$->{0..1}table-strategy:standard:sharding-column: user_idsharding-algorithm-name: user-table-inlinedatabase-strategy:standard:sharding-column: user_idsharding-algorithm-name: user-db-inlinesharding-algorithms:user-db-inline:type: INLINEprops:algorithm-expression: ds${user_id % 2}user-table-inline:type: INLINEprops:algorithm-expression: user_${user_id % 2}props:sql-show: true
四、🛠️ 编码实践
Entity
public class User {private Long userId;private String username;private String email;...
}
Mapper(MyBatis)
@Mapper
public interface UserMapper {@Insert("INSERT INTO user (user_id, username, email) VALUES (#{userId}, #{username}, #{email})")void insertUser(User user);@Select("SELECT * FROM user WHERE user_id = #{userId}")User selectById(Long userId);
}
🌟 注意:ShardingSphere 会根据 user_id 自动路由到正确的库和表,SQL 无需指定库表名。
五、✨ 实施效果与优势
👍 引入 ShardingSphere 后的优势
问题 | 引入后改善 |
---|---|
单表数据量大 | 水平拆分,减轻单表压力 |
热点写入冲突 | 数据分散到不同表并发写入 |
SQL 性能下降 | 路由精准、分页优化 |
扩展性差 | 可横向扩容数据库节点 |
六、📈 后续优化方向
- ✅ 支持视频表
video
的分库分表(按视频ID或上传者ID分片) - ✅ 引入 分布式主键(如雪花算法) 确保分片唯一性
- ✅ 考虑热点用户/视频的访问模式,设计合理分片键(如 Hash+Range 结合)
- ✅ 配合缓存(Redis)缓解热点查询压力
七、🔚 总结
在 NovaTube 项目中引入 ShardingSphere-JDBC 分库分表方案,实现了对用户数据的高效水平拆分,极大缓解了数据量带来的性能压力,为后续平台用户量增长奠定了技术基础。
ShardingSphere 提供了“对开发透明、对数据库友好”的分布式数据中间层解决方案,是高并发、高数据量系统架构中不可或缺的一环。