`
echohfut
  • 浏览: 225055 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

数据库分库分表规则

 
阅读更多

from: http://rdc.taobao.com/team/jm/archives/590

 

一般有几个目标:

1. 数据离散性,数据分布到多个库,多个表中

mod, round robin, dayofweek,dayofMonth

 

2. 避免热点数据在一个数据库库表上

 

3. 扩容时有大的数据迁移

 

以下的解决方案基于 整表搬迁但不会有表中行级数据迁移

 

【水平扩展scale-out方案模式一】

阶段一:一个库DB0之内分4个表,id%4

dbRule: “DB0"

tbRule: “t”  + (id % 4)

阶段二:增加db1库,t2和t3整表搬迁到db1

dbRule: “DB" + ((id%4)/2)

tbRule: “t”  + (id % 4)

阶段三:增加DB2和DB3库,t1整表搬迁到DB2,t3整表搬迁的DB3:

为了规则表达,通过内部名称映射或其他方式,我们将DB1和DB2的名称和位置互换得到下图

dbRule: “DB" + (id%4)

tbRule: “t”  + (id % 4)

 

 

如果更进一步数据库的设计和部署上能做到每个表一个硬盘,那么扩容的过程只要把原有机器的某一块硬盘拔下来,
插入到新的机器上,就完成整表搬迁了!可以大大缩短停机时间。

具体在mysql上可以以库为表。开始一个物理机上启动4个数据库实例,每次倍增机器,直接将库搬迁到新的机器上。
这样从始至终规则都不需要变化,一直都是:

dbRule: “DB” + (id % 4)
tbRule: “t”  + (id % 4)

 

不足是:

即逻辑上始终保持4库4表,每个表一个库。

从一个库到4个库的过程中,单表的数据量一直在增长。当单表的数据量超过一定范围时,可能会带来性能问题。比如索引的问题,历史数据清理的问题。
另外当开始预留的表个数用尽,到了4物理库每库1个表的阶段,再进行扩容的话,不可避免的要从表上下手。

 

 

【水平扩展scale-out方案模式二】

阶段一:一个数据库,两个表

分库规则dbRule: “DB0″
分表规则tbRule: “t” + (id % 2)

阶段二:当单库的数据量接近1千万,单表的数据量接近500万时,进行扩容(数据量只是举例,具体扩容量要根据数据库和实际压力状况决定):
增加一个数据库DB1,将DB0.t1整表迁移到新库DB1。
每个库各增加1个表,未来10M-20M的数据mod2分别写入这2个表:t0_1,t1_1:

分库规则dbRule:

“DB” + (id % 2)

分表规则tbRule:

    if(id < 1千万){
        return "t"+ (id % 2);   //1千万之前的数据,仍然放在t0和t1表。t1表从DB0搬迁到DB1库
    }else if(id < 2千万){
        return "t"+ (id % 2) +"_1"; //1千万之后的数据,各放到两个库的两个表中: t0_1,t1_1
    }else{
        throw new IllegalArgumentException("id outof range[20000000]:" + id);
    }

这样10M以后的新生数据会均匀分布在DB0和DB1; 插入更新和查询热点仍然能够在每个库中均匀分布。
每个库中同时有老数据和不断增长的新数据。每表的数据仍然控制在500万以下。

 

阶段三:当两个库的容量接近上限继续水平扩展时,进行如下操作:
新增加两个库:DB2和DB3. 以id % 4分库。余数0、1、2、3分别对应DB的下标. t0和t1不变,
将DB0.t0_1整表迁移到DB2; 将DB1.t1_1整表迁移到DB3
20M-40M的数据mod4分为4个表:t0_2,t1_2,t2_2,t3_2,分别放到4个库中:

 

分库规则dbRule:

  if(id < 2千万){
      //2千万之前的数据,4个表分别放到4个库
      if(id < 1千万){
          return "db"+  (id % 2);     //原t0表仍在db0, t1表仍在db1
      }else{
          return "db"+ ((id % 2) +2); //原t0_1表从db0搬迁到db2; t1_1表从db1搬迁到db3
      }
  }else if(id < 4千万){
      return "db"+ (id % 4);          //超过2千万的数据,平均分到4个库
  }else{
      throw new IllegalArgumentException("id out of range. id:"+id);
  }

 

分表规则tbRule:

  if(id < 2千万){        //2千万之前的数据,表规则和原先完全一样,参见阶段二
      if(id < 1千万){
          return "t"+ (id % 2);       //1千万之前的数据,仍然放在t0和t1表
      }else{
          return "t"+ (id % 2) +"_1"; //1千万之后的数据,仍然放在t0_1和t1_1表
      }
  }else if(id < 4千万){
      return "t"+ (id % 4)+"_2";      //超过2千万的数据分为4个表t0_2,t1_2,t2_2,t3_2
  }else{
      throw new IllegalArgumentException("id out of range. id:"+id);
  }

 

 

dbRule: “DB” + (id % 4)
tbRule: “t”  + (id % 4)

分享到:
评论

相关推荐

    多数据源+数据库分库分表

    分库分表采用sharding-jdbc 数据库连接池管理是alibaba的druid-spring-boot-starter 项目使用springboot搭建,junit测试,为了方便实现对数据库操作继承了mybatisplus,为了少些get、set 引入lombok

    一个MySQL分库分表php类

    一个MySQL分库分表php类。当一个表数据记录过大时...一般而言,分库分表属于水平分割,按照一定的规则将数据插入到不同的表中去。而分库则可以很方便的转移数据库的压力,比如将一个很大库的分 别放在不同的服务器上。

    Java分库分表实战案例程序

    本资源适用于Java开发者、数据库管理员以及对分库分表技术感兴趣的人群。具备一定的Java编程和数据库知识会更有利于理解和应用该案例。 使用场景及目标: 1. 高并发系统:对于需要处理大量请求的系统,分库分表可以...

    一个MySQL分库分表php类.zip

    分享一个MySQL分库分表php类。...一般而言,分库分表属于水平分割,按照一定的规则将数据插入到不同的表中去。而分库则可以很方便的转移数据库的压力,比如将一个很大库的分 别放在不同的服务器上。

    分库分表带来的完整性和一致性问题

    下面是一个典型的场景假设目前存在三个物理库,现在有一个文件,里面有1W条数据,根据分库的规则,可以把文件里面的数据分到三个库中,现在需要保证这1W条数据要要完整的保存到这三个库里面,并且数据是一致性的,也...

    springboot-04-sharding.7z

    基于springboot框架通过sharding-jdbc实现数据库的读写分离以及分库分表,分库分表规则自定义实现,按照自己项目业务需求

    Mycat数据库中间件技术总结

    mycat数据库中间件、支持分库分表。本文档对数据库的水平拆分配置、环境搭建、分片规则等做了详细描述。

    Mycat数据库中间件技术最佳实践手册-中台

    Mycat是一个开源的高性能的数据库中间件,主要用于数据库的分库分表的操作,解决单库单表数据量过大的性能问题。 主要介绍了Mycat的基本概念、原理特性、开发环境搭建、详细的相关配置、Mycat常用分片规则以及支持的...

    数据库Sharding的基本思想和切分策略

    本文着重介绍sharding的基本思想和理论上的切分策略,关于更加细致的实施策略和参考事例请参考我的另一篇博文:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示  一、基本思想  Sharding的基本思想要...

    shazam:mysql代理和平台

    分库,分表功能 分库:支持mycat分库方式 分表:支持kingshard分表方式 聚合函数:支持max,min,sum,count,group by,order by等 join:支持分片表和分段表的join,支持多个分片表但是路由规则相同的join 安装...

    数据库架构设计.pdf

    数据库分库分表 11.软件集群/硬件集群 12.系统过载保护 13.缓存机制 14.容错能⼒ 15.与其他系统交互 16.分布式处理,数据⼀致性、完整性、及时性 如果系统⽐较简单,数据量、访问量很⼩,那就没必要过多考虑系统架构...

    Tidb简介与应用实践

    这种情况,一般的做法是分库分表,这种方法需要业务层根据规则,物理分库分表,比如按照时间分表,业务代码需要兼容。Tidb是分布式newsql数据库,兼容了大部分mysql协议和操作,业务不需要调整,数据库性能也能保证...

    数据库设计规范.pdf

    数据库设计规范 数据库的重要性不⾔⽽喻。... 存储过程(PROCEDURE)虽然可以简化业务端代码,在传统企业写复杂逻辑时可能会⽤到,⽽在互联⽹企业变更是很频繁的,在分库分 表的情况下要升级⼀个存储过程相当

    MyCat.tar.gz-Delete

    MyCAT是一款由阿里Cobar演变而来的用于支持数据库,读写分离、分表分库的分布式中间件。MyCAT支持Oracle、MSSQL、MYSQL、PG、DB2关系型数据库,同时也支持MongoDB等非关系型数据库。 MyCAT原理MyCAT主要是通过对SQL...

    mycat.tar.gz

    MyCAT是一款由阿里Cobar演变而来的用于支持数据库,读写分离、分表分库的分布式中间件。MyCAT支持Oracle、MSSQL、MYSQL、PG、DB2关系型数据库,同时也支持MongoDB等非关系型数据库。 MyCAT原理MyCAT主要是通过对SQL...

    轻松学会Linux入门教程.txt

    9-MYSQL读写分离8分库分表,让主管刮目相看!.mp4 10-秒杀必备之Redis企业实战,99%的人都不会的技巧!.mp4 11-Redis主从8Cluster集群实战.mp4 12-SHELL编程基础语法入门.mp4 13-SHELL编程京东内部脚本实战.mp4 ...

    MF00639-.NET Core前后端分离快速开发框架.zip

    支持数据库读写分离、分库分表及事务(仅支持单表操作,不支持多表) 全面采用Autofac作为IOC容器,面向接口编程,全面解耦 集成多种工具类库以及操作拓展 数据库:支持SqlServer,PostgreSQL,MySQL,Oracle(框架使用简单...

    javabitset源码-developer-knowledge-map:后端开发人员知识图谱

    分库分表 NoSQL 列式数据库 KV 数据库 文档型数据库 全文搜索引擎 图形数据库 MongoDB ElasticSearch 其他 MariaDB PostgreSQL Oracle MSSQL Cassandra 分布式数据库(TiDB) 缓存 Memcached Redis 网络 TCP、UDP ...

    MyCat的坑如何在分布式中间件DBLE上改善

    近年来,随着移动互联网、物联网、人工智能等技术的兴起,需要处理的数据越来越多,作为存储架构核心的关系型数据库不可避免的引发了需要扩容的问题,在这个过程中分库分表被发明出来。分库分表最初不需要中间件,由...

Global site tag (gtag.js) - Google Analytics