sharding sphere MySQL分库分表分享
目录:
分库分表是什么?
为什么需要分库分表?
如何制定分库分表方案?
实践demo演示
分库分表是什么?
单库单表 拆分为 N个库N个表
分为垂直拆分,水平拆分
什么是垂直拆分
按结构(表头/约束)拆分
垂直拆库
把单库中的不同业务的表, 拆分到不同库中
比如 原本单库的 用户表, 订单表
将用户表相关的表放到同一个库中 A库
将订单相关的表放到同一个库中 B库
垂直拆表
把表中的多个字段, 拆出来部分字段放到另一个表中
比如
A库B表的一行, 有 1 2 3 4 5 列
把 1 2 3 4 列 拆出来放到 A库C表中
B表剩下 1 5
C表 1 2 3 4, B表和C表以1这列为关联键
垂直拆分优点
- 业务系统解耦。
- 与微服务治理类似,便于集中管理,监控,扩展
- 高并发情况下提升IO,数据库连接数,单机硬件资源瓶颈
垂直拆分缺点
- 多表join
- 分布式事务处理复杂
- 单表数据总量无法解决(水平切分处理)
什么是水平拆分
按内容拆分
将1w行, 按照id的奇偶分成两个库, 奇数插入到A库的b表, 偶数插入到C库的b表
(b表的结构是一样的)
就是按照id的内容进行了拆分
水平拆分的优点
- 提高查询性能, 单表超过2kw,性能下降(如何举证?), 比如磁盘缓存, 控制变量, 两台相同实例的磁盘缓存比单台的实例的磁盘缓存要大, 命中缓存的比率会上升
水平拆分的缺点
- 实例增加, 成本增加
- 业务规则导致无法正确连表查询
- 分布式事务
sharding jdbc mybatis
优点:
- 单表分库分表
- 读写分离
- 数据库的分布式事务
缺点:
- 连表查询
- 分页查询 归并引擎
为什么要分库分表?
- 单表数据量增大
- 单台服务器资源有限, 基于摩尔定律, 单个CPU的性能受限, 单台机器资源受限
如何定制分库分表方案
- 业务规则
- 直接使用分布式数据库(TiDB)
中间件选型
- sharding-sphere
- TDDL (淘宝半开源)
- mycat
sharding-jdbc分表demo
分库是一样的, 这里只演示分表的demo
gitee: https://gitee.com/suveng/demo
环境说明
MySQL 5.7
Sharding-Sphere 4 (截止至 2021/1/4 sharding-sphere 5已经出了, 直接去apache官网可以搜到文档)
扩容问题
- 增加算法版本配置
看代码实现的思路
数据倾斜问题
- 一致性hash算法 + 权重配置
看代码实现的思路
todo
- 读写分离特性问题探讨
- 查询优化
- sharding-proxy代理分享
注意点
- 读写分离
- 没有事务时, 根据SQL去做读写分离
- 有事务时, 一旦线程内使用了主库, 后续线程内的读写都是使用主库, 但是异步线程后就没有了这个限制了?
- 怀疑: 和事务隔离级别有关系