zoukankan      html  css  js  c++  java
  • 大数据高并发解决方案--------分区分表分库(一)

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

    分区

    定义:就是把一张表的数据分成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),同时业务系统需要配合数据存储的升级。

       

      

    人生匆匆几十年,BeYourself...
  • 相关阅读:
    Python学习4
    Python学习3
    Python学习2
    表空间
    sqlplus常用设置
    HashMap和LinkedHashMap
    堆栈源码
    观察者模式
    策略模式
    java线性表
  • 原文地址:https://www.cnblogs.com/huagege/p/7478451.html
Copyright © 2011-2022 走看看