垂直切分(分库)
按照不同的表或者业务域切分到不同的数据库中。
优点(相对而言):
- 业务清晰,规则明确
- 系统之间易扩展
- 数据维护简单
缺点:
- 跨库无法 join,只能通过接口调用。
- 跨库事务难以处理
- 如果单表数据过大,仍然存在单体性能瓶颈
水平切分(分表)
一个表中的数据,按照某种规则拆分到不同数据库中。
常见拆分,使用某个字段 求模
优点:
- 解决了单表大数据,高并发瓶颈
- 拆分规则封装好,对应用端几乎透明
缺点:
- 跨库无法 join
- 拆分规则很难抽象
- 分片事务一致性难以解决
- 二次扩展时,数据迁移、维护难度大。
- 比如一开始根据 id 对2求模,但随着数据量增长,需要拆分4个数据库,这时就需要做数据迁移
总结
无论是垂直拆分还是水平拆分,都有共同缺点:
- 跨库无法 join
- 分布式事务
- 多数据源管理
针对多数据源管理:
- 客户端模式:每个应用模块内,配置自己需要的数据源,直接访问数据库,在各模块内完成数据整合
- sharding-jdbc
- 中间代理模式:代理统一管理所有数据源,数据库层对开发人员透明
- MyCat
- sharding-proxy