大数据高并发解决方案--------分区分表分库(一)
结合最近研究和工作中用到的,面试中也经常会被问到的大数据做一个系列整理,此为第一篇-------------分区分表分库篇。
分区
定义:就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的。就比如一张表就是一本书。当要在一本书中查找某项内容时,如果不分章节,查找的效率将会下降。而同理,在数据库中就是分区。
目的:提高查询效率。
背景:1.已经做过sql优化了。2.数据量大 3.不会经常查询所有的表 4.查询数据慢。
代价:使用代价比较小,基本上就是sql按照指定具体情况几个区就可以了。
分表
定义:就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。
目的:1.提高查询效率。2.提高I/O性能 3.减少重建索引和锁的数据
背景:1.已经做过sql优化了。2.数据量大 3.频繁查询或者更新 4.查询数据慢。
代价:代价比较大,最好最业务和架构比较熟悉在具体分割。
分区和分表的区别与联系:
-
分区和分表的目的都是减少数据库的负担,提高表的增删改查效率。
- 分区只是一张表中的数据的存储位置发生改变,分表是将一张表分成多张表。
- 当访问量大,且表数据比较大时,两种方式可以互相配合使用。
-
当访问量不大,但表数据比较多时,可以只进行分区。
常见分区分表的规则策略:
- Range(范围)
- Hash(哈希)
- 按照时间拆分 比如某一个时间段
- 配置模式,例如建立一个DB,这个DB单独保存user_id到DB的映射关系
分库
定义:表太多,可以根据模块分为多个数据库。例如:用户,订单,权限等。
目的:1.突破单台机器I/O限制 2.提高数据库的扩展性。
背景:1.单台DB的存储空间不够,一般1TB已经是很大的数据库了。 2.随着查询量的增加单台数据库服务器已经没办法支撑
代价:1.分布式事务 2.可能带来数据的延迟性 3.可能有垮库查询
拆分模式:
垂直拆分
将系统中不存在关联关系或者需要join的表可以放在不同的数据库不同的服务器中。
按照业务垂直划分。比如:可以按照业务分为资金、会员、订单三个数据库。
水平拆分
例如,大部分的站点。数据都是和用户有关,那么可以根据用户,将数据按照用户水平拆分。
按照规则划分,一般水平分库是在垂直分库之后的。比如每天处理的订单数量是海量的,可以按照一定的规则水平划分。需要解决的问题:数据路由、组装。
读写分离
对于时效性不高的数据,可以通过读写分离缓解数据库压力。需要解决的问题:在业务上区分哪些业务上是允许一定时间延迟的,以及数据同步问题。
常用的解决方案:
对于不同的方式之间没有严格的界限,特点不同,侧重点不同。需要根据实际情况,结合每种方式的特点来进行处理。
选用第三方的数据库中间件(Atlas,Mycat,TDDL,DRDS),同时业务系统需要配合数据存储的升级。