为什么要学习分库分表?
2019年双11成交额重要节点:
11月11日1分钟超65亿;
11月11日1分36秒,超100亿;
11月11日5分25秒,超300亿;
11月11日1小时3分59秒,超1000亿;
11月11日1小时26分07秒,成交额超1207亿;
11月11日14小时21分,成交额破2000亿;
11月11日16小时31分,成交额破2135亿;
11月11日22点28分,成交额超2500亿元;
11月12日00点00分,最终成交额2684亿元。
一分钟超65亿的话,那么也就是每秒钟1个亿的交易量,TPS>=1E
我们不妨设想下,如果采用MySQL数据库,TPS>=1E,其核心交易系统的数据库设计也是要进行分库分表的,否则根本无法支持如此大规模的高性能并发写入。
关于TPS的概念,请看我这篇文章,《TPS计算方法》
那么引入我们今天要讨论的正题,分库分表。目前数据库的拆分形式,一般有两种方式比较主流。
一、数据分片
- “数据分片” 通俗讲,就是把数据库服务器中的大表拆分成若干个小表(分片),这些分片可分布在单台/多台数据库服务器上。
- 分库分表概念中的 “分片” 最小单位,指数据库中的表。
二、垂直拆分
- 想象一下,一个数据库的数据由一整块豆腐组成。
- 我们根据不同的场景需要(炒菜、做汤、火锅),将整块豆腐垂直切成小豆腐块,放到不同盘子里。
- 盘子中的小豆腐块,可以理解为数据库中的“表”。
- 最终,不同的表会根据业务需要分散存储到不同的数据库中。
图1中,我们使用了垂直分库
的思想,把热点业务“考试”,单独分出来一个数据库,然后把“考试”相关的表,全部拉入新数据库DB Examination
中。
总体思路是,针对热点业务,可以单独的分出一个新库来进行存储,降低主库的请求压力。 后期可针对不同业务,单独分出不同的数据库。这个思路叫做垂直分库,先理解这个概念。
三、水平拆分
- 开学季,某学校有很多新学生准备入学。
- 入学后,新生会根据所在地区进行分班。
- 假设每个班能够容纳30名学生,我们以“班级” 为单位,把众多入学的学生,通过分班算法(根据所在地区进行分班),分配到不同的班级中。
- 班级 理解为“表”。
- 学校 理解为“数据库”。
图2中,我们使用了水平分表
的思想,在同一个数据库中,由于突发需求(大批量新生转院进入我校),那么会导致学生表根本无法满足现有业务需求,我们则需要对其进行水平拆分,分成多个学生表Student Table #0...#2
。
总体思路是,针对热点业务,在同一个数据库下,按照不同的分片算法,分出多个数据表来满足现有业务需求,降低单表的请求压力。
仔细理解上述的知识点后,聪明的同学是否还会问到,那么这两种拆分的优缺点
有哪些?
四、优劣对比
总结,我给大家的建议是,
任何的系统架构设计,都是为了简单而稳定,不要盲目追求新技术而把事情搞复杂。
1、能垂直分库的场景,就不要考虑做水平分表。
2、必须要水平分表的话,那么能分表就不要再分库。