什么是分库分表
按照一定的规则,将一个表拆分成多个表,将DB(数据库) 从一台服务器拆分到多台服务器上的方式。
分库分表的目的
分散单台设备的负载,分散IO读写和系统开销(CPU内存资源等等)。
分库分表的核心思想
数据切分(为了降低数据库的访问的压力)。
数据处理(使用场景分类)
联机事务处理(OLTP): 对提交的事务进行数据处理并及时的反馈处理的结果(例如:实时的交易系统,insert/update)
联机分析处理(OLAP): 通过维度方式(查询条件),对数据进行分析,报表进行数据的客观呈现(例如:数据报表,大数据分析 select)。
数据切分的方式
垂直(纵向)切分(分表): 将一张表可按照字段之间的某种逻辑关联,拆分成多个关联表的方式。
水平(横向)切分(分表): 将一张表可按照字段条件拆分成多个表的方式(如 按照日期拆分的历史表)。
垂直切分(分库): 一个系统可按照业务不同将DB拆分到不同服务器上。简单理解为:不同的表拆到不同的数据库中。
水平切分(分库): 一般会建立在垂直切分的基础上,将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中,简单理解为:同一个表拆到不同的数据库中。
注意: 影响数据库性能瓶颈的原因是IO读写和系统开销(CPU内存等)。
分库分表组件的选用
Sharding-JDBC基本概念
Sharding-JDBC为轻量级java框架,是一个开源的适用于微服务的分布式数据访问基础类库,也可理解为增强版的JDBC驱动,只需引用jar包的依赖。
Sharding-JDBC内部集成并实现分库分表,读写分离和分布式主键功能,并初步实现了柔性事务。
柔性事务补充
- 两阶段型: 就是分布式事务两阶段提交,对应技术上的XA、JTA/JTS。这是分布式环境下事务处理的典型模式
- 补偿型: TCC型事务(Try/Confirm/Cancel)可以归为补偿型;TCC思路是:尽早释放锁;在Try成功的情况下,如果事务要回滚,Cancel将作为一个补偿机制,回滚Try操作;TCC各操作事务本地化,且尽早提交 (放弃两阶段约束);当全局事务要求回滚时,通过另一个本地事务实现“补偿”行为; TCC是将资源层的两阶段提交协议转换到业务层,成为业务模型中的一部分;
- 异步确保型: 将一些同步阻塞的事务操作变为异步的操作,避免对数据库事务的争用,典型例子是热点账户异步记账、批量记账的处理
- 最大努力通知型几种: 交易的消息通知与失败重试(例如商户交易结果通知重试、补单重试)
Sharding-JDBC关键词概念
数据节点: 数据拆分的最小单位(表)
逻辑表: 拆分出的多个表合在一起,也就是未拆分前的原表。
真实表: 根据某种规则拆分出的多个表都叫真实表。
逻辑索引: 用于同一个库不能出现相同索引名称的分表场景
广播表: 每个DB中都会使用到的数据表(如 省份/城市表)。
绑定表: 查询时规定了只在同一个数据库中进行查询操作。