大数据高并发解决方案--------分区分表分库(一)

  结合最近研究和工作中用到的,面试中也经常会被问到的大数据做一个系列整理,此为第一篇-------------分区分表分库篇。

分区

定义:就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的。就比如一张表就是一本书。当要在一本书中查找某项内容时,如果不分章节,查找的效率将会下降。而同理,在数据库中就是分区。

目的:提高查询效率

背景1.已经做过sql优化了。2.数据量大 3.不会经常查询所有的表 4.查询数据慢。

代价:使用代价比较小,基本上就是sql按照指定具体情况几个区就可以了。

 

分表

定义:就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。

目的:1.提高查询效率。2.提高I/O性能 3.减少重建索引和锁的数据 

背景:1.已经做过sql优化了。2.数据量大 3.频繁查询或者更新 4.查询数据慢。

代价:代价比较大,最好最业务和架构比较熟悉在具体分割。

分区和分表的区别与联系:

  • 分区和分表的目的都是减少数据库的负担,提高表的增删改查效率。

  • 分区只是一张表中的数据的存储位置发生改变,分表是将一张表分成多张表。
  • 当访问量大,且表数据比较大时,两种方式可以互相配合使用。
  • 当访问量不大,但表数据比较多时,可以只进行分区。

常见分区分表的规则策略:

  1. Range(范围)
  2. Hash(哈希)
  3. 按照时间拆分 比如某一个时间段
  4. 配置模式,例如建立一个DB,这个DB单独保存user_id到DB的映射关系

 

分库

定义:表太多,可以根据模块分为多个数据库。例如:用户,订单,权限等。

目的:1.突破单台机器I/O限制 2.提高数据库的扩展性。

背景1.单台DB的存储空间不够,一般1TB已经是很大的数据库了。  2.随着查询量的增加单台数据库服务器已经没办法支撑

代价:1.分布式事务 2.可能带来数据的延迟性 3.可能有垮库查询

拆分模式:

垂直拆分

将系统中不存在关联关系或者需要join的表可以放在不同的数据库不同的服务器中。

按照业务垂直划分。比如:可以按照业务分为资金、会员、订单三个数据库。

水平拆分

例如,大部分的站点。数据都是和用户有关,那么可以根据用户,将数据按照用户水平拆分。

按照规则划分,一般水平分库是在垂直分库之后的。比如每天处理的订单数量是海量的,可以按照一定的规则水平划分。需要解决的问题:数据路由、组装。

读写分离

对于时效性不高的数据,可以通过读写分离缓解数据库压力。需要解决的问题:在业务上区分哪些业务上是允许一定时间延迟的,以及数据同步问题。

常用的解决方案:

对于不同的方式之间没有严格的界限,特点不同,侧重点不同。需要根据实际情况,结合每种方式的特点来进行处理。

选用第三方的数据库中间件(Atlas,Mycat,TDDL,DRDS),同时业务系统需要配合数据存储的升级。

   

 

  

posted @ 2017-09-05 14:17  关关雎鸠,在广州  阅读(1230)  评论(0编辑  收藏  举报